Zookeeper与Hadoop集成实践:实现高可用性与分布式协调
Zookeeper作为分布式协调服务,与Hadoop集成后可解决Hadoop集群的高可用性问题(如NameNode、ResourceManager故障转移),提升分布式任务的协调效率(如JobTracker与TaskTracker状态同步)。以下是具体集成步骤与关键配置:
JAVA_HOME环境变量。/opt/apache-zookeeper-3.7.0-bin)。cp /opt/apache-zookeeper-3.7.0-bin/conf/zoo_sample.cfg /etc/zookeeper/conf/zoo.cfg。zoo.cfg核心参数:tickTime=2000 # 心跳时间(毫秒) dataDir=/var/lib/zookeeper # 数据目录 clientPort=2181 # 客户端连接端口 initLimit=5 # Leader与Follower初始同步超时(心跳数) syncLimit=2 # Leader与Follower同步超时(心跳数) server.1=node1:2888:3888 # 集群节点1(格式:server.id=host:port1:port2) server.2=node2:2888:3888 # 集群节点2 server.3=node3:2888:3888 # 集群节点3 myid文件:在dataDir目录下为每个节点创建myid文件,内容为对应server.id中的id(如node1节点写入1)。/opt/apache-zookeeper-3.7.0-bin/bin/zkServer.sh start,通过zkServer.sh status验证节点状态(Leader/Follower)。HDFS HA通过Zookeeper实现NameNode的自动故障转移,核心配置在hdfs-site.xml中:
<property> <name>dfs.nameservices</name> <value>mycluster</value> <!-- HDFS集群名称 --> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> <!-- NameNode ID列表 --> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>namenode1:8020</value> <!-- NameNode1 RPC地址 --> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>namenode2:8020</value> <!-- NameNode2 RPC地址 --> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <!-- 客户端故障转移代理 --> </property> <property> <name>ha.zookeeper.quorum</name> <value>zk1:2181,zk2:2181,zk3:2181</value> <!-- Zookeeper集群地址 --> </property> 此外,需配置JournalNode(用于NameNode共享editslog),在hdfs-site.xml中添加:
<property> <name>dfs.journalnode.edits.dir</name> <value>/var/lib/hadoop/journalnode</value> <!-- JournalNode数据目录 --> </property> 启动JournalNode:hdfs journalnode(每个JournalNode节点执行)。
YARN HA通过Zookeeper实现ResourceManager的自动故障转移,核心配置在yarn-site.xml中:
<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> <!-- 启用HA --> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>mycluster</value> <!-- 集群ID --> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> <!-- ResourceManager ID列表 --> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>resourcemanager1</value> <!-- ResourceManager1主机名 --> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>resourcemanager2</value> <!-- ResourceManager2主机名 --> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>zk1:2181,zk2:2181,zk3:2181</value> <!-- Zookeeper集群地址 --> </property> hdfs namenode -format。start-dfs.sh。start-yarn.sh。zkServer.sh status(确保所有节点为Leader/Follower)。hdfs haadmin -getServiceState nn1(nn1为主NameNode)验证是否自动切换至备NameNode。yarn rmadmin -getServiceState rm1(rm1为主ResourceManager),模拟故障后验证自动切换。tickTime(心跳时间)、initLimit(初始同步超时)等参数,适应大规模集群;Hadoop的dfs.replication(副本数)可根据集群规模调整(如生产环境设为3)。dataDir数据,避免数据丢失。