当前位置:   article > 正文

HDFS Java API操作(IDEA版)_运用 idea 20220 3.4版实现hdfs api操作

运用 idea 20220 3.4版实现hdfs api操作

目标

通过Java API来操作HDFS,完成的操作有:文件上传、文件下载、新建文件夹、查看文件、删除文件。

前提条件

1.Windows下安装好jdk1.8

2.Windows下安装好maven,这里使用Maven3.6.3

3.Windows下安装好IDEA,这里使用IDEA2021

4.Linux下安装好hadoop2,这里使用hadoop2.7.3

操作步骤

1.新建一个Maven工程

打开IDEA-->File-->New-->Project

选择Maven-->点击Next

 选择工程代码存放目录,这个目录需要为一个空目录,目录名称就是工程名称,可以点击Artifact Coordinates左侧的三角形展开内容后,可以修改组织ID,组织ID一般为公司域名的倒写,例如:域名为baidu.com,组织ID填写com.baidu。这里使用默认值。然后点击Finish按钮完成Maven工程的创建。

2.pom.xml添加相关依赖

pom.xml</project>上一行添加如下依赖:

  1. <dependencies>
  2. <!-- hadoop相关依赖 -->
  3. <dependency>
  4. <groupId>org.apache.hadoop</groupId>
  5. <artifactId>hadoop-common</artifactId>
  6. <version>2.7.3</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.hadoop</groupId>
  10. <artifactId>hadoop-hdfs</artifactId>
  11. <version>2.7.3</version>
  12. </dependency>
  13. <!-- 单元测试依赖 -->
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.13.2</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!-- log4j依赖 -->
  21. <dependency>
  22. <groupId>org.apache.logging.log4j</groupId>
  23. <artifactId>log4j-core</artifactId>
  24. <version>2.17.2</version>
  25. </dependency>
  26. </dependencies>

 加载依赖

可以看到

3.编写测试代码

新建包

src\test\java目录下新建package,包名为GroupID的值:org.example

新建HdfsTest

新建出的包名处,右键-->New-->Java Class 

 填写类名:HdfsTest

文件上传

将本地D:\test\input\1.txt上传到HDFS的/目录下

在HdfsTest类编写代码,实现文件上传的代码如下:

  1. /**
  2. * 测试上传文件
  3. */
  4. @Test
  5. public void upload() throws URISyntaxException {
  6. Configuration conf = new Configuration();
  7. URI uri = new URI("hdfs://192.168.193.140:8020");//hdfs服务端地址
  8. String localDir = "file:///D:/test/input/1.txt";//注意:这里的本地文件是指idea所在系统的本地文件
  9. String hdfsDir = "/";
  10. try {
  11. Path localPath = new Path(localDir);
  12. Path hdfsPath = new Path(hdfsDir);
  13. FileSystem fs = FileSystem.get(uri,conf,"hadoop");
  14. fs.copyFromLocalFile(localPath, hdfsPath);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }

测试前数据准备,在WindowsD:\test\input目录下新建一个1.txt文件,1.txt内容为

hello world
hello hadoop

启动hdfs服务

start-dfs.sh

查看HDFS的/目录,没有1.txt文件

[hadoop@node1 ~]$ hdfs dfs -ls /
Found 10 items
-rw-r--r--   1 hadoop supergroup         26 2022-03-14 10:48 /2.txt
-rw-r--r--   1 hadoop supergroup       1028 2022-03-15 16:22 /core-site.xml
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:39 /input
-rw-r--r--   3 hadoop supergroup         27 2022-03-16 09:19 /newfile.txt
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 21:40 /out1
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:08 /out318
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:45 /out318-2
drwxr-xr-x   - hadoop supergroup          0 2022-03-15 11:05 /output
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:32 /test
drwx------   - hadoop supergroup          0 2022-03-18 15:45 /tmp
​

运行测试,点击upload方法左侧的三角形,然后点击Run 'upload()'运行upload方法

 

看到Tests passed 或者 Exit code 0 说明运行成功。

 

查看HDFS的/目录,发现有1.txt文件

[hadoop@node1 ~]$ hdfs dfs -ls /
Found 11 items
-rw-r--r--   3 hadoop supergroup         25 2022-03-21 23:26 /1.txt
-rw-r--r--   1 hadoop supergroup         26 2022-03-14 10:48 /2.txt
-rw-r--r--   1 hadoop supergroup       1028 2022-03-15 16:22 /core-site.xml
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:39 /input
-rw-r--r--   3 hadoop supergroup         27 2022-03-16 09:19 /newfile.txt
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 21:40 /out1
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:08 /out318
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:45 /out318-2
drwxr-xr-x   - hadoop supergroup          0 2022-03-15 11:05 /output
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:32 /test
drwx------   - hadoop supergroup          0 2022-03-18 15:45 /tmp

查看1.txt文件内容

[hadoop@node1 ~]$ hdfs dfs -cat /1.txt
hello world
hello hadoop

至此,说明从文件上传成功了。

思考:程序是如何实现文件上传的,核心代码是什么?如果不使用api是否可以自定义实现上传功能的代码?

文件下载

将HDFS /1.txt下载到本地D:\test目录下

  1. /**
  2. * 测试下载文件
  3. */
  4. @Test
  5. public void download(){
  6. Configuration conf = new Configuration();
  7. conf.set("fs.defaultFS", "hdfs://192.168.193.140:8020");
  8. String localDir = "D:\\test\\download";//IDEA在windows下,所以本地是windows系统
  9. String hdfsDir = "/1.txt";//下载文件
  10. try {
  11. Path localPath = new Path(localDir);
  12. Path hdfsPath = new Path(hdfsDir);
  13. FileSystem fs = FileSystem.newInstance(conf);
  14. fs.copyToLocalFile(hdfsPath, localPath);
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }

 运行测试

查看本地是否成功下载了1.txt文件

新建文件夹

  1. /**
  2. * 新建文件夹
  3. */
  4. @Test
  5. public void mkdir() throws URISyntaxException {
  6. Configuration conf = new Configuration();
  7. URI uri = new URI("hdfs://192.168.193.140:8020");
  8. String hdfsDir = "/mkdir_test";
  9. Path path = new Path(hdfsDir);
  10. try {
  11. FileSystem fs = FileSystem.get(uri,conf,"hadoop");
  12. fs.mkdirs(path);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }

 运行测试

查看HDFS 是否创建了/mkdir_test

[hadoop@node1 ~]$ hdfs dfs -ls /
Found 12 items
-rw-r--r--   3 hadoop supergroup         25 2022-03-21 23:26 /1.txt
-rw-r--r--   1 hadoop supergroup         26 2022-03-14 10:48 /2.txt
-rw-r--r--   1 hadoop supergroup       1028 2022-03-15 16:22 /core-site.xml
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:39 /input
drwxr-xr-x   - hadoop supergroup          0 2022-03-21 23:51 /mkdir_test
-rw-r--r--   3 hadoop supergroup         27 2022-03-16 09:19 /newfile.txt
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 21:40 /out1
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:08 /out318
drwxr-xr-x   - hadoop supergroup          0 2022-03-18 15:45 /out318-2
drwxr-xr-x   - hadoop supergroup          0 2022-03-15 11:05 /output
drwxr-xr-x   - hadoop supergroup          0 2022-03-14 10:32 /test
drwx------   - hadoop supergroup          0 2022-03-18 15:45 /tmp

 

思考:程序是如何实现文件下载的,核心代码是什么?如果不使用api是否可以自定义实现下载功能的代码?

查看文件状态

查看HDFS已存在的目录下的文件和目录,本案例查看的是/user,如果没有/user目录需要自行创建

  1. /**
  2. * 查看文件状态
  3. */
  4. @Test
  5. public void listFiles(){
  6. Configuration conf = new Configuration();
  7. conf.set("fs.defaultFS", "hdfs://192.168.193.140:8020");
  8. try {
  9. FileSystem fs = FileSystem.newInstance(conf);
  10. // listFiles递归查询所有目录和文件
  11. RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/user"), true);
  12. while (iterator.hasNext()){
  13. LocatedFileStatus next = iterator.next();
  14. System.out.println(next.getPath());
  15. }
  16. System.out.println("===================");
  17. // listStatus只查询当前目录下的目录和文件
  18. FileStatus[] fileStatuses = fs.listStatus(new Path("/user"));
  19. for (int i = 0; i < fileStatuses.length; i++) {
  20. FileStatus fileStatus = fileStatuses[i];
  21. System.out.println(fileStatus.getPath());
  22. }
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }

 思考:这个程序能否运行成功,如果不能运行成功,原因是什么?请自行修改代码并运行成功。

删除文件

  1. /**
  2. * 删除目录或文件
  3. */
  4. @Test
  5. public void delete() throws URISyntaxException {
  6. Configuration conf = new Configuration();
  7. URI uri = new URI("hdfs://192.168.193.140:8020");
  8. String hdfsDir = "/mkdir_test";
  9. try {
  10. FileSystem fs = FileSystem.get(uri,conf,"hadoop");
  11. Path hdfsPath = new Path(hdfsDir);
  12. fs.delete(hdfsPath,true);
  13. } catch (IOException | InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }

扩展

使用流拷贝方式实现上传和下载

  1. // 采用流拷贝的方式实现上传、下载
  2. /**
  3. * 上传
  4. */
  5. @Test
  6. public void uploadByIOStream() throws URISyntaxException {
  7. Configuration conf = new Configuration();
  8. URI uri = new URI("hdfs://192.168.193.140:8020");
  9. try {
  10. FileSystem fs = FileSystem.get(uri, conf, "hadoop");
  11. FileInputStream is = new FileInputStream("d:\\test\\data.txt");
  12. FSDataOutputStream os = fs.create(new Path("/input2/data.txt"));//创建一个路径
  13. // 流拷贝
  14. IOUtils.copyBytes(is, os, 1024);
  15. // 关闭资源
  16. is.close();
  17. os.close();
  18. fs.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. /**
  26. * 下载
  27. */
  28. @Test
  29. public void downloadByIOStream() throws URISyntaxException, IOException, InterruptedException {
  30. Configuration conf = new Configuration();
  31. URI uri = new URI("hdfs://192.168.193.140:8020");
  32. FileSystem fs = FileSystem.get(uri, conf, "hadoop");
  33. FSDataInputStream is = fs.open(new Path("/input2/1.txt"));//输入流
  34. FileOutputStream os = new FileOutputStream("d:\\test\\1downbyio.txt");
  35. IOUtils.copyBytes(is,os,1024);
  36. is.close();
  37. os.close();
  38. fs.close();
  39. }

完成!enjoy it!

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

闽ICP备14008679号