0


大数据学习:使用Java API操作HDFS

文章目录

一、创建Maven项目

在这里插入图片描述

二、添加依赖

  • pom.xml文件里添加hadoopjunit依赖在这里插入图片描述
<dependencies><dependency><!--hadoop客户端--><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.4</version></dependency><!--单元调试框架--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency></dependencies>

三、创建日志属性文件

  • resources目录里创建log4j.properties文件在这里插入图片描述在这里插入图片描述
  • 代码
log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c]-%m%n
log4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/hdfs.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p [%c]-%m%n

四、在HDFS上创建文件

  • /ied01目录创建hadoop2.txt文件
  • 创建net.xxr.hdfs包,在包里创建CreateFileOnHDFS在这里插入图片描述在这里插入图片描述
  • 编写create1()方法
packagenet.xxr.hdfs;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.Test;importjava.net.URI;publicclassCreateFileOnHDFS{publicvoidcreate1()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 定义统一资源标识符String uri ="hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs =FileSystem.get(newURI(uri), conf);// 创建路径对象(指向文件)Path path =newPath(uri +"/ied01/hadoop2.txt");// 基于路径对象创建文件boolean result = fs.createNewFile(path);// 根据返回值判断文件是否创建成功if(result){System.out.println("文件["+ path +"]创建成功!");}else{System.out.println("文件["+ path +"]创建失败!");}}}
  • 结果在这里插入图片描述
  • 利用HDFS集群WebUI查看在这里插入图片描述
  • 编写create2()方法,实现判断文件是否存在
@Testpublicvoidcreate2()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 定义统一资源标识符String uri ="hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs =FileSystem.get(newURI(uri), conf);// 创建路径对象(指向文件)Path path =newPath(uri +"/ied01/hadoop2.txt");// 判断路径对象指向的文件是否存在if(fs.exists(path)){// 提示用户文件已存在System.out.println("文件["+ path +"]已存在!");}else{// 基于路径对象创建文件boolean result = fs.createNewFile(path);// 根据返回值判断文件是否创建成功if(result){System.out.println("文件["+ path +"]创建成功!");}else{System.out.println("文件["+ path +"]创建失败!");}}}
  • 结果在这里插入图片描述

五、写入HDFS文件

  • net.xxr.hdfs包里创建WriteFileOnHDFS在这里插入图片描述
1、将数据直接写入HDFS文件
packagenet.xxr.hdfs;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataOutputStream;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.Test;importjava.net.URI;/*
功能:写入HDFS文件
作者:小小榕
日期:2022年11月30日
 */publicclassWriteFileOnHDFS{@Testpublicvoidwrite1()throwsException{// 创建配置对象Configuration conf =newConfiguration();
        conf.set("dfs.client.use.datanode.hostname","true");// 定义统一资源标识符String uri ="hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs =FileSystem.get(newURI(uri), conf,"root");// 创建路径对象(指向文件)Path path =newPath(uri +"/ied01/hadoop2.txt");// 创建文件系统数据字节输出流FSDataOutputStream out = fs.create(path);// 通过字节输出流向文件写数据
        out.write("Hello Hadoop World".getBytes());// 关闭输出流
        out.close();// 关闭文件系统对象
        fs.close();System.out.println("文件["+ path +"]写入成功");}}
  • 结果在这里插入图片描述
  • 利用HDFS集群WebUI查看在这里插入图片描述
2、将本地文件写入HDFS文件
  • 在项目根目录创建一个文本文件test.txt在这里插入图片描述
  • 创建create2()方法
@Testpublicvoidwrite2()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname","true");// 定义uri字符串String uri ="hdfs://master:9000";// 创建文件系统对象FileSystem fs =FileSystem.get(newURI(uri), conf,"root");// 创建路径对象(指向目录或文件)Path path =newPath(uri +"/ied01/exam2.txt");// 创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);// 创建文件字符输入流对象FileReader fr =newFileReader("test.txt");// 创建缓冲字符输入流对象BufferedReader br =newBufferedReader(fr);// 定义行字符串String nextLine ="";// 通过循环读取缓冲字符输入流while((nextLine = br.readLine())!=null){// 在控制台输出读取的行System.out.println(nextLine);// 通过文件系统数据字节输出流对象写入指定文件
            out.write(nextLine.getBytes());}// 关闭文件系统字节输出流
        out.close();// 关闭缓冲字符输入流
        br.close();// 关闭文件字符输入流
        fr.close();// 提示用户写入文件成功System.out.println("本地文件[test.txt]成功写入["+ path +"]!");}
  • 结果在这里插入图片描述
  • 其实这个方法的功能就是将本地文件复制(上传)到HDFS,有没有更简单的处理方法呢?有的,通过使用一个工具类IOUtils来完成文件的相关操作
  • 编写create2_()方法
@Testpublicvoidwrite2_()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname","true");// 定义uri字符串String uri ="hdfs://master:9000";// 创建文件系统对象FileSystem fs =FileSystem.get(newURI(uri), conf,"root");// 创建路径对象(指向目录或文件)Path path =newPath(uri +"/ied01/test2.txt");// 创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);// 创建文件字节输入流对象FileInputStream in =newFileInputStream("test.txt");// 利用IOUtils类提供的字节拷贝方法来复制文件IOUtils.copyBytes(in, out, conf);// 关闭文件字节输入流
        in.close();// 关闭文件系统数据字节输出流
        out.close();// 关闭文件系统
        fs.close();// 提示用户写入文件成功System.out.println("本地文件[test.txt]成功写入["+ path +"]!");}
  • 结果在这里插入图片描述
  • 查看/ied01/test.txt内容在这里插入图片描述

六、读取HDFS文件

  • net.xxr.hdfs包里创建ReadFileOnHDFS在这里插入图片描述
1、读取HDFS文件直接在控制台显示
  • 编写read1()方法
packagenet.xxr.hdfs;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataInputStream;importorg.apache.hadoop.fs.FSDataOutputStream;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.Test;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.URI;/*
功能:读取HDFS文件
作者:小小榕
日期:2022年11月30日
 */publicclassReadFileOnHDFS{@Testpublicvoidread1()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname","true");// 定义uri字符串String uri ="hdfs://master:9000";// 创建文件系统对象FileSystem fs =FileSystem.get(newURI(uri), conf,"root");// 创建路径对象(指向目录或文件)Path path =newPath(uri +"/ied01/test2.txt");// 创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);// 创建缓冲字符输入流对象,提高读取效率(字节流-->字符流-->缓冲流)BufferedReader br =newBufferedReader(newInputStreamReader(in));// 定义行字符串String nextLine ="";// 通过循环读取缓冲字符输入流while((nextLine = br.readLine())!=null){// 在控制台输出读取的行内容System.out.println(nextLine);}// 关闭缓冲字符输入流
        br.close();// 关闭文件系统数据字节输入流
        in.close();// 关闭文件系统
        fs.close();}}
  • 结果在这里插入图片描述
  • 利用IOUtils类简化代码
  • 创建read1_()测试方法在这里插入图片描述
2、读取HDFS文件,保存为本地文件
  • 任务:将/ied01/test2.txt下载到项目下download目录里
  • 创建download目录在这里插入图片描述
  • 创建read2()方法
@Testpublicvoidread2()throwsException{// 创建配置对象Configuration conf =newConfiguration();// 设置数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname","true");// 定义uri字符串String uri ="hdfs://master:9000";// 创建文件系统对象FileSystem fs =FileSystem.get(newURI(uri), conf,"root");// 创建路径对象(指向目录或文件)Path path =newPath(uri +"/ied01/test2.txt");// 创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);// 创建文件字节输出流FileOutputStream out =newFileOutputStream("download/exam.txt");// 读取HDFS文件(靠输入流),写入本地文件(靠输出流)IOUtils.copyBytes(in, out, conf);// 关闭文件系统数据字节输入流
        in.close();// 关闭文件字节输出流
        out.close();// 关闭文件系统
        fs.close();// 提示用户文件下载成功System.out.println("文件["+ path +"]下载到本地文件[download/exam.txt]!");}
  • 结果在这里插入图片描述在这里插入图片描述
标签: java hdfs 大数据

本文转载自: https://blog.csdn.net/X_Serendipity/article/details/128109176
版权归原作者 X_Serendipity 所有, 如有侵权,请联系我们删除。

“大数据学习:使用Java API操作HDFS”的评论:

还没有评论