当前位置:   article > 正文

Hadoop学习总结(使用Java API操作HDFS)_hdfs文件系统 java api操作

hdfs文件系统 java api操作

      使用Java API操作HDFS,是在安装和配置Maven、IDEA中配置Maven成功情况下进行的,如果Maven安装和配置不完全将不能进行Java API操作HDFS。

      由于Hadoop是使用Java语言编写的,因此可以使用Java API操作Hadoop文件系统。使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增、删、改、查)。

      可以使用单元测试法操作HDFS。这里不使用单元测试法。

一、创建HDFS_CRUD.java文件

二、初始化客户端对象

      通过 main() 方法调用进行HDFS增、删、改、查

  1. public class HDFS_CRUD {
  2. public static void main(String[] args) throws IOException {
  3. // 初始化客户端对象
  4. //构造一个配置对象,设置一个参数:访问的 HDFS 的 URL
  5. Configuration conf = new Configuration();
  6. //这里指定使用的是 HDFS
  7. conf.set("fs.defaultFS", "hdfs://hadoop00:9000");
  8. //通过如下的方式进行客户端身份的设置
  9. System.setProperty("HADOOP_USER_NAME", "root");
  10. //通过 FileSystem 的静态方法获取文件系统客户端对象
  11. fs = FileSystem.get(conf); //抛出异常
  12. System.out.println("hdfs连接成功");
  13. }
  14. }

三、本地上传文件到HDFS

static FileSystem fs = null;

      声明了一个静态的FileSystem对象fs,并将其初始化为null。FileSystem是Java中用于操作Hadoop分布式文件系统(HDFS)的类。通过这个对象,可以执行一些与HDFS相关的操作,如创建文件、删除文件、读取文件等。在这段代码中,fs被声明为静态的,意味着它可以在整个类中被共享和访问。初始值为null,可能是因为在代码的其他部分会对其进行初始化。

      下面对上传功能进行编译

  1. // 完成上传功能
  2. public static void upload(String path_str,String path_str1) throws IOException {
  3. //上传文件到HDFS
  4. //path_str本地文件路径 path_str1是上传到HDFS文件路径
  5. fs.copyFromLocalFile(new Path(path_str),new Path(path_str1));
  6. // 关闭资源
  7. fs.close();
  8. System.out.println("文件上传成功");
  9. }
  1. //main()方法中调用
  2. upload("D:/大数据/word.txt","/input"); //上传

四、从HDFS下载文件到本地

  1. // 完成下载文件
  2. public static void downloal(String path_str,String path_str1) throws IOException {
  3. //从 HDFS 下载文件到本地
  4. //path_str是HDFS文件路径 path_str1本地文件路径
  5. fs.copyToLocalFile(new Path(path_str),new Path(path_str1));
  6. // 关闭资源
  7. fs.close();
  8. System.out.println("文件下载成功");
  9. }
  1. //main()方法中调用
  2. downloal("/data.txt","D:/大数据/文件"); //下载

五、创建目录

  1. // 创建目录
  2. public static void mkdir(String path_str) throws IOException {
  3. //path_str所要创建目录路径
  4. fs.mkdirs(new Path(path_str));
  5. // 关闭资源
  6. fs.close();
  7. System.out.println("创建目录成功");
  8. }
  1. //main()方法中调用
  2. mkdir("/input"); //创建目录

六、重命名文件或文件夹

  1. // 重命名文件夹
  2. public static void rename(String old_name,String new_path) throws IOException {
  3. //old_name原文件名路径 //new_path新文件名路径
  4. fs.rename(new Path(old_name),new Path(new_path));
  5. fs.close();
  6. System.out.println("重命名文件夹成功");
  7. }
  1. //main()方法中调用
  2. rename("/aa","/aa2"); //重命名文件夹

七、删除文件

  1. // 删除文件 ,如果是非空文件夹,参数2必须给值true
  2. public static void delete(String path_str) throws IOException {
  3. //ture表示递归删除 可以用来删除目录 rm -rf
  4. //false表示非递归删除
  5. fs.delete(new Path(path_str),true);
  6. // 关闭资源
  7. fs.close();
  8. System.out.println("删除文件夹成功");
  9. }
  1. //main()方法中调用
  2. delete("/aa2"); //删除文件

八、查看文件信息

1、查看文件信息

  1. // 查看文件信息
  2. public static void listFiles(String path_str) throws IOException {
  3. //获取迭代器对象
  4. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  5. //遍历
  6. while (listFiles.hasNext()){
  7. LocatedFileStatus fileStatus = listFiles.next();
  8. //打印当前文件名
  9. System.out.println(fileStatus.getPath().getName());
  10. //打印当前文件块大小
  11. System.out.println(fileStatus.getBlockLocations());
  12. //打印当前文件权限
  13. System.out.println(fileStatus.getPermission());
  14. //打印当前文件内容长度
  15. System.out.println(fileStatus.getLen());
  16. //获取该文件块信息(包含长度、数据块、datanode的信息)
  17. // BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  18. // for (BlockLocation bl : blockLocations){
  19. // System.out.println("block-length:" + bl.getLength()+"--"+"block-offset:"+bl.getOffset());
  20. // String[] hosts = bl.getHosts();
  21. // for (String host : hosts){
  22. // System.out.println(host);
  23. // }
  24. // }
  25. }
  26. System.out.println("--------分割线---------");
  27. fs.close();
  28. }
  1. //main()方法中调用
  2. listFiles("/data.txt"); //查看文件信息

2、统计目录下所有文件(包括子目录)

  1. // 1、统计目录下所有文件(包括子目录)
  2. // 1、统计某个路径(由main方法决定哪个路径),下所有的文件数里,例如:输出:该路径下共有 3 个文件
  3. public static void count(String path_str) throws IOException {
  4. //获取迭代器对象
  5. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  6. //遍历
  7. int count = 0;
  8. while (listFiles.hasNext()) {
  9. LocatedFileStatus fileStatus = listFiles.next();
  10. count++;
  11. }
  12. System.out.println("路径:【"+ path_str +"】下,文件数量为"+count);
  13. fs.close();
  14. }
  1. //main()方法中调用
  2. count("/"); //统计

 3、列出某个路径下所有的文件数里

  1. // 2、列出某个路径(由main方法决定哪个路径),下所有的文件数里,例如:文件1,文"路径:【"+ path_str +"】下,文件有:"+件2,....
  2. public static void fileList(String path_str) throws IOException {
  3. //获取迭代器对象
  4. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  5. String res = "";
  6. //遍历
  7. while (listFiles.hasNext()) {
  8. LocatedFileStatus fileStatus = listFiles.next();
  9. res += fileStatus.getPath().getName() + ", ";
  10. }
  11. if (res.equals("")){
  12. res = "没有文件";
  13. }else {
  14. res = res.substring(0,res.length() - 2);
  15. }
  16. System.out.println("路径:【"+ path_str +"】下的文件:" + res);
  17. // fs.close();
  18. }
  1. //main()方法中调用
  2. fileList("/"); //查看有什么文件
  3. fileList("/input"); //查看有什么文件

4、查看所有文件

  1. /* 路径【/】下共有 7 子文件
  2. 文件数量:1,文件列表:data.txt
  3. 目录数量:6,文件列表:a, exp, input, output, test, tmp*/
  4. public static void list(String path) throws IOException {
  5. FileStatus[] fileStatuses = fs.listStatus(new Path(path));
  6. String res = "路径【" + path + "】下共有 " + fileStatuses.length + " 子文件";
  7. int file_num = 0;
  8. String file_list = "";
  9. int dir_num = 0;
  10. String dir_list = "";
  11. for (FileStatus fileStatus:fileStatuses){
  12. if (fileStatus.isFile()){
  13. file_num ++;
  14. file_list += fileStatus.getPath().getName() + ", ";
  15. }else {
  16. dir_num ++;
  17. dir_list += fileStatus.getPath().getName() + ", ";
  18. }
  19. }
  20. if (file_num != 0) res += "\n\t文件数量:" + file_num + ",文件列表:" + file_list.substring(0,file_list.length()-2);
  21. if (dir_num != 0) res += "\n\t目录数量:" + dir_num + ",文件列表:" + dir_list.substring(0,dir_list.length()-2);
  22. System.out.println(res);
  23. }
  1. //main()方法中调用
  2. list("/"); //查看所有

5、判断是文件还是目录

  1. // 检查路径是目录还是文件
  2. public static void mulu(String path_str) throws IOException {
  3. Path path = new Path(path_str);
  4. // 判断路径是否存在
  5. if (fs.exists(path)) {
  6. // 获取指定路径的详细信息
  7. FileStatus status = fs.getFileStatus(path);
  8. if (status.isDirectory()) {
  9. System.out.println(path + "这是一个目录");
  10. } else if (status.isFile()) {
  11. System.out.println(path + "这是一个文件");
  12. } else {
  13. System.out.println("这是一个未知类型");
  14. }
  15. } else {
  16. System.out.println("路径不存在");
  17. }
  18. //关闭资源
  19. fs.close();
  20. }
  1. //main()方法中调用
  2. mulu("/exp/word.txt"); //检查路径是目录还是文件

九、源代码

  1. package com.itcast.hdfsdemo;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.*;
  4. import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
  5. import sun.tracing.dtrace.DTraceProviderFactory;
  6. import java.io.IOException;
  7. import java.util.Arrays;
  8. public class HDFS_CRUD {
  9. static FileSystem fs = null;
  10. // 完成上传功能
  11. public static void upload(String path_str,String path_str1) throws IOException {
  12. //上传文件到HDFS
  13. //path_str本地文件路径 path_str1是上传到HDFS文件路径
  14. fs.copyFromLocalFile(new Path(path_str),new Path(path_str1));
  15. // 关闭资源
  16. fs.close();
  17. System.out.println("文件上传成功");
  18. }
  19. // 完成下载文件
  20. public static void downloal(String path_str,String path_str1) throws IOException {
  21. //从 HDFS 下载文件到本地
  22. //path_str是HDFS文件路径 path_str1本地文件路径
  23. fs.copyToLocalFile(new Path(path_str),new Path(path_str1));
  24. // 关闭资源
  25. fs.close();
  26. System.out.println("文件下载成功");
  27. }
  28. // 创建目录
  29. public static void mkdir(String path_str) throws IOException {
  30. //path_str所要创建目录路径
  31. fs.mkdirs(new Path(path_str));
  32. // 关闭资源
  33. fs.close();
  34. System.out.println("创建目录成功");
  35. }
  36. // 重命名文件夹
  37. public static void rename(String old_name,String new_path) throws IOException {
  38. //old_name原文件名路径 //new_path新文件名路径
  39. fs.rename(new Path(old_name),new Path(new_path));
  40. // 关闭资源
  41. fs.close();
  42. System.out.println("重命名文件夹成功");
  43. }
  44. //main()方法中调用
  45. // rename("/aa","/aa2"); //重命名文件夹
  46. // 删除文件 ,如果是非空文件夹,参数2必须给值true
  47. public static void delete(String path_str) throws IOException {
  48. //ture表示递归删除 可以用来删除目录 rm -rf
  49. //false表示非递归删除
  50. fs.delete(new Path(path_str),true);
  51. // 关闭资源
  52. fs.close();
  53. System.out.println("删除文件夹成功");
  54. }
  55. // 查看文件信息
  56. public static void listFiles(String path_str) throws IOException {
  57. //获取迭代器对象
  58. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  59. //遍历
  60. while (listFiles.hasNext()){
  61. LocatedFileStatus fileStatus = listFiles.next();
  62. //打印当前文件名
  63. System.out.println(fileStatus.getPath().getName());
  64. //打印当前文件块大小
  65. System.out.println(fileStatus.getBlockLocations());
  66. //打印当前文件权限
  67. System.out.println(fileStatus.getPermission());
  68. //打印当前文件内容长度
  69. System.out.println(fileStatus.getLen());
  70. //获取该文件块信息(包含长度、数据块、datanode的信息)
  71. // BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  72. // for (BlockLocation bl : blockLocations){
  73. // System.out.println("block-length:" + bl.getLength()+"--"+"block-offset:"+bl.getOffset());
  74. // String[] hosts = bl.getHosts();
  75. // for (String host : hosts){
  76. // System.out.println(host);
  77. // }
  78. // }
  79. }
  80. System.out.println("--------分割线---------");
  81. fs.close();
  82. }
  83. //把查看文件信息分解为下面几个方法
  84. // 1、统计目录下所有文件(包括子目录)
  85. // 1、统计某个路径(由main方法决定哪个路径),下所有的文件数里,例如:输出:该路径下共有 3 个文件
  86. public static void count(String path_str) throws IOException {
  87. //获取迭代器对象
  88. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  89. //遍历
  90. int count = 0;
  91. while (listFiles.hasNext()) {
  92. LocatedFileStatus fileStatus = listFiles.next();
  93. count++;
  94. }
  95. System.out.println("路径:【"+ path_str +"】下,文件数量为"+count);
  96. fs.close();
  97. }
  98. // 2、列出某个路径(由main方法决定哪个路径),下所有的文件数里,例如:文件1,文"路径:【"+ path_str +"】下,文件有:"+件2,....
  99. public static void fileList(String path_str) throws IOException {
  100. //获取迭代器对象
  101. RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
  102. String res = "";
  103. //遍历
  104. while (listFiles.hasNext()) {
  105. LocatedFileStatus fileStatus = listFiles.next();
  106. res += fileStatus.getPath().getName() + ", ";
  107. }
  108. if (res.equals("")){
  109. res = "没有文件";
  110. }else {
  111. res = res.substring(0,res.length() - 2);
  112. }
  113. System.out.println("路径:【"+ path_str +"】下的文件:" + res);
  114. // fs.close();
  115. }
  116. /* 路径【/】下共有 7 子文件
  117. 文件数量:1,文件列表:data.txt
  118. 目录数量:6,文件列表:a, exp, input, output, test, tmp*/
  119. public static void list(String path) throws IOException {
  120. FileStatus[] fileStatuses = fs.listStatus(new Path(path));
  121. String res = "路径【" + path + "】下共有 " + fileStatuses.length + " 子文件";
  122. int file_num = 0;
  123. String file_list = "";
  124. int dir_num = 0;
  125. String dir_list = "";
  126. for (FileStatus fileStatus:fileStatuses){
  127. if (fileStatus.isFile()){
  128. file_num ++;
  129. file_list += fileStatus.getPath().getName() + ", ";
  130. }else {
  131. dir_num ++;
  132. dir_list += fileStatus.getPath().getName() + ", ";
  133. }
  134. }
  135. if (file_num != 0) res += "\n\t文件数量:" + file_num + ",文件列表:" + file_list.substring(0,file_list.length()-2);
  136. if (dir_num != 0) res += "\n\t目录数量:" + dir_num + ",文件列表:" + dir_list.substring(0,dir_list.length()-2);
  137. System.out.println(res);
  138. }
  139. // 检查路径是目录还是文件
  140. public static void mulu(String path_str) throws IOException {
  141. Path path = new Path(path_str);
  142. // 判断路径是否存在
  143. if (fs.exists(path)) {
  144. // 获取指定路径的详细信息
  145. FileStatus status = fs.getFileStatus(path);
  146. if (status.isDirectory()) {
  147. System.out.println(path + "这是一个目录");
  148. } else if (status.isFile()) {
  149. System.out.println(path + "这是一个文件");
  150. } else {
  151. System.out.println("这是一个未知类型");
  152. }
  153. } else {
  154. System.out.println("路径不存在");
  155. }
  156. //关闭资源
  157. fs.close();
  158. }
  159. //调用
  160. public static void main(String[] args) throws IOException {
  161. // 初始化客户端对象
  162. //构造一个配置对象,设置一个参数:访问的 HDFS 的 URL
  163. Configuration conf = new Configuration();
  164. //这里指定使用的是 HDFS
  165. conf.set("fs.defaultFS","hdfs://hadoop00:9000");
  166. //通过如下的方式进行客户端身份的设置
  167. System.setProperty("HADOOP_USER_NAME","root");
  168. //通过 FileSystem 的静态方法获取文件系统客户端对象
  169. fs = FileSystem.get(conf); //抛出异常
  170. System.out.println("hdfs连接成功");
  171. //main()方法中调用
  172. // list("/"); //查看所有
  173. //main()方法中调用
  174. // fileList("/"); //查看有什么文件
  175. // fileList("/input"); //查看有什么文件
  176. //main()方法中调用
  177. // count("/"); //统计
  178. //main()方法中调用
  179. // mulu("/exp/word.txt"); //检查路径是目录还是文件
  180. //main()方法中调用
  181. // listFiles("/data.txt"); //查看文件信息
  182. //main()方法中调用
  183. // delete("/aa2"); //删除文件
  184. //main()方法中调用
  185. // rename("/aa","/aa2"); //重命名文件夹
  186. //main()方法中调用
  187. // upload("D:/大数据/word.txt","/input"); //上传
  188. //main()方法中调用
  189. // mkdir("/input"); //创建目录
  190. //main()方法中调用
  191. // downloal("/data.txt","D:/大数据/文件"); //下载
  192. }
  193. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/480487
推荐阅读
相关标签
  

闽ICP备14008679号