当前位置:   article > 正文

Hadoop——HDFS的Java API操作(文件上传、下载、删除等)_java上传和下载hadoop文件

java上传和下载hadoop文件

1、创建Maven项目

2、修改pom.xml文件

  1. <dependencies>
  2. <!-- Hadoop所需依赖包 -->
  3. <dependency>
  4. <groupId>org.apache.hadoop</groupId>
  5. <artifactId>hadoop-common</artifactId>
  6. <version>2.7.0</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.hadoop</groupId>
  10. <artifactId>hadoop-hdfs</artifactId>
  11. <version>2.7.0</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.hadoop</groupId>
  15. <artifactId>hadoop-client</artifactId>
  16. <version>2.7.0</version>
  17. </dependency>
  18. <!-- junit测试依赖,因为我只想测试HDFS是否能正常使用 -->
  19. <dependency>
  20. <groupId>junit</groupId>
  21. <artifactId>junit</artifactId>
  22. <version>4.12</version>
  23. </dependency>
  24. </dependencies>

3、添加四个配置文件

为避免运行的一些错误,我们将Hadoop的四个重要配置文件添加到resources中

4、创建测试文件JavaAPI

5、初始化

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.*;
  3. import org.junit.After;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import java.io.IOException;
  7. public class JavaAPI {
  8. // 可操作HDFS文件系统的对象
  9. FileSystem hdfs = null;
  10. // 测试方法执行前执行,用于初始化操作,避免频繁初始化
  11. @Before
  12. public void init() throws IOException {
  13. // 构造一个配置参数对象,设置一个参数:要访问的HDFS的URI
  14. Configuration conf = new Configuration();
  15. // 指定使用HDFS访问
  16. conf.set("fs.defaultFS","hdfs://localhost:9000");
  17. // 进行客户端身份的设置(root为虚拟机的用户名,hadoop集群节点的其中一个都可以)
  18. System.setProperty("HADOOP_USER_NAME","root");
  19. // 通过FileSystem的静态get()方法获取HDFS文件系统客户端对象
  20. hdfs = FileSystem.get(conf);
  21. }
  22. // 测试方法执行后执行,用于处理结尾的操作,关闭对象
  23. @After
  24. public void close() throws IOException {
  25. // 关闭文件操作对象
  26. hdfs.close();
  27. }
  28. }

因为对文件的操作我们都需要获取hdfs对象和关闭对象,所以为避免重复编写,将两个操作对立成单独方法,分别在文件相应操作执行前和执行后执行。

这里"hdfs://localhost:9000"对应core-site.xml的配置

6、文件操作

可以在浏览器访问http://localhost:50070/,点击Browse the file system 查看HDFS文件系统的目录

文件上传

我提前在本地E:\hadoop下创建一个HDFSTest.txt文件

  1. // 上传文件到HDFS文件系统
  2. @Test
  3. public void testUploadFileToHDFS() throws IOException {
  4. // 待上传的文件路径(windows)
  5. Path src = new Path("E:/hadoop/HDFSTest.txt");
  6. // 上传之后存放的路径(HDFS)
  7. Path dst = new Path("/HDFSTest.txt");
  8. // 上传
  9. hdfs.copyFromLocalFile(src, dst);
  10. System.out.println("上传成功");
  11. }
文件下载
  1. // 从HDFS下载文件到本地
  2. @Test
  3. public void testDownFileToLocal() throws IOException {
  4. // 待下载的路径(HDFS)
  5. Path src = new Path("/HDFSTest.txt");
  6. // 下载成功之后存放的路径(windows)
  7. Path dst = new Path("E:/hadoop/HDFSTest1.txt");
  8. // 下载
  9. hdfs.copyToLocalFile(false,src,dst,true);
  10. System.out.println("下载成功");
  11. }
创建目录
  1.    // 创建目录
  2.    @Test
  3.    public void testMkdirFile() throws IOException {
  4.        // 待创建目录路径
  5.        Path src = new Path("/HDFS");
  6.        // 创建目录
  7.        hdfs.mkdirs(src);
  8.        System.out.println("创建成功");
  9.   }
目录重命名
  1.    // 重命名
  2.    @Test
  3.    public void testRenameFile() throws IOException {
  4.        // 重命名之前的名字
  5.        Path src = new Path("/HDFS");
  6.        // 重命名之后的名字
  7.        Path dst = new Path("/HDFS1");
  8.        // 重命名
  9.        hdfs.rename(src,dst);
  10.        System.out.println("重命名成功");
  11.   }
删除目录
  1.    // 删除目录
  2.    @Test
  3.    public void testDeleteFile() throws IOException {
  4.        // 待删除目录路径(HDFS)
  5.        Path src = new Path("/HDFS1");
  6.        // 删除
  7.        hdfs.delete(src, true);
  8.        System.out.println("删除成功");
  9.   }
查看文件信息
  1. // 查看HDFS目录中的文件信息
  2. @Test
  3. public void testCheckFile() throws IOException {
  4. // 获取迭代器对象("/"表示获取全部目录下的文件)
  5. RemoteIterator<LocatedFileStatus> listFiles = hdfs.listFiles(new Path("/"), true);
  6. while (listFiles.hasNext()) {
  7. LocatedFileStatus fileStatus = listFiles.next();
  8. // 打印当前文件名
  9. System.out.println("文件名:" + fileStatus.getPath().getName());
  10. // 打印当前文件块大小
  11. System.out.println("文件块大小:" + fileStatus.getBlockSize());
  12. // 打印当前文件权限
  13. System.out.println("文件权限:" + fileStatus.getPermission());
  14. // 打印当前文件内容的长度
  15. System.out.println("文件内容长度:" + fileStatus.getLen());
  16. // 获取该文件块的信息(包含长度,数据块,DataNodes的信息)
  17. BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  18. for (BlockLocation bl : blockLocations) {
  19. System.out.println("block-length:" + bl.getLength());
  20. System.out.println("block-offset:" + bl.getOffset());
  21. // 获取DataNodes的主机名
  22. String[] hosts = bl.getHosts();
  23. for (String host : hosts) {
  24. System.out.println(host);
  25. }
  26. }
  27. System.out.println("-----------------分割线-----------------");
  28. }
  29. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号