ubuntu

如何在Ubuntu上实现HDFS高可用

小樊
37
2025-11-11 07:11:49
栏目: 智能运维

在Ubuntu上实现HDFS高可用的核心步骤
HDFS高可用(HA)通过双NameNode互备JournalNode同步元数据ZooKeeper自动故障转移等机制,解决单点故障问题,确保集群持续提供服务。以下是Ubuntu环境下的具体实现流程:

一、准备工作

  1. 环境配置

    • 至少准备3台Ubuntu节点(建议2台NameNode+3台JournalNode,满足JournalNode“过半写入”要求);
    • 所有节点安装相同版本的Hadoop(如3.3.4+);
    • 安装并配置JDK 8/11(Hadoop依赖Java环境);
    • 配置SSH无密码登录(所有节点之间互相免密,便于Hadoop进程远程控制);
    • 关闭防火墙(或开放必要端口:Hadoop默认端口如8020、50070,ZooKeeper默认2181)。
  2. 节点角色规划

    • NameNode节点:2台(如nn1nn2),分别运行Active和Standby状态的NameNode;
    • JournalNode节点:3台(如jn1jn2jn3),负责同步NameNode元数据(需奇数台,确保容错);
    • DataNode节点:至少2台(存储实际数据,可与NameNode/ JournalNode重叠);
    • ZooKeeper节点:3台(与JournalNode重叠更佳,用于监控NameNode状态并协调故障转移)。

二、配置HDFS核心参数

修改Hadoop配置目录(如/opt/hadoop/etc/hadoop)下的core-site.xmlhdfs-site.xml文件:

1. 修改core-site.xml

配置HDFS默认文件系统和ZooKeeper集群地址(用于自动故障转移):

<configuration>
    <!-- 指定HDFS集群名称(需与hdfs-site.xml中的dfs.nameservices一致) -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <!-- 指定ZooKeeper集群地址(用于自动故障转移) -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>zk1:2181,zk2:2181,zk3:2181</value>
    </property>
</configuration>

2. 修改hdfs-site.xml

配置HDFS高可用相关参数(关键参数说明见注释):

<configuration>
    <!-- 指定HDFS集群名称(与core-site.xml中的fs.defaultFS一致) -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <!-- 定义NameNode节点列表(逗号分隔) -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- Active NameNode的RPC地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>nn1_host:8020</value>
    </property>
    <!-- Standby NameNode的RPC地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>nn2_host:8020</value>
    </property>
    <!-- Active NameNode的HTTP地址(Web UI) -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>nn1_host:50070</value>
    </property>
    <!-- Standby NameNode的HTTP地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>nn2_host:50070</value>
    </property>
    <!-- 元数据共享存储路径(JournalNode集群地址) -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value>
    </property>
    <!-- 客户端故障转移代理(自动选择Active NameNode) -->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 防脑裂机制:SSH强制杀死故障NameNode -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <!-- SSH私钥路径(用于故障转移时的SSH登录) -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    <!-- JournalNode数据存储路径 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/hadoop/journalnode/data</value>
    </property>
</configuration>

三、部署ZooKeeper集群

ZooKeeper用于监控NameNode状态并协调自动故障转移,需先部署并启动ZooKeeper集群:

  1. 安装ZooKeeper
    在3台ZooKeeper节点上执行:

    sudo apt-get update
    sudo apt-get install zookeeper zookeeperd -y
    
  2. 配置ZooKeeper
    修改/etc/zookeeper/conf/zoo.cfg文件,添加集群节点信息:

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/var/lib/zookeeper
    clientPort=2181
    server.1=zk1:2888:3888
    server.2=zk2:2888:3888
    server.3=zk3:2888:3888
    
    • server.xx为节点ID(需在dataDir目录下创建myid文件,内容为对应ID,如zk1节点的myid内容为1)。
  3. 启动ZooKeeper
    在每台ZooKeeper节点上执行:

    sudo systemctl start zookeeper
    sudo systemctl enable zookeeper
    # 验证状态(需看到Leader和Follower)
    zkServer.sh status
    

四、启动JournalNode集群

JournalNode负责同步Active NameNode的元数据到Standby NameNode,需先启动JournalNode:

  1. 创建数据目录
    在所有JournalNode节点上创建数据存储目录:

    mkdir -p /opt/hadoop/journalnode/data
    chown -R hadoop:hadoop /opt/hadoop/journalnode
    
  2. 启动JournalNode服务
    在所有JournalNode节点上执行:

    hdfs --daemon start journalnode
    # 验证状态(需看到3个JournalNode进程)
    jps | grep JournalNode
    

五、初始化共享元数据

在**其中一台NameNode(如nn1)**上执行以下操作,初始化共享元数据:

  1. 格式化NameNode
    (首次配置需执行,格式化会清除NameNode数据,谨慎操作):

    hdfs namenode -format
    
  2. 初始化共享编辑日志
    nn1的元数据同步到JournalNode集群:

    hdfs namenode -initializeSharedEdits
    
  3. 同步元数据到Standby NameNode
    nn2上执行,将nn1的元数据复制到nn2

    hdfs namenode -bootstrapStandby
    

六、启动HDFS高可用集群

  1. 格式化ZooKeeper中的HA状态
    nn1上执行(仅首次配置需执行,用于初始化ZooKeeper中的HA状态):

    hdfs zkfc -formatZK
    
  2. 启动HDFS服务
    在任意节点上执行(启动所有HDFS进程,包括NameNode、DataNode、JournalNode):

    start-dfs.sh
    
  3. 验证NameNode状态
    使用haadmin命令查看NameNode状态(ActiveStandby状态应分别为不同节点):

    hdfs haadmin -getServiceState nn1  # 应返回Standby或Active
    hdfs haadmin -getServiceState nn2  # 应返回Standby或Active
    

    或通过Web UI(如http://nn1_host:9870http://nn2_host:9870)查看状态。

七、测试高可用性

  1. 模拟Active NameNode故障
    nn1上找到NameNode进程并杀死:

    jps | grep NameNode | awk '{print $1}' | xargs kill -9
    
  2. 验证自动故障转移
    等待10-30秒(ZooKeeper检测超时时间),再次检查NameNode状态:

    hdfs haadmin -getServiceState nn1  # 应返回Standby
    hdfs haadmin -getServiceState nn2  # 应返回Active
    

    此时nn2已自动切换为Active状态,集群继续提供服务。

八、客户端配置

在客户端节点(如提交MapReduce任务的机器)上,配置core-site.xmlhdfs-site.xml(内容与集群节点一致),客户端会自动检测并连接到Active NameNode。

通过以上步骤,即可在Ubuntu上实现HDFS高可用,确保NameNode节点故障时自动切换,保障集群持续运行。

0
看了该问题的人还看了