网站首页 > java教程 正文
回复“资源”领取独家整理的学习资料!
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。
放弃不难,但坚持很酷~
一、前言
今天将自己的程序部署到生产环境中,发现执行 hdfs 相关操作时报错了。原来是测试环境是 nameNode 单节点,生产环境上是 nameNode HA 。
自己写的 hdfs 连接不适配 nameNode HA 。就很烦躁,还得增加工作量来改代码。
以前的代码如下图所示:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0-cdh5.11.0</version>
</dependency>
private static Configuration conf = new Configuration;
private static FileSystem fs;
/**
* 初始化 HDFS transportClient 连接
*/
public static voidinitConn {
// 获取配置
try {
fs = FileSystem.get(URI.create("hdfs://cdh-master-1:8020"), conf, "hdfs");
} catch (Exception e) {
log.error("HDFS Client Configuration Initialization exception: ", e);
}
}
就这么简单,但如果环境是 nameNode HA 状况的话,当 nameNode 切换后,这种实现方式就可能会报错,那还得改代码。
二、适配 nameNode HA 的写法
基于以上代码,我又适配了 nameNode HA 状态的写法:
private static Configuration conf = new Configuration;
private static FileSystem fs;
/**
* 初始化 HDFS transportClient 连接
*/
public static voidinitConn {
// 获取配置
conf.set("fs.defaultFS", "hdfs://nameservice1");
conf.set("dfs.nameservices", "nameservice1");
conf.set("dfs.ha.namenodes.nameservice1", "namenode6,namenode26");
conf.set("dfs.namenode.rpc-address.nameservice1.namenode6", "cdh-master-1:8020");
conf.set("dfs.namenode.rpc-address.nameservice1.namenode26", "cdh-master-2:8020");
conf.set("dfs.client.failover.proxy.provider.nameservice1",
"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
try {
fs = FileSystem.get(URI.create("hdfs://nameservice1"), conf, "hdfs");
} catch (Exception e) {
log.error("HDFS Client Configuration Initialization exception: ", e);
}
}
这样实现起来倒也不难,但也仅仅是适配于 nameNode HA 状态的写法。我们先来分析一下为什么要加这些配置。
- fs.defaultFS:客户端连接 HDFS 时,默认的路径前缀。如果配置了 nameNode HA 的话,这里的值就为:hdfs://[nameservice id] 。
- dfs.nameservices 命名空间的逻辑名称。
- dfs.ha.namenodes.[nameservice id] 命名空间中所有 nameNode 的唯一标示名称。可以配置多个,使用逗号分隔。该名称可以让 dataNode 知道每个集群的所有 nameNode 。
- dfs.namenode.rpc-address.[nameservice id].[namenode name]:HDFS Client访问HDFS,就是通过 RPC 实现的,代表每个 nameNode 监听的 RPC 地址。
- dfs.client.failover.proxy.provider.[nameservice id]:配置 HDFS 客户端连接到 Active NameNode 的一个 java 类。
这种方式如果用于 单nameNode 环境的话,也不行,也不适配。
三、通过加载 hdfs 配置文件,适配单/双 nameNode 环境
那如何让它一步到位呢?
让项目直接加载 hdfs 相关配置文件就好啦。由于上面涉及到的配置在 hdfs-site.xml 和 core-site.xml 文件中,所以要加载这两个文件。然后代码如下:
private static Configuration conf = new Configuration;
private static FileSystem fs;
/**
* 初始化 HDFS transportClient 连接
*/
public static voidinitConn {
// 获取配置
conf.addResource(new Path("hdfs-site.xml"));
conf.addResource(new Path("core-site.xml"));
try {
fs = FileSystem.get(conf);
} catch (Exception e) {
log.error("HDFS Client Configuration Initialization exception: ", e);
}
}
hdfs-site.xml 和 core-site.xml 文件可以通过 cdh-manager 页面来下载获取:
强烈建议用加载 hdfs 配置文件的方式,来实现对 HDFS 客户端的操作。如果还有用前一种 conf.set 写法来获取 hdfs 客户端的话,建议赶紧改成 加载 hdfs 配置文件的方式,好用方便,适配性强
。
欢迎大家留言讨论
HDFS ACL权限设置
HDFS NFS Gateway配置使用说明
终于!Ambari 自定义服务集成系列视频来了!!!
都快2020年了,ambari自定义服务集成,你还没掌握吗?文末有福利
Ambari 自定义服务启动成功后,依旧显示停止状态的解决方案
扫一扫,我们的故事就开始了。
另外公众号改变了推送规则,大家看文章不要忘记点击最下方的在看,点赞按钮,这样微信自动识别为常看公众号,否则很可能推送的文章可能淹没在别的文章找不到,谢谢大家
让我知道你在看
猜你喜欢
- 2025-06-10 XML简介(XML简介)
- 2025-06-10 MyBatis3源码解析-执行SQL流程(mybatisplus源码分析)
- 2025-06-10 xml 配置文件规范 校验(xml配置文件怎么写)
- 2025-06-10 Java操作MongoDB进行增删改查(mongodb删除语句)
- 2025-06-10 SpringBoot-19-Mybatis的xml配置方式
- 2025-06-10 Java老司机竟然连 Tomcat 都启动不起来?
- 2025-06-10 SpringBoot之数据访问——访问SQL数据库!
- 2025-06-10 SpringBoot 系列教程 Mybatis+xml 整合篇
- 2025-06-10 MyCat系列二--配置文件之server.xml
- 2025-06-10 Mybatis配置文件XML全貌详解,再不懂我也没招了
你 发表评论:
欢迎- 08-03JVM内存结构和Java内存模型
- 08-03C++ 知识小结
- 08-03Java内存模型(JMM)详解
- 08-03为什么计算机内存需要堆和栈?
- 08-03Java中,对象一定在堆中分配吗?
- 08-03看完这篇,还不懂JAVA内存模型(JMM)算我输
- 08-03别再混淆了!JVM内存模型和Java内存模型的本质区别
- 08-03【C语言】(13)堆和栈
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)