设为首页 加入收藏

TOP

HDFS文件操作
2018-12-12 00:19:43 】 浏览:78
Tags:HDFS 文件 操作

转自:使用java api操作HDFS文件,保存在此以学习。

全部程序如下:

  1. importjava.io.IOException;
  2. importjava.net.URI;
  3. importjava.net.URISyntaxException;
  4. importorg.apache.hadoop.conf.Configuration;
  5. importorg.apache.hadoop.fs.FSDataInputStream;
  6. importorg.apache.hadoop.fs.FSDataOutputStream;
  7. importorg.apache.hadoop.fs.FileStatus;
  8. importorg.apache.hadoop.fs.FileSystem;
  9. importorg.apache.hadoop.fs.FileUtil;
  10. importorg.apache.hadoop.fs.Path;
  11. importorg.apache.hadoop.io.IOUtils;
  12. publicclassHDFSTest{
  13. //在指定位置新建一个文件,并写入字符
  14. publicstaticvoidWriteToHDFS(Stringfile,Stringwords)throwsIOException,URISyntaxException
  15. {
  16. Configurationconf=newConfiguration();
  17. FileSystemfs=FileSystem.get(URI.create(file),conf);
  18. Pathpath=newPath(file);
  19. FSDataOutputStreamout=fs.create(path);//创建文件
  20. //两个方法都用于文件写入,好像一般多使用后者
  21. out.writeBytes(words);
  22. out.write(words.getBytes("UTF-8"));
  23. out.close();
  24. //如果是要从输入流中写入,或是从一个文件写到另一个文件(此时用输入流打开已有内容的文件)
  25. //可以使用如下IOUtils.copyBytes方法。
  26. //FSDataInputStreamin=fs.open(newPath(args[0]));
  27. //IOUtils.copyBytes(in,out,4096,true)//4096为一次复制块大小,true表示复制完成后关闭流
  28. }
  29. publicstaticvoidReadFromHDFS(Stringfile)throwsIOException
  30. {
  31. Configurationconf=newConfiguration();
  32. FileSystemfs=FileSystem.get(URI.create(file),conf);
  33. Pathpath=newPath(file);
  34. FSDataInputStreamin=fs.open(path);
  35. IOUtils.copyBytes(in,System.out,4096,true);
  36. //使用FSDataInoutStream的read方法会将文件内容读取到字节流中并返回
  37. /**
  38. *FileStatusstat=fs.getFileStatus(path);
  39. //createthebuffer
  40. byte[]buffer=newbyte[Integer.parseInt(String.valueOf(stat.getLen()))];
  41. is.readFully(0,buffer);
  42. is.close();
  43. fs.close();
  44. returnbuffer;
  45. */
  46. }
  47. publicstaticvoidDeleteHDFSFile(Stringfile)throwsIOException
  48. {
  49. Configurationconf=newConfiguration();
  50. FileSystemfs=FileSystem.get(URI.create(file),conf);
  51. Pathpath=newPath(file);
  52. //查看fs的deleteAPI可以看到三个方法。deleteonExit实在退出JVM时删除,下面的方法是在指定为目录是递归删除
  53. fs.delete(path,true);
  54. fs.close();
  55. }
  56. publicstaticvoidUploadLocalFileHDFS(Stringsrc,Stringdst)throwsIOException
  57. {
  58. Configurationconf=newConfiguration();
  59. FileSystemfs=FileSystem.get(URI.create(dst),conf);
  60. PathpathDst=newPath(dst);
  61. PathpathSrc=newPath(src);
  62. fs.copyFromLocalFile(pathSrc,pathDst);
  63. fs.close();
  64. }
  65. publicstaticvoidListDirAll(StringDirFile)throwsIOException
  66. {
  67. Configurationconf=newConfiguration();
  68. FileSystemfs=FileSystem.get(URI.create(DirFile),conf);
  69. Pathpath=newPath(DirFile);
  70. FileStatus[]status=fs.listStatus(path);
  71. //方法1
  72. for(FileStatusf:status)
  73. {
  74. System.out.println(f.getPath().toString());
  75. }
  76. //方法2
  77. Path[]listedPaths=FileUtil.stat2Paths(status);
  78. for(Pathp:listedPaths){
  79. System.out.println(p.toString());
  80. }
  81. }
  82. publicstaticvoidmain(String[]args)throwsIOException,URISyntaxException
  83. {
  84. //下面做的是显示目录下所有文件
  85. ListDirAll("hdfs://ubuntu:9000/user/kqiao");
  86. StringfileWrite="hdfs://ubuntu:9000/user/kqiao/test/FileWrite";
  87. Stringwords="Thiswordsistowriteintofile!\n";
  88. WriteToHDFS(fileWrite,words);
  89. //这里我们读取fileWrite的内容并显示在终端
  90. ReadFromHDFS(fileWrite);
  91. //这里删除上面的fileWrite文件
  92. DeleteHDFSFile(fileWrite);
  93. //假设本地有一个uploadFile,这里上传该文件到HDFS
  94. //StringLocalFile="file:///home/kqiao/hadoop/MyHadoopCodes/uploadFile";
  95. //UploadLocalFileHDFS(LocalFile,fileWrite);
  96. }
  97. }


FSDataOutputStream os = hdfs.create(new Path(args[0]));

注意:在os.flush() 刷新数据流;

有时写入的文件不能立即被其他读者看见,只有大于一个块时其他读者才能看见第一个块,但还是不能看见当前块。可以使用out.sync() 强制所有缓存与数据节点同步。其实在每一个os.close()中隐含了一个sync()的调用

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java hadoop   hdfs 上写文.. 下一篇HDFS的读写限流方案

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目