环境准备(考虑共用)
开发环境准备
准备项 说明 安装JDK JDK8/JDK11,推荐使用KonaJDK,下载地址 安装和配置IDE 按需选择,比如IntelliJ IDEA或Eclipse 安装Maven 开发环境基础配置,负责构建Java应用程序 Maven配置准备 如果需要本地调试,需要配置Maven pom.xml,推荐Maven 3.6.3,下载地址 运行环境准备
以下使用Linux环境作为开发机进行应用调试说明。- 准备开发机(可选):建议使用Linux操作系统;
- 部署客户端:参考部署TBDS客户端 在开发机上执行客户端部署,HDFS开发涉及的配置如下:
文件名称 作用 core-site.xml 配置Hadoop集群的核心配置参数。 hdfs-site.xml 配置HDFS组件的详细参数。 emr.keytab 对于Kerberos安全认证提供用户信息。 krb5.conf Kerberos Server配置信息。
导入示例工程代码
以下以IntelliJ IDEA举例,将HDFS示例工程代码导入进行说明。在GitHub获取样例代码:仓库地址:https://g-necm8077.coding.net/public/tencentcloud-tbds-examples/tbds-examples/git/files/master
参考身份认证和授权 下载的“user.keytab”和“krb5.conf”文件,放到样例工程的“conf”目录下。
导入样例工程到IntelliJ IDEA开发环境。

安装完IntelliJ IDEA和JDK工具后,需要在IntelliJ IDEA中配置JDK。选择 File 下的 Project Structure,点击 SDKs,选择 JDK 1.8,点击 Apply,再点击 OK。若没有 JDK 1.8,则点击 + 号进行添加,点击 Add JDK 后选择 JDK 1.8 安装目录,然后点击 OK 即可。


将工程依赖的jar包添加到类路径。需确保在本地安装了 Maven,并配置好了环境变量和 settings.xml 文件。IDEA 点击 Settings 进入配置页面,左上角输入 maven 进行搜索,点击 Build Tools 下的 Maven 配置项,修改 “Maven home path” 为本地 Maven 的安装目录,修改 “User settings file” 为本地 Maven settings.xml 配置文件的文件路径,并勾选 Override,此时 “Local repository” 将自动设置为 settings.xml 文件中配置的本地 Maven 仓库的目录。最后点击 Apply,再点击 OK。


将配置文件放入工程的conf目录
从6.3.1.Kerberos认证方式获取认证信息后,将.keytab文件和krb5.conf文件拷贝到工程的conf目录下;
Hadoop的配置文件的路径在/usr/local/service/hadoop/etc/hadoop/,将hdfs的相关配置文件core-site.xml和hdfs-site.xml拷贝到工程的conf目录下。
认证相关配置修改
基础安全认证public static Configuration confLoad(String HADOOP_CONF_HOME){ Configuration conf = new Configuration(); conf.addResource(new Path(HADOOP_CONF_HOME + "/core-site.xml")); conf.addResource(new Path(HADOOP_CONF_HOME + "/hdfs-site.xml")); conf.set("fs.hdfs.impl.disable.cache", "true"); conf.set("dfs.client.failover.max.attempts", "3"); conf.set("dfs.client.retry.max.attempts", "3"); conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); LOG.info("配置文件: " + conf); return conf; } public static FileSystem authentication(String HADOOP_CONF_HOME, String principal, String keytab) throws Exception { Configuration conf = confLoad(HADOOP_CONF_HOME); if(conf.get("hadoop.security.authentication").equalsIgnoreCase("kerberos")) { System.setProperty("java.security.krb5.conf", "/etc/krb5.conf"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytab);//当前用户认证 LOG.info("kerberos认证成功"); } FileSystem fileSystem = FileSystem.get(conf); return fileSystem; }
代码逻辑说明
- 功能说明
在使用HDFS提供的API之前,需要先进行HDFS初始化操作。过程为:
- 加载HDFS服务配置文件,并进行Kerberos安全认证。
- 认证通过后,实例化FileSystem对象。
- 调用FileSystem对象,实现HDFS的上传、下载、文件读取、写入、删除、追加功能。
配置文件说明
文件名称 作用 core-site.xml 配置Hadoop集群的核心配置参数。 hdfs-site.xml 配置HDFS详细参数。 EMR.keytab 对于Kerberos安全认证提供用户信息。 krb5.conf Kerberos Server配置信息。 代码逻辑说明
/** * 获取初始化配置 * 如果程序运行在Linux上,则需要core-site.xml、hdfs-site.xml的路径修改 * 为在Linux下客户端文件的绝对路径 */ public static Configuration confLoad(String HADOOP_CONF_HOME){ Configuration conf = new Configuration(); conf.addResource(new Path(HADOOP_CONF_HOME + "/core-site.xml")); conf.addResource(new Path(HADOOP_CONF_HOME + "/hdfs-site.xml")); conf.set("fs.hdfs.impl.disable.cache", "true"); conf.set("dfs.client.failover.max.attempts", "3"); conf.set("dfs.client.retry.max.attempts", "3"); conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); LOG.info("配置文件: " + conf); return conf; } /** *安全认证 */ public static FileSystem authentication(String HADOOP_CONF_HOME, String principal, String keytab) throws Exception { Configuration conf = confLoad(HADOOP_CONF_HOME); if(conf.get("hadoop.security.authentication").equalsIgnoreCase("kerberos")) { System.setProperty("java.security.krb5.conf", "/etc/krb5.conf"); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(principal, keytab);//当前用户认证 LOG.info("kerberos认证成功"); } FileSystem fileSystem = FileSystem.get(conf); return fileSystem; } /** *创建用例 */ public static void main(String[] args) throws Exception { LOG.setLevel(Level.ALL); GetProperties getProperties = new GetProperties(); Properties properties = getProperties.getRequestProperties("demo.hdfs."); String confDir = properties.getProperty("confDir"); String keytab = properties.getProperty("keytab"); String principal = properties.getProperty("principal"); LOG.info("confDir: " + confDir +"keytab: " +keytab +"principal: "+principal); FileSystem fileSystem = authentication(confDir,principal,keytab); //上传文件 uploadFile(fileSystem); //下载文件 downloadFile(fileSystem); //创建并写入文件 writeFile(fileSystem); //读取文件 readFile(fileSystem); //对文件追加内容 appendContext(fileSystem); //删除文件 deleteFile(fileSystem); fileSystem.close(); }
代码调试
以下使用IntelliJ IDEA说明示例工程代码调试过程。
编译代码
打开IntelliJ IDEA终端,进入HdfsDemo目录。cd src/hdfs-examples/HdfsDemo使用Maven命令打包:
mvn install clean package编译成功界面如下:

编译过程中遇到报错需要根据错误信息进行排查和修改,打印“BUILD SUCCESS”为编译成功。开发机调试
编译成功后在target目录下得到hdfs-client-1.0-SNAPSHOT-bin.tar.gz和hdfs-client-1.0-SNAPSHOT.jar文件,上传到开发机新建的/data/demo目录进行调试运行。具体的运行方法见下一节打包发布中的介绍。
打包发布
- 打包
打包的具体操作见上一节代码调试部分。 - 发布
通过上述编译后得到hdfs-client-1.0-SNAPSHOT-bin.tar.gz和hdfs-client-1.0-SNAPSHOT.jar。其中hdfs-client-1.0-SNAPSHOT-bin.tar.gz包含运行过程中依赖的目录和文件;hdfs-client-1.0-SNAPSHOT.jar为hdfs demo的java执行文件。将两个文件上传到开发机,并解压tar包。
命令如下:
#开发机中新建目录
mkdir -p /data/demo
#本地上传压缩文件和jar包
scp hdfs-client-1.0-SNAPSHOT-bin.tar.gz hdfs-client-1.0-SNAPSHOT.jar root@{ip}:/data/demo
#开发机上解压压缩文件
cd /data/demo
tar zxf hdfs-client-1.0-SNAPSHOT-bin.tar.gz
mv conf/application.yml ./
开发机demo目录下的文件如下:

3. 开发机运行
准备认证文件和配置文件:参考获取用户认证信息。若是 Kerberos 环境,需要将用户的keytab文件上传至开发机conf。这里将测试用户的test.keytab文件上传至开发机的conf目录。然后将hadoop的配置文件core-site.xml和hdfs-site.xml放入conf目录下。
mv test.keytab conf/ cp /usr/local/service/hadoop/etc/hadoop/hdfs-site.xml conf/ cp /usr/local/service/hadoop/etc/hadoop/core-site.xml conf/
准备测试文件:准备名为download.txt,read.txt,append.txt和delete.txt的测试文件,然后将这几个文件上传至 HDFS的/hdfs_demo目录。注意,如果是 Kerberos 环境,需要首先进行认证。然后准备upload.txt,放在开发机的demo目录下。
操作命令:#kerberos认证 klist -kt /data/demo/conf/test.keytab kinit -kt /data/demo/conf/test.keytab test@TBDS-xxx /usr/local/service/hadoop/bin/hdfs dfs -mkdir /hdfs_demo /usr/local/service/hadoop/bin/hdfs dfs -put delete.txt read.txt append.txt download.txt /hdfs_demo

修改application.yml的内容,填写demo文件夹中测试文件的路径和hdfs中测试文件的路径。
Ranger 授权:参考Ranger授权(经典集群),确保 Hadoop用户具有读写权限。
安全认证:HDFS在Kerberos 环境下认证方式有两种,如下表所示。
认证方式 认证说明 命令认证 在提交HDFS 任务前,使用 kinit -kt {keytab} {principal} 命令进行认证 代码认证 获取用户的 keytab 和 principal 后,在应用程序的代码中进行认证 运行样例:在开发机上进入/data/demo目录,执行命令运行jar文件,更多参数说明参考常用命令。该demo演示了对HDFS JAVA API的基本实现,包括:上传、下载、读取、写入、追加、删除等功能。
/usr/local/jdk/bin/java -jar hdfs-client-1.0-SNAPSHOT.jar
开发机上的运行过程:
HDFS上的运行结果:
程序运维监控
HDFS提交YARN任务的时候可以通过进入YARN UI界面查看运行状态和运行日志。具体可以使用示例说明中的命令进行测试,然后体验程序的运维监控功能。本小节以提交MapReduce任务为例,具体命令如下:
#kerberos认证
/usr/bin/klist -kt /var/krb5kdc/emr.keytab
/usr/bin/kinit -kt /var/krb5kdc/emr.keytab hadoop/xxx@xxxxx
#提交任务
cd /usr/local/service/hadoop/bin
./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /test /output
./hdfs dfs -cat /output/*
- 监控
登录 TBDS Manager 管控平台,点击“集群列表”,选择 HDFS 程序运行所对应的集群。点击“集群服务”,选择 YARN 服务,点击 WebUI 地址跳转至 YARN UI 界面(注意YARN UI的ip地址需要替换为公网ip)。
YARN UI 页面根据 ApplicationID、User、Name 等信息,找到对应的 MapReduce 任务。由于 HDFS 任务的 ApplicationID 在日志级别为 INFO 及以下才会输出至控制台,而HDFS默认的日志级别为 WARN,因此这里可以根据任务类型等信息进行查找对应的Mapreduce任务,点击 ApplicationID 链接,然后点击 Tracking URL 链接,跳转作业监控页面。

- 日志查看
在 YARN UI 页面根据 ApplicationID、Name 等信息,找到对应的MapReduce任务,点击 Logs 查看日志。
- 作业操作
与其它提交至YARN的任务类似,可以通过YARN相关命令查看、停止任务,参考常用命令。可以通过命令 yarn application -kill 停止MapReduce任务;通过命令 yarn logs -applicationId 查看Mapreduce的任务日志。

















