HDFS Java 客户端 API
一、基本调用
Configuration 配置对象类,用于加载或设置参数属性
FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。
1. maven依赖pom.xml文件
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.1.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.1.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency>
2. 创建跟hdfs文件系统的连接和关闭
package com.yifeng.hadoop;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.junit.After;
import org.junit.Before;import java.io.IOException;/*** @Author: EstellaQ* @Date: 2025/2/21 18:00* @Description: 测试类**/
public class HDFSClientTest {private static Configuration conf = null;private static FileSystem fs = null;/*** 初始化方法,用于和hdfs集群建立连接* @throws IOException*/@Beforepublic void connect2HDFS() throws IOException {// 创建配置对象实例conf = new Configuration();//设置操作的文件系统是HDFS,并且指定HDFS操作地址conf.set("fs.defaultFS", "hdfs://node1.yifeng.cn:8020");// 创建FileSystem对象实例fs = FileSystem.get(conf);}/*** 关闭客户端和hdfs连接* @throws IOException */@Afterpublic void close() {// 首先判断文件系统实例是否为null,如果不为null,进行关闭if (fs != null) {try {fs.close();} catch (IOException e) {e.printStackTrace();}}}
}
3. 权限验证
直接调用api呢,会报错:Permission denied: user=hp, access=WRITE, inode="/user":root:supergroup:drwxr-xr-x

原因:以Windows登录用户访问HDFS,而该用户不具备在HDFS操作权限
解决
1、修改HDFS文件系统权限
2、或者设置客户端身份,该身份具备在HDFS操作权限
//设置客户端身份,以具备权限在hdfs上进行操作
System.setProperty("HADOOP_USER_NAME", "root");
4. 创建文件夹
/*** 创建文件夹操作*/@Testpublic void mkdir() throws IOException {// 判断文件夹是否存在,如果不存在再创建if (!fs.exists(new Path("/yifeng"))) {//创建文件夹fs.mkdirs(new Path("/yifeng"));}}
5. 上传文件
/*** 从本地文件系统上传文件到HDFS* Q:本地文件系统指的是? 客户端所在集群的文件系统 此处指的是Windows文件系统*/@Testpublic void putFile2HDFS() throws IOException {//本地文件路径Path src = new Path("E:\\appdata\\hdfs\\helloworld.txt");//hdfs目标路径Path dst = new Path("/yifeng");//上传文件 参数(源路径,目标路径)fs.copyFromLocalFile(src,dst);}
6. 下载文件
/*** 从HDFS下载文件到本地文件系统*/@Testpublic void getFile2Local() throws IOException {//本地文件路径Path src = new Path("/yifeng/helloworld.txt");//hdfs目标路径Path dst = new Path("E:\\appdata\\helloworld.txt");//上传文件 参数(源路径,目标路径)fs.copyToLocalFile(src,dst);}
此时会报错:

- 原因:
- Hadoop访问windows本地文件系统,要求Windows上的本地库能正常工作。
- 其中Hadoop使用某些Windows API来实现类似posix的文件访问权限。
- 上述功能需要在hadoop.dll和winutils.exe来实现。
- 解决:
- 下载Hadoop源码在windows平台编译,编译出windows本地库。然后配置Hadoop环境变量。
- 配置好之后重启IDEA,有些机器需要右键管理员权限运行IDEA。
HADOOP_HOME=E:\tools\hadoop\hadoop-3.1.4
path=;%HADOOP_HOME%\bin
二、Log4j使用
1. 介绍
Log4J 是 Apache 的一个开源项目。通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、GUI 组件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
- 官网: https://logging.apache.org/log4j/2.x/
2. 三大组件
- Log4J主要由Logger(日志记录器)、Appender(输出端)和 Layout(日志格式化器)组成。
- Logger控制日志的输出级别与日志是否输出;
- Appender指定日志的输出方式(ConsoleAppender控制台、FileAppender文件、JDBCAppender等);
- Layout控制日志信息的输出格式(simple格式、HTML格式、PatternLayout自定义格式)。
3. 日志的级别
- Log4J 在 org.apache.log4j.Level 类中定义了OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL八种日志级别。
- 一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG。

4. 项目中应用
1)项目中引入log4j的jar包
hadoop中已经集成好log4j的jar包了。
2)添加配置文件log4j.properties
- 只需要在项目路径下新建log4j.properties配置文件,并配置日志的输出格式等信息,Log4J框架会自动的加载配置文件,并将配置信息设置到Logger中。
# 控制台输出配置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %p [%c] - %m%n
#指定日志的输出级别与输出端
log4j.rootLogger=DEBUG,Console#日志输出格式
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
3)代码中使用
public class Log4Test {public static void main(String[] args) {Logger logger = Logger.getLogger(Log4Test.class);logger.debug("这是debug");logger.info("这是info");logger.warn("这是warn");logger.error("这是error");logger.fatal("这是fatal");}
}
三、Google Option使用
1. 介绍
- Google-option是Bazel Project中的命令行参数解析器。
- option程序包已拆分为一个单独的jar,可用于通用程序。
- GitHub:https://github.com/pcj/google-options

2. 引入Google-option的jar包
<dependency>
<groupId>com.github.pcj</groupId>
<artifactId>google-options</artifactId>
<version>1.0.0</version>
</dependency>
3. 首先创建参数实体类
- 类应提供与预期的命令行选项相对应的public字段; 每个public字段都应使用@Option注释进行注释 。
- Option注解参数说明
name:选项名称
defaultValue:默认值
abbrev:选项的单字符缩写
help:使用信息的帮助字符串
category:描述此选项所属的类别
allowMultiple:一个标志,指示是否应允许选项类型在单个选项列表中多次出现。
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;import java.util.List;public class ServerOptions extends OptionsBase {@Option(name = "help",abbrev = 'h',help = "Prints usage info.",defaultValue = "true")public boolean help;@Option(name = "host",abbrev = 'o',help = "The server host.",category = "startup",defaultValue = "")public String host;@Option(name = "port",abbrev = 'p',help = "The server port.",category = "startup",defaultValue = "8080")public int port;@Option(name = "dir",abbrev = 'd',help = "Name of directory to serve static files.",category = "startup",allowMultiple = true,defaultValue = "")public List<String> dirs;}
4. 在main方法中解析参数
import com.google.devtools.common.options.OptionsParser;import java.util.Collections;public class Server {public static void main(String[] args) {//创建一个参数Parser解析对象 解析规则为ServerOptions中定义OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);//解析输入参数数组argsparser.parseAndExitUponError(args);//获得OptionServerOptions options = parser.getOptions(ServerOptions.class);//如果输入参数host为空 或 port<0(非法)或 dirs目录为空if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {//输出Usage使用方法printUsage(parser);return;}//输出Server运行的host portSystem.out.format("Starting server at %s:%d...\n", options.host, options.port);//输出每个dir的名字for (String dirname : options.dirs) {System.out.format("\\--> Serving static files at <%s>\n", dirname);}}private static void printUsage(OptionsParser parser) {System.out.println("Usage: java -jar server.jar OPTIONS");System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),OptionsParser.HelpVerbosity.LONG));}
}
四、舆情数据上报案例
- 在HDFS上有一个目录,相当于企业中的数据中转站,会有源源不断的数据存储进去
- 其中有些类型的数据是我们业务相关的舆情数据
- 要求使用程序能够遍历数据源目录,找出符合需求的数据,上传移动到指定的HDFS目录下。

Step1:实现思路
- 使用Google Option解析命令行参数。
- 读取要采集的数据目录,生成上传任务,上传任务包含一个任务文件,该文件包含了要上传哪些文件到HDFS上。
- 执行任务,读取要上传的任务文件,挨个将任务文件中的文件上传到HDFS。
- 上传中、上传完毕需要给任务文件添加特别的标识(willdoing copy done)。

Step2:工程环境搭建
- 添加maven依赖
- 构建代码包结构
arg: 处理命令行参数
dfs: 存放操作HDFS的工具类
task: 处理文件上传任务
Step3:开发舆情上报程序参数解析
同上,在main方法中解析参数
创建一个SentimentOptions类, 并从OptionsBase继承,定义以下几个参数
(1) 帮助,可以显示命令的帮助信息 help h 默认参数
(2) 要采集数据的位置 source s
(3) 生成待上传的临时目录 pending_dir p
(4) 生成要上传到的HDFS路径 output o
Step4:实现生成数据采集任务
task包下创建TaskMgr源文件。 先实现生成数据上报任务。
实现步骤:
1.判断原始数据目录是否存在
2.读取原始数据目录下的所有文件
3.判断待上传目录是否存在,不存在则创建一个
4.创建任务目录(目录名称:task_年月日时分秒_任务状态)
5.遍历待上传的文件,在待上传目录生成一个willDoing文件
6.将待移动的文件添加到willDoing文件中
Step5:实现执行数据上报任务
1. 读取待上传目录的willDoing任务文件,注意过滤COPY和DONE后的任务文件夹
2.遍历读取任务文件,开始上传
a)将任务文件修改为_COPY,表示正在处理中
b)获取任务的日期
c)判断HDFS目标上传目录是否存在,不存在则创建
d)读取任务文件
e)按照换行符切分
f)上传每一个文件,调用HDFSUtils进行数据文件上传
g)上传成功后,将_COPY后缀修改为_DONE
Step6:项目打包
shade插件可以将所有的jar打到一个jar包中。
将执行主类的项目路径复制到<mainClass></mainClass>中


然后打包:

这里打包好两个jar包,一个是原代码的jar包,下面那个是携带了依赖的jar包

Step7:结果测试
创建一个目录/root/sentiment_upload,使用以下shell脚本来驱动jar包执行。
#!/bin/bash
export SENTIMENT_HOME=/root/sentiment_upload
export JAVA_HOME=/export/server/jdk1.8.0_65
export JAVA_CMD="${JAVA_HOME}/bin/java"
export JAVA_OPS="-jar ${SENTIMENT_HOME}/hdfs-api-1.0-SNAPSHOT-jar-with-dependencies.jar"SOURCE_DIR=$1
PENDING_DIR=$2
OUTPUT_DIR=$3if [ ! $SOURCE_DIR ] || [ ! $OUTPUT_DIR ]; then
${JAVA_CMD} ${JAVA_OPS} -h
exit;
fiif [ ! $PENDING_DIR ] ; then
${JAVA_CMD} ${JAVA_OPS} -s $SOURCE_DIR -o $OUTPUT_DIR
exit;
fi${JAVA_CMD} ${JAVA_OPS} -s $SOURCE_DIR -p ${PENDING_DIR} -o $OUTPUT_DIR
将脚本和jar包都上传到服务器 /root/sentiment_upload 目录下
![]()
创建文件夹 source pending output
mkdir source
mkdir pending
mkdir output
将数据集上传到source目录下(数据集在代码里边也有)
执行以下命令即可
sh sentiment_upload.sh /root/sentiment_upload/source /root/sentiment_upload/pending /root/sentiment_upload/out
项目地址:https://gitee.com/EstellaQ/hdfs-api.git
相关文章:
HDFS Java 客户端 API
一、基本调用 Configuration 配置对象类,用于加载或设置参数属性 FileSystem 文件系统对象基类。针对不同文件系统有不同具体实现。该类封装了文件系统的相关操作方法。 1. maven依赖pom.xml文件 <dependency><groupId>org.apache.hadoop</groupId&g…...
【华三】STP的角色选举(一文讲透)
【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图(文字描述)****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...
【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解
【C#零基础从入门到精通】(二十六)——C#三大特征-多态详解 在 C# 中,多态是面向对象编程的重要特性之一,它允许不同的对象对同一消息做出不同的响应。多态可以分为静态多态和动态多态,下面将详细介绍它们以及各自包含的知识点。 多态概述 多态性使得代码更加灵活、可扩展…...
宇树科技13家核心零部件供应商梳理!
2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…...
Java集合框架全解析:从LinkedHashMap到TreeMap与HashSet面试题实战
一、LinkedHashMap ①LinkedHashMap集合和HashMap集合的用法完全相同。 ②不过LinkedHashMap可以保证插入顺序。 ③LinkedHashMap集合因为可以保证插入顺序,因此效率比HashMap低一些。 ④LinkedHashMap是如何保证插入顺序的? 底层采用了双向链表来记…...
goland无法debug项目
1、其实个原因是因为正在使用的Delve调试器版本太旧,无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具,用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本,而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...
深入探索 DeepSeek 在数据分析与可视化中的应用
在数据驱动的时代,快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具,凭借其强大的数据处理和可视化能力,正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前,数据预处理…...
python面试题整理
Python 如何处理异常? Python中,使用try 和 except 关键字来捕获和处理异常 try 块中放置可能会引发异常的代码,然后在except块中处理这些异常。 能补充一下finally的作用吗? finally 块中的代码无论是否发生异常都会执行…...
大型装备故障诊断解决方案
大型装备故障诊断解决方案 方案背景 在全球航空工业迅猛发展的背景下,我国在军用和民用飞机自主研发制造领域取得了显著成就。尤其是在国家大力支持下,国内飞机制造企业攻克了诸多关键技术难题,实现了从设计研发到生产制造再到售后保障的完整…...
基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考
系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…...
小怿学习日记(七) | Unreal引擎灯光架构
灯光的布局对于HMI场景中车模的展示效果有着举足轻重的地位。本篇内容将简单介绍ES3.1的相关知识,再深入了解Unreal引擎中车模的灯光以及灯光架构。 一、关于ES3.1 1.1 什么是ES3.1 ES3.1这个概念对于美术的同学可能比较陌生,ES3.1指的是OpenGL ES3.1&…...
网络运维学习笔记 013网工初级(HCIA-Datacom与CCNA-EI)DHCP动态主机配置协议(此处只讲华为)
文章目录 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)网关配置DHCP服务器配置如果没有DHCP服务器,只在网关上做DHCP服务器: DHCP(Dynamic Host Configuration Protocol,动态主…...
javaEE-14.spring MVC练习
目录 1.加法计算器 需求分析: 前端页面代码: 后端代码实现功能: 调整前端页面代码: 进行测试: 2.用户登录 需求分析: 定义接口: 1.登录数据校验接口: 2.查询登录用户接口: 前端代码: 后端代码: 调整前端代码: 测试/查错因 后端: 前端: lombok工具 1.引入依赖…...
HTML/CSS中并集选择器
1.作用:选中多个选择器对应的元素,又称:分组选择器 所谓并集就是或者的含义. 2.语法:选择器1,选择器2,选择器3,......选择器n 多个选择器通过,连接,此处,的含义就是:或. .rich,.beauty{color: blue;} 3.注意事项 1.并集选择器,我们一般竖着写 2.任何形式的选择器,都可以作为并…...
可编辑35页PPT | DeepSeek如何赋能职场应用
DeepSeek作为一款基于人工智能技术的多模态AI工具,近年来在职场应用中迅速崭露头角,以其强大的功能和高效的表现赢得了广泛的赞誉。DeepSeek融合了文本生成、图像创作、数据分析与可视化等多种功能,为职场人士提供了前所未有的便利和效率提升…...
CSS `transform` 属性详解:打造视觉效果与动画的利器
CSS transform 属性详解:打造视觉效果与动画的利器 引言一、transform 属性简介二、平移(Translation)三、旋转(Rotation)四、缩放(Scale)五、倾斜(Skew)六、组合变换&am…...
Windows使用docker部署fastgpt出现的一些问题
文章目录 Windows使用docker部署FastGPT出现的一些问题1.docker部署pg一直重启的问题2.重启MongoDB之后一直出现“Waiting for MongoDB to start...”3.oneapi启动不了failed to get gpt-3.5-turbo token encoder Windows使用docker部署FastGPT出现的一些问题 1.docker部署pg一…...
Spring Boot中如何使用Thymeleaf模板引擎
Thymeleaf 是一个现代化的服务器端 Java 模板引擎,在 Spring Boot 项目中使用它可以方便地将 Java 代码和 HTML 页面进行整合,生成动态的 Web 页面。以下将详细介绍在 Spring Boot 中如何使用 Thymeleaf 模板引擎。 1. 添加依赖 如果你使用的是 Maven 项目,在 pom.xml 中添…...
C/C++跳动的爱心
系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...
Element UI中messageBox怎么区分点击取消按钮关闭弹窗,和点击右上角x号以及点击遮罩层关闭按钮
在某些场景下,我们可能需要区分点击取消按钮关闭 messageBox 和点击X号、遮罩层关闭 messageBox 。 实现: 将 distinguishCancelAndClose 设置为 true,这个属性的意思是:是否将取消(点击取消按钮)与关闭&…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
