当前位置:   article > 正文

使用javaAPI对HDFS进行文件上传,下载,新建文件及文件夹删除,遍历所有文件_hadoop 遍历hdfs指定文件夹

hadoop 遍历hdfs指定文件夹

目录

//通过工具类来操作hdfs   hdfs dfs -put d:user_info.txt  /user_info.txt 

// 将文件放入到hdfs中

  1. @Test
  2. public void test1() throws IOException { // 构建方法的时候,不要加 static 加了之后@Test就不能用了
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs hdfs dfs -put d:user_info.txt /user_info.txt
  11. // 将文件放入到hdfs中
  12. fileSystem.copyFromLocalFile(new Path("d:\\user_info.txt"),new Path("/"));
  13. // Permission denied: 看到这个就一定要想到权限问题
  14. // hdfs dfs -chmod -R 777 /
  15. /*
  16. 运行结果中有如下的信息,可以忽略
  17. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
  18. SLF4J: Defaulting to no-operation (NOP) logger implementation
  19. SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
  20. */
  21. //关闭hdfs的连接工具
  22. if (fileSystem != null) {
  23. fileSystem.close();
  24. }

 2.通过工具类来操作hdfs   hdfs dfs -get hdfs路径   本地路经  将文件放入到本地Windows中

  1. @Test
  2. public void test2() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs hdfs dfs -get hdfs路径 本地路径
  11. // 将文件放入到本地Windows中(或者说,你的代码运行在哪里,你的本地就是哪里)
  12. fileSystem.copyToLocalFile(new Path("/user_info.txt"),new Path("D:\\BD2209太湖"));
  13. // 关闭操作工具类
  14. fileSystem.close();
  15. }

3.通过工具类来操作hdfs   hdfs dfs -mkdir -p  hdfs路径

  1. @Test
  2. public void test3() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs hdfs dfs -mkdir -p hdfs路径
  11. boolean mkdir_flag = fileSystem.mkdirs(new Path("/dir_from_java/dir1/dir2"));
  12. System.out.println(mkdir_flag);
  13. // 关闭操作工具类
  14. fileSystem.close();
  15. }

4.通过工具类来操作hdfs  查看一个文件是否存在

  1. @Test
  2. public void test4() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs 查看一个文件是否存在
  11. boolean exists = fileSystem.exists(new Path("/suibian"));
  12. System.out.println(exists);
  13. boolean exists1 = fileSystem.exists(new Path("/test1"));
  14. System.out.println(exists1);
  15. // 关闭操作工具类
  16. fileSystem.close();
  17. }

5.删除一个hdfs中的文件

  1. @Test
  2. public void test5() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs hdfs dfs -rm hdfs绝对路径
  11. // 删除一个hdfs中的文件
  12. // delete 方法自带 -r 参数,也就是直接调用的时候,就会递归删除
  13. // 如果想要避免直接递归删除,可以使用第二个参数, false 来进行控制
  14. boolean delete = fileSystem.delete(new Path("/test"),false);
  15. System.out.println(delete);
  16. // 关闭操作工具类
  17. fileSystem.close();
  18. }

6.查看某一个路径下的所有文件以及文件夹

  1. @Test
  2. public void test6() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs hdfs dfs -ls hdfs绝对路径
  11. // 查看某一个路径下的所有文件以及文件夹
  12. // listStatus 返回值是一个对象数组,那么为什么要返回一个对象数组呢?直接给一个String 数组不就行了吗?
  13. // 对象中可以拥有属性和方法,一个对象里面可以存储大量的信息
  14. FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
  15. for (FileStatus fileStatus : fileStatuses) {
  16. System.out.println(fileStatus.getPath());
  17. System.out.println("是不是一个文件夹:"+fileStatus.isDirectory());
  18. System.out.println("文件大小是:"+fileStatus.getLen());
  19. System.out.println("副本数:"+fileStatus.getReplication());
  20. System.out.println("------------------");
  21. }
  22. // 关闭操作工具类
  23. fileSystem.close();
  24. }

7.通过工具类来操作hdfs  查看关于数据块的信息

  1. @Test
  2. public void test7() throws IOException {
  3. //操作hdfs
  4. //1. 初始化配置对象 需要new出来
  5. Configuration conf = new Configuration();
  6. //2. 添加配置 (其实就是提供一个key - value)
  7. conf.set("fs.defaultFS","hdfs://hadoop10:8020");
  8. //3. 构建操作hdfs的具体工具类
  9. FileSystem fileSystem = FileSystem.get(conf);
  10. //通过工具类来操作hdfs 查看关于数据块的信息
  11. // 文件本身对于 hdfs来说,是一个逻辑上的概念
  12. // listFiles 方法可以返回一个存放对象的迭代器,这个对象中有 数据块的信息
  13. // 查看一个迭代器中的内容时,使用while循环,while循环的刹车踏板:hasNext()
  14. // hasNext()返回的值是false的时候,就算是读完了迭代器,返回true的时候,就是还有下一个元素需要读取
  15. RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
  16. while (iterator.hasNext()){
  17. LocatedFileStatus fileStatus = iterator.next();
  18. System.out.println(fileStatus.getLen());
  19. System.out.println(fileStatus.getPath());
  20. BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  21. // 这个循环会循环几次,是根据一个文件被拆成了多少个块决定的
  22. for (BlockLocation blockLocation : blockLocations) {
  23. String[] hosts = blockLocation.getHosts();
  24. String strHosts = Arrays.toString(hosts);
  25. String names = Arrays.toString(blockLocation.getNames());
  26. long offset = blockLocation.getOffset();
  27. long length = blockLocation.getLength();
  28. System.out.println("所在的DataNode是:"+names+" 所在主机:"+strHosts+" 偏移量是:"+offset+" 块的大小是:"+length);
  29. }
  30. System.out.println("--------------");
  31. }
  32. // 关闭操作工具类
  33. fileSystem.close();
  34. }

8.查看所有文件

  1. @Test
  2. public void test3() throws IOException {
  3. Configuration conf = new Configuration();
  4. conf.set("fs.defaultFS", "hdfs://hadoop10:8020");
  5. FileSystem fileSystem = FileSystem.get(conf);
  6. //2:调用方法listFiles 获取 /目录下所有的文件信息,,参数true代表递归遍历
  7. RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
  8. //3:遍历迭代器
  9. while (iterator.hasNext()){
  10. LocatedFileStatus fileStatus = iterator.next();
  11. //getPath()方法就是获取绝对路径
  12. System.out.println(fileStatus.getPath() + "----" +fileStatus.getPath().getName());
  13. //文件的block信息
  14. BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  15. for (BlockLocation blockLocation : blockLocations) {
  16. String[] hosts = blockLocation.getHosts();
  17. String strHosts = Arrays.toString(hosts);
  18. String names = Arrays.toString(blockLocation.getNames());
  19. long offset = blockLocation.getOffset();
  20. long length = blockLocation.getLength();
  21. System.out.println("所在的DataNode是:"+names+" 所在主机:"+strHosts+" 块的大小是:"+length);
  22. }
  23. }
  24. // 关闭操作工具类
  25. fileSystem.close();
  26. }

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

闽ICP备14008679号