HDFS提供了一些与客户端进行交互的一系列java API,这里主要说其中的三个。
一、HDFS的读操作
可以通过下面的代码打开一个文件的输入流:
- String uri = "hdfs://yarn:8080/user/home/data.txt";
- Configuration conf = new Configuration();
- FileSystem fs = FileSystem.get(URI.create(uri), conf);
- InputStream in = null;
- try{
- in = fs.open(new Path(uri));
- Scanner sc = new Scanner(in);
- String s = sc.next;
- ......
- in.close();
- catch (Exception e){
- e.printStackTrace();
- }
fs.open打开了一个字节流,实际上fs.open返回的是一个FSDataInputStream对象,这是hadoop框架下实现的对InputStream的一个封装。对于输入流的处理,可以直接用FSDataInputStream也可以用他的父类InputStream,再用我们熟悉的Scanner对字节流进行封装。P.S. try段一定要加上,否则编译不通过。
二、HDFS的写操作
写操作通过下面的代码打开一个文件的写输出流:
- String uri = "hdfs://yarn:8080/user/home/output.txt
- Configuration conf = new Configuration();
- FSDataOutputStream os;
- FileSystem fs;
- String s = "Hello World!";
- try{
- fs = FileSystem.get(URI.create(uri), conf);
- os = fs.create(new Path(uriDst));
- os.writeBytes(s);
- ......
- os.close();
- catch(Exception e){
- e.printStackTrace();
- }
可以看到HDFS的输入输出流都是通过FileSystem来实现的,这是Hadoop定义的一个虚拟文件系统,不是很了解。
三、删除数据
再简单介绍一个API,delete函数,用来删除文件或文件夹。我的算法里有一个迭代的过程,会不断新创建Job任务,Job会检测如果输出路径存在则抛出异常,所以这里需要将已有的输出文件夹进行删除。具体代码如下:
- FileSystem fs;
- Configuration conf = new Configuration();
- String uriOutput = "hdfs://yarn:8080/user/home/outputAE";
- fs = FileSystem.get(URI.create(uriOutput), conf);
- fs.delete(new Path(uriOutput), true);
-----------------------------------------------------------------------------------------------------------------------
参考资料
书籍:《Hadoop实战》
本文系原创,如有转载或引用请附上本文链接,谢谢。