一个具有 3 个 NameNode 的 HDFS 联邦集群的配置文件。
#集群环境假设
3个 NameNode: nn1.cluster.com, nn2.cluster.com, nn3.cluster.com
多个 DataNode: dn1.cluster.com, dn2.cluster.com, ... (共享存储)
集群逻辑名称: myfederation
JournalNode 节点 (用于每个命名服务的高可用): jn1.cluster.com, jn2.cluster.com, jn3.cluster.com
ZooKeeper 节点: zk1.cluster.com, zk2.cluster.com, zk3.cluster.com
1. hdfs-site.xml 配置
这个文件定义了三个独立的命名服务,每个都有自己独立的命名空间。
#hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ============================================= -->
<!-- 联邦集群全局配置 -->
<!-- ============================================= -->
<!-- 启用联邦,定义所有命名服务 -->
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2,ns3</value>
<description>定义三个独立的命名服务</description>
</property>
<!-- 定义每个命名服务的路由(在core-site.xml中通过ViewFS使用) -->
<property>
<name>dfs.internal.nameservices</name>
<value>ns1,ns2,ns3</value>
</property>
<!-- ============================================= -->
<!-- 第一个命名服务 (ns1) 配置 -->
<!-- ============================================= -->
<!-- ns1 的 NameNode 列表 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
<description>ns1命名服务的两个NameNode(HA对)</description>
</property>
<!-- ns1 的 RPC 地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>nn1.cluster.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>nn2.cluster.com:8020</value>
</property>
<!-- ns1 的 HTTP 地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>nn1.cluster.com:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>nn2.cluster.com:9870</value>
</property>
<!-- ns1 的共享编辑日志存储(JournalNodes) -->
<property>
<name>dfs.namenode.shared.edits.dir.ns1</name>
<value>qjournal://jn1.cluster.com:8485;jn2.cluster.com:8485;jn3.cluster.com:8485/ns1</value>
</property>
<!-- ns1 的故障转移代理 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ============================================= -->
<!-- 第二个命名服务 (ns2) 配置 -->
<!-- ============================================= -->
<property>
<name>dfs.ha.namenodes.ns2</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn1</name>
<value>nn1.cluster.com:8022</value>
<description>注意:使用不同端口避免冲突</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn2</name>
<value>nn2.cluster.com:8022</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2.nn1</name>
<value>nn1.cluster.com:9871</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2.nn2</name>
<value>nn2.cluster.com:9871</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir.ns2</name>
<value>qjournal://jn1.cluster.com:8485;jn2.cluster.com:8485;jn3.cluster.com:8485/ns2</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ============================================= -->
<!-- 第三个命名服务 (ns3) 配置 -->
<!-- ============================================= -->
<property>
<name>dfs.ha.namenodes.ns3</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns3.nn1</name>
<value>nn1.cluster.com:8024</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns3.nn2</name>
<value>nn2.cluster.com:8024</value>
</property>
<property>
<name>dfs.namenode.http-address.ns3.nn1</name>
<value>nn1.cluster.com:9872</value>
</property>
<property>
<name>dfs.namenode.http-address.ns3.nn2</name>
<value>nn2.cluster.com:9872</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir.ns3</name>
<value>qjournal://jn1.cluster.com:8485;jn2.cluster.com:8485;jn3.cluster.com:8485/ns3</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns3</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- ============================================= -->
<!-- JournalNode 配置 -->
<!-- ============================================= -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/journal</value>
<description>JournalNode 数据存储目录</description>
</property>
<!-- ============================================= -->
<!-- DataNode 配置(共享存储) -->
<!-- ============================================= -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/datanode</value>
</property>
<!-- DataNode 需要向所有 NameNode 报告 -->
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:9866</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:9864</value>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:9867</value>
</property>
<!-- ============================================= -->
<!-- HA 自动故障转移配置 -->
<!-- ============================================= -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>启用自动故障转移</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.cluster.com:2181,zk2.cluster.com:2181,zk3.cluster.com:2181</value>
<description>ZooKeeper 集群地址</description>
</property>
<!-- ============================================= -->
<!-- 其他重要配置 -->
<!-- ============================================= -->
<property>
<name>dfs.replication</name>
<value>3</value>
<description>副本因子</description>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>块大小 128MB</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/namenode</value>
<description>NameNode 元数据存储目录</description>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
<description>启用权限检查</description>
</property>
</configuration>
2. core-site.xml 配置
这个文件配置客户端如何访问联邦集群,使用 ViewFS 提供统一的命名空间视图。
# core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ============================================= -->
<!-- 联邦集群全局配置 -->
<!-- ============================================= -->
<!-- 使用 ViewFS 作为默认文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>viewfs://myfederation/</value>
<description>使用 ViewFS 提供统一的联邦视图</description>
</property>
<!-- ============================================= -->
<!-- ViewFS 挂载点配置 -->
<!-- ============================================= -->
<!-- 定义联邦集群的挂载表 -->
<property>
<name>fs.viewfs.mounttable.myfederation.link./user</name>
<value>hdfs://ns1/user</value>
<description>将 /user 目录映射到 ns1 命名服务</description>
</property>
<property>
<name>fs.viewfs.mounttable.myfederation.link./data</name>
<value>hdfs://ns2/data</value>
<description>将 /data 目录映射到 ns2 命名服务</description>
</property>
<property>
<name>fs.viewfs.mounttable.myfederation.link./tmp</name>
<value>hdfs://ns3/tmp</value>
<description>将 /tmp 目录映射到 ns3 命名服务</description>
</property>
<property>
<name>fs.viewfs.mounttable.myfederation.link./apps</name>
<value>hdfs://ns1/apps</value>
<description>将 /apps 目录映射到 ns1 命名服务</description>
</property>
<property>
<name>fs.viewfs.mounttable.myfederation.link./warehouse</name>
<value>hdfs://ns2/warehouse</value>
<description>将数据仓库目录映射到 ns2 命名服务</description>
</property>
<!-- ============================================= -->
<!-- Hadoop 通用配置 -->
<!-- ============================================= -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
<description>Hadoop 临时目录</description>
</property>
<property>
<name>hadoop.proxyuser.hdfs.groups</name>
<value>*</value>
<description>允许 HDFS 用户代理所有组</description>
</property>
<property>
<name>hadoop.proxyuser.hdfs.hosts</name>
<value>*</value>
<description>允许 HDFS 用户从所有主机代理</description>
</property>
<!-- ============================================= -->
<!-- I/O 配置 -->
<!-- ============================================= -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>I/O 缓冲区大小</description>
</property>
</configuration>
3. 部署说明和初始化步骤
部署前准备
在所有节点创建目录:
bash
# 在 NameNode 节点
sudo mkdir -p /data/hadoop/namenode
sudo mkdir -p /data/hadoop/tmp
# 在 JournalNode 节点
sudo mkdir -p /data/hadoop/journal
# 在 DataNode 节点
sudo mkdir -p /data/hadoop/datanode
sudo mkdir -p /data/hadoop/tmp
# 设置权限
sudo chown -R hdfs:hadoop /data/hadoop
sudo chmod -R 755 /data/hadoop
配置主机名解析 (/etc/hosts 或 DNS):
text
192.168.1.10 nn1.cluster.com
192.168.1.11 nn2.cluster.com
192.168.1.12 nn3.cluster.com
192.168.1.20 jn1.cluster.com
192.168.1.21 jn2.cluster.com
192.168.1.22 jn3.cluster.com
192.168.1.30 zk1.cluster.com
192.168.1.31 zk2.cluster.com
192.168.1.32 zk3.cluster.com
192.168.1.100 dn1.cluster.com
192.168.1.101 dn2.cluster.com
#初始化步骤
首先启动 JournalNodes:
bash
# 在所有 JournalNode 节点上
hdfs --daemon start journalnode
格式化并启动第一个命名服务 (ns1):
bash
# 在 nn1.cluster.com 上
hdfs namenode -format -clusterId myfederation
hdfs zkfc -formatZK -force # 在 ZK 中初始化 HA 状态
hdfs --daemon start namenode
# 在 nn2.cluster.com 上 (ns1 的备用节点)
hdfs namenode -bootstrapStandby
hdfs --daemon start namenode
#初始化其他命名服务:
bash
# 在 nn1.cluster.com 上初始化 ns2
hdfs namenode -initializeSharedEdits -clusterId myfederation -force -nonInteractive
# 在 nn2.cluster.com 上初始化 ns2 备用
hdfs namenode -bootstrapStandby
# 重复上述步骤初始化 ns3
#启动所有服务:
bash
# 启动所有 NameNode 的 ZKFC
hdfs --daemon start zkfc
# 启动所有 DataNode
hdfs --daemon start datanode
验证联邦状态:
bash
# 查看联邦状态
hdfs dfsadmin -report
# 测试 ViewFS 挂载
hdfs dfs -ls /
hdfs dfs -ls /user
hdfs dfs -ls /data
这个配置创建了一个完整的 HDFS 联邦集群,具有 3 个独立的命名空间,每个命名空间都有高可用性保障,
并通过 ViewFS 为客户端提供统一的访问入口。
编写一个具有3个namenode 的HDFS联邦的hdfs-site.xml ,core-site.xml 的配置文件
最新推荐文章于 2025-11-22 22:09:34 发布
1194

被折叠的 条评论
为什么被折叠?



