namenode每个节点独立的联邦架构

1. 修正的 hdfs-site.xml - 每个 NameNode 独立配置
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>
  </property>

  <!-- ============================================= -->
  <!--         第一个命名服务 (ns1) 配置             -->
  <!-- ============================================= -->
  
  <!-- ns1 使用独立的节点 ns1.nn1.cluster.com -->
  <property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>ns1.nn1.cluster.com:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>ns1.nn2.cluster.com:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>ns1.nn1.cluster.com:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>ns1.nn2.cluster.com:9870</value>
  </property>

  <!-- ns1 的独立元数据目录 -->
  <property>
    <name>dfs.namenode.name.dir.ns1</name>
    <value>file:///data/hadoop/namenode/ns1</value>
  </property>

  <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>

  <!-- ============================================= -->
  <!--         第二个命名服务 (ns2) 配置             -->
  <!-- ============================================= -->
  
  <!-- ns2 使用独立的节点 ns2.nn1.cluster.com -->
  <property>
    <name>dfs.ha.namenodes.ns2</name>
    <value>nn1,nn2</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.ns2.nn1</name>
    <value>ns2.nn1.cluster.com:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2.nn2</name>
    <value>ns2.nn2.cluster.com:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.ns2.nn1</name>
    <value>ns2.nn1.cluster.com:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns2.nn2</name>
    <value>ns2.nn2.cluster.com:9870</value>
  </property>

  <!-- ns2 的独立元数据目录 -->
  <property>
    <name>dfs.namenode.name.dir.ns2</name>
    <value>file:///data/hadoop/namenode/ns2</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>

  <!-- ============================================= -->
  <!--         第三个命名服务 (ns3) 配置             -->
  <!-- ============================================= -->
  
  <!-- ns3 使用独立的节点 ns3.nn1.cluster.com -->
  <property>
    <name>dfs.ha.namenodes.ns3</name>
    <value>nn1,nn2</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.ns3.nn1</name>
    <value>ns3.nn1.cluster.com:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns3.nn2</name>
    <value>ns3.nn2.cluster.com:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.ns3.nn1</name>
    <value>ns3.nn1.cluster.com:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns3.nn2</name>
    <value>ns3.nn2.cluster.com:9870</value>
  </property>

  <!-- ns3 的独立元数据目录 -->
  <property>
    <name>dfs.namenode.name.dir.ns3</name>
    <value>file:///data/hadoop/namenode/ns3</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.journalnode.edits.dir</name>
    <value>/data/hadoop/journal</value>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/hadoop/datanode</value>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>

</configuration>
2. 修正的 /etc/hosts 或 DNS 配置
text
# NameNode 节点 - 每个命名服务使用独立的主机名
192.168.1.10 ns1.nn1.cluster.com
192.168.1.11 ns1.nn2.cluster.com
192.168.1.12 ns2.nn1.cluster.com  
192.168.1.13 ns2.nn2.cluster.com
192.168.1.14 ns3.nn1.cluster.com
192.168.1.15 ns3.nn2.cluster.com

# JournalNode 和 DataNode 节点
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 dn1.cluster.com
192.168.1.31 dn2.cluster.com
正确的启动方式
方案一:为每个节点准备独立的配置文件(推荐)
为每个 NameNode 节点创建专属配置目录:

bash
# 为 ns1.nn1.cluster.com 创建配置
mkdir -p /etc/hadoop/ns1-nn1
cp /etc/hadoop/core-site.xml /etc/hadoop/ns1-nn1/
cp /etc/hadoop/hdfs-site.xml /etc/hadoop/ns1-nn1/

# 修改 ns1-nn1 的 hdfs-site.xml,只保留 ns1 相关配置
# 删除 ns2 和 ns3 的配置节

# 启动特定节点的 NameNode
HADOOP_CONF_DIR=/etc/hadoop/ns1-nn1 hdfs --daemon start namenode
方案二:使用角色特定的启动脚本
创建启动脚本 /usr/local/bin/start-namenode-ns1.sh:

bash
#!/bin/bash
# 启动 ns1 的 NameNode

export HADOOP_CONF_DIR=/etc/hadoop/ns1-config
export HADOOP_LOG_DIR=/var/log/hadoop/ns1
export HADOOP_PID_DIR=/var/run/hadoop/ns1

# 创建目录
mkdir -p $HADOOP_LOG_DIR $HADOOP_PID_DIR

# 启动 NameNode
hdfs --daemon start namenode

echo "NameNode ns1 started with PID: $(cat $HADOOP_PID_DIR/hadoop-*-namenode.pid)"
方案三:使用服务管理(systemd)
创建 systemd 服务文件 /etc/systemd/system/hadoop-namenode-ns1.service:

ini
[Unit]
Description=Hadoop NameNode NS1
After=network.target

[Service]
Type=forking
User=hdfs
Group=hadoop
Environment=HADOOP_CONF_DIR=/etc/hadoop/ns1-config
Environment=HADOOP_LOG_DIR=/var/log/hadoop/ns1
Environment=HADOOP_PID_DIR=/var/run/hadoop/ns1
ExecStart=/opt/hadoop/bin/hdfs --daemon start namenode
ExecStop=/opt/hadoop/bin/hdfs --daemon stop namenode
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
使用 systemd 管理:

bash
systemctl start hadoop-namenode-ns1
systemctl start hadoop-namenode-ns2  
systemctl start hadoop-namenode-ns3
验证和监控
检查进程状态
bash
# 检查每个 NameNode 进程
ps aux | grep namenode

# 检查每个 NameNode 的端口监听
netstat -tlnp | grep 9870
netstat -tlnp | grep 8020

# 检查每个命名服务的状态
hdfs dfsadmin -report -service ns1
hdfs dfsadmin -report -service ns2
hdfs dfsadmin -report -service ns3
验证联邦配置
bash
# 查看所有命名服务
hdfs getconf -namenodes

# 测试 ViewFS 挂载
hdfs dfs -ls viewfs://myfederation/
hdfs dfs -ls viewfs://myfederation/user
hdfs dfs -ls viewfs://myfederation/data

总结
关键修正点:
独立主机名:每个 NameNode 使用不同的主机名
独立配置目录:为每个 NameNode 准备专属配置
独立进程管理:使用不同的 systemd 服务或启动脚本
独立日志和PID目录:避免文件冲突

正确的架构应该是:
ns1.nn1.cluster.com + ns1.nn2.cluster.com (ns1 的 HA 对)
ns2.nn1.cluster.com + ns2.nn2.cluster.com (ns2 的 HA 对)
ns3.nn1.cluster.com + ns3.nn2.cluster.com (ns3 的 HA 对)
这样每个 NameNode 都可以独立启动和管理,不会产生冲突。感谢您指出这个重要问题!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值