HDFS的javaAPI

HDFS提供了一些与客户端进行交互的一系列java API,这里主要说其中的三个。

一、HDFS的读操作

可以通过下面的代码打开一个文件的输入流:

  1. String uri = "hdfs://yarn:8080/user/home/data.txt";
  2. Configuration conf = new Configuration();
  3. FileSystem fs = FileSystem.get(URI.create(uri), conf);
  4. InputStream in = null;
  5. try{
  6. in = fs.open(new Path(uri));
  7. Scanner sc = new Scanner(in);
  8. String s = sc.next;
  9. ......
  10. in.close();
  11. catch (Exception e){
  12. e.printStackTrace();


fs.open打开了一个字节流,实际上fs.open返回的是一个FSDataInputStream对象,这是hadoop框架下实现的对InputStream的一个封装。对于输入流的处理,可以直接用FSDataInputStream也可以用他的父类InputStream,再用我们熟悉的Scanner对字节流进行封装。P.S. try段一定要加上,否则编译不通过。

二、HDFS的写操作

写操作通过下面的代码打开一个文件的写输出流:

  1. String uri = "hdfs://yarn:8080/user/home/output.txt
  2. Configuration conf = new Configuration();
  3. FSDataOutputStream os;
  4. FileSystem fs;
  5. String s = "Hello World!";
  6. try{
  7. fs = FileSystem.get(URI.create(uri), conf);
  8. os = fs.create(new Path(uriDst));
  9. os.writeBytes(s);
  10. ......
  11. os.close();
  12. catch(Exception e){
  13. e.printStackTrace();
  14. }
通过create函数创建了一个写输出流,然后通过FSDataOutputStream提供的一些方法就可以进行写操作了,查阅Hadoop API对这些方法可以进一步了解。P.S. FSDataOutputStream有writeBytes和writeChars两个函数,他们的功能都是向输出流中写String类型数据,不同的地方是前者是正常写入,后者会在字符与字符之间加入一个标识(可能是空格,查看的时候是乱码),也就是说写出来的String的长度是原来的两倍!我的算法里要向文件里写入double类型变量,但是存成的是String类型,结果因为这个错误纠结了好长时间,也不知道这个函数有什么用。。。。。

可以看到HDFS的输入输出流都是通过FileSystem来实现的,这是Hadoop定义的一个虚拟文件系统,不是很了解。

三、删除数据

再简单介绍一个API,delete函数,用来删除文件或文件夹。我的算法里有一个迭代的过程,会不断新创建Job任务,Job会检测如果输出路径存在则抛出异常,所以这里需要将已有的输出文件夹进行删除。具体代码如下:

  1. FileSystem fs;
  2. Configuration conf = new Configuration();
  3. String uriOutput = "hdfs://yarn:8080/user/home/outputAE";
  4. fs = FileSystem.get(URI.create(uriOutput), conf);
  5. fs.delete(new Path(uriOutput), true);


-----------------------------------------------------------------------------------------------------------------------

参考资料
书籍:《Hadoop实战》

本文系原创,如有转载或引用请附上本文链接,谢谢。

你可能感兴趣的:(hadoop,hadoop,hdfs,mapreduce,java,java,API)