大数据学习:使用Java API操作HDFS
创始人
2024-03-03 19:39:44
0

文章目录

      • 一、创建Maven项目
      • 二、添加依赖
      • 三、创建日志属性文件
      • 四、在HDFS上创建文件
      • 五、写入HDFS文件
        • 1、将数据直接写入HDFS文件
        • 2、将本地文件写入HDFS文件
      • 六、读取HDFS文件
        • 1、读取HDFS文件直接在控制台显示
        • 2、读取HDFS文件,保存为本地文件

一、创建Maven项目

在这里插入图片描述

二、添加依赖

  • pom.xml文件里添加hadoopjunit依赖
    在这里插入图片描述
org.apache.hadoophadoop-client3.3.4junitjunit4.13.2

三、创建日志属性文件

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

四、在HDFS上创建文件

  • /ied01目录创建hadoop2.txt文件
  • 创建net.xxr.hdfs包,在包里创建CreateFileOnHDFS
    在这里插入图片描述
    在这里插入图片描述
  • 编写create1()方法
package net.xxr.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;import java.net.URI;public class CreateFileOnHDFS {public void create1() throws Exception{// 创建配置对象Configuration conf = new Configuration();// 定义统一资源标识符String uri = "hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri), conf);// 创建路径对象(指向文件)Path path = new Path(uri + "/ied01/hadoop2.txt");// 基于路径对象创建文件boolean result = fs.createNewFile(path);// 根据返回值判断文件是否创建成功if (result) {System.out.println("文件[" + path + "]创建成功!");}else {System.out.println("文件[" + path + "]创建失败!");}}
}
  • 结果
    在这里插入图片描述
  • 利用HDFS集群WebUI查看
    在这里插入图片描述
  • 编写create2()方法,实现判断文件是否存在
 @Testpublic void create2() throws Exception{// 创建配置对象Configuration conf = new Configuration();// 定义统一资源标识符String uri = "hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri), conf);// 创建路径对象(指向文件)Path path = new Path(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文件

package net.xxr.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;import java.net.URI;/*
功能:写入HDFS文件
作者:小小榕
日期:2022年11月30日*/public class WriteFileOnHDFS {@Testpublic void write1() throws Exception{// 创建配置对象Configuration conf = new Configuration();conf.set("dfs.client.use.datanode.hostname","true");// 定义统一资源标识符String uri = "hdfs://master:9000";// 创建文件系统对象(基于HDFS的文件系统)FileSystem fs = FileSystem.get(new URI(uri), conf,"root");// 创建路径对象(指向文件)Path path = new Path(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()方法
@Testpublic void write2() throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 定义uri字符串String uri = "hdfs://master:9000";// 创建文件系统对象FileSystem fs = FileSystem.get(new URI(uri), conf, "root");// 创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/exam2.txt");// 创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);// 创建文件字符输入流对象FileReader fr = new FileReader("test.txt");// 创建缓冲字符输入流对象BufferedReader br = new BufferedReader(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_()方法
@Testpublic void write2_() throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 定义uri字符串String uri = "hdfs://master:9000";// 创建文件系统对象FileSystem fs = FileSystem.get(new URI(uri), conf, "root");// 创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test2.txt");// 创建文件系统数据字节输出流对象FSDataOutputStream out = fs.create(path);// 创建文件字节输入流对象FileInputStream in = new FileInputStream("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()方法
package net.xxr.hdfs;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;/*
功能:读取HDFS文件
作者:小小榕
日期:2022年11月30日*/public class ReadFileOnHDFS {@Testpublic void read1() throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 定义uri字符串String uri = "hdfs://master:9000";// 创建文件系统对象FileSystem fs = FileSystem.get(new URI(uri), conf, "root");// 创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test2.txt");// 创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);// 创建缓冲字符输入流对象,提高读取效率(字节流-->字符流-->缓冲流)BufferedReader br = new BufferedReader(new InputStreamReader(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()方法
@Testpublic void read2() throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 定义uri字符串String uri = "hdfs://master:9000";// 创建文件系统对象FileSystem fs = FileSystem.get(new URI(uri), conf, "root");// 创建路径对象(指向目录或文件)Path path = new Path(uri + "/ied01/test2.txt");// 创建文件系统数据字节输入流对象FSDataInputStream in = fs.open(path);// 创建文件字节输出流FileOutputStream out = new FileOutputStream("download/exam.txt");// 读取HDFS文件(靠输入流),写入本地文件(靠输出流)IOUtils.copyBytes(in, out, conf);// 关闭文件系统数据字节输入流in.close();// 关闭文件字节输出流out.close();// 关闭文件系统fs.close();// 提示用户文件下载成功System.out.println("文件[" + path + "]下载到本地文件[download/exam.txt]!");}
  • 结果
    在这里插入图片描述
    在这里插入图片描述

相关内容

热门资讯

最新!靖国神社被起诉 据央视新闻,当地时间23日,二战时期被日军强制征兵的部分韩籍遇难者遗属向首尔中央地方法院提起诉讼,要...
靖国神社,被起诉! 当地时间23日,二战时期被日军强制征兵的部分韩籍遇难者遗属向首尔中央地方法院提起诉讼,要求日本靖国神...
国台办:为“台独”分裂势力为虎... 中新社北京12月24日电 (陈建新 李百加)国务院台办发言人彭庆恩24日在北京表示,凡危害国家主权、...
怀宁县清河乡“一站式”调解架起... 诉求“只进一扇门”,调处“最多跑一地”。在怀宁县清河乡,这不仅仅是一句口号,更是当地群众化解矛盾纠纷...
钧达股份:充分利用海南相关优惠... 证券之星消息,钧达股份(002865)12月23日在投资者关系平台上答复投资者关心的问题。 投资者提...
信用修复制度助力企业重塑信用 信用修复作为社会信用体系建设的关键环节,对于帮助信用主体纠正错误、重塑信用、重返市场具有不可替代的作...
《秦皇岛市餐厨废弃物管理条例》... 12月23日,记者从市政府新闻办召开的《秦皇岛市餐厨废弃物管理条例》(以下简称《条例》)颁布实施新闻...
最高法等三部门联合发布婚姻家庭... 家和万事兴,家齐国安宁。为深入学习贯彻党的二十大和二十届历次全会精神,贯彻落实习近平总书记关于注重家...
追债超9000万元遇阻!被告破... 12月23日,瀚川智能(688022)发布公告,近日公司收到江西省吉安市中级人民法院对公司出具的《民...