(003)通过API操作HDFS,读取数据
研读HADOOP权威指南,从而得知,从Java接口中,可以根据hadoop url读取数据,并且也可以根据filesystem API 读取数据。
一.我们根据hadoop url 读取数据。
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; public class UrlCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws Exception { InputStream ins = null; try { ins = new URL("hdfs://192.168.1.1:9000/user/word.txt").openStream(); IOUtils.copyBytes(ins, System.out, 1024, false); } finally { IOUtils.closeStream(ins); } } }
请copy代码的兄弟,适当的更改里面URL参数。其实根据URL.openStream得到InputStram流, 然后我们可以调用IOUtils类,并且在finally子句中关闭数据流,同时也可以在输入流和输出流中间复制数据(OutPutStream (System.out)),这样我们就在控制台上打印数据了。
二.根据FileSystem API读取数据
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; public class HDFSUtilTest { @Test public void readHDFS() throws Exception { Configuration conn = new Configuration(); conn.set("fs.defaultFS","hdfs://192.168.1.1:9000"); FileSystem fs = FileSystem.get(conn); FSDataInputStream fis = fs.open(new Path("/user/word.txt")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); IOUtils.copyBytes(fis, baos, 1024); fis.close(); System.out.println(new String(baos.toByteArray())); }
首先强调一点,此文中Path导入的包import org.apache.hadoop.fs.Path ,而不是我们常规理解的Java.io,文件系统通过Hadoop Path对象来代表文件,我们可以将路径看作是hadoop文件系统的URL。FileSystem是一个通用的文件系统API,我们根据静态工厂方法获取实例,所以有FileSystem fs = FileSystem.get(conn);但是里面有一个参数 conn,这个参数Configuration对象,此对象封装了客户端或者服务器的配置,通过设置配置文件读取类路径来实现,剩下的又是输入流和输出流的事情。