本次尝试了HDFS HA完全分布式集群搭建,集群规划如下:
以下是本人成功搭建HDFS HA集群的步骤及踩过的坑
1在配置好JAVA JDK的前提下搭建zookeeper集群
①在node2节点下解压zookeeper包到node1节点虚拟机的某一目录(我尝试的和hadoop目录在一个目录)
tar -zxvf zookeeper-3.4.10
②修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
mv zoo_sample.cfg zoo.cfg
③修改zoo.cfg文件,添加如下内容(如果节点名不同需要做相应修改)
dataDir=/var/Andrea/zookeeper
server.1=node2:2888:3888
server.2=node3:2888:3888
server.3=node4:2888:3888
此处设置的server.之后的数字代表相应节点的ID号
④在dataDir目录下创建一个myid文件,在这个文件中写上当前节点ID号
此dataDir目录也就是zoo.cfg里dataDir后面设置的目录
如果没有这个目录,需要先创建这个目录
在/var下执行
mkdir -p Andrea/zookeeper
之后进入这个目录,用cat指令输入相应节点的ID号
⑤将配置好的zookeeper安装包拷贝到node3 node4
在zookeeper-3.4.10的父目录执行以下两条指令实现拷贝
scp -r zookeeper-3.4.10 root@node3:`pwd`
scp -r zookeeper-3.4.10 root@node4:`pwd`
在\var目录执行以下两条指令实现拷贝
scp -r Andrea root@node3:`pwd`
scp -r Andrea root@node4:`pwd`
⑥修改node3和node4的myid文件中的ID号为当前节点的ID号
⑦进入zookeeper-3.4.10\bin将每个节点启动zookeeper测试配置成果
使用以下指令分别进行启动和停止
./zkServer.sh start
./zkServer.sh stop
效果如下,如果成功启动会多一条如下进程
2配置免密登陆
① 所有节点执行 ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa生成公钥
② 在node01节点执行以下命令,将node01的公钥加入到其他节点的白名单中
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node3
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node4
③ 在node02节点执行以下命令,将node02的公钥加入到node1节点的白名单中
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
此步骤踩过的坑详见上一篇博文
3修改hdfs-site.xml配置文件
将此配置文件中加入如下内容
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
4修改core-site.xml配置文件
将此配置文件中加入如下内容
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
5修改slaves配置文件
将此配置文件修改为node2 node3 node4
注意:要竖着写,行末不能留空格
6将配置好的HDFS安装包拷贝到node2 node3 node4
在hadoop-2.6.5的父目录执行如下指令进行拷贝
scp -r hadoop-2.6.5 root@node2:`pwd`
scp -r hadoop-2.6.5 root@node3:`pwd`
scp -r hadoop-2.6.5 root@node4:`pwd`
注意:如果之前搭建过完全分布式系统,需要把其它节点的这个目录删除再进行拷贝。否则会出现The authenticity of host ‘node1 (192.168.112.130)’ can’t be established错误。我删除目录之后重新拷贝解决了此问题。
7格式化NameNode(创建目录以及文件)
① 在node1、node2、node3分别执行如下命令
hadoop-daemon.sh start journalnode
② 随机选择一台NameNode执行:
hdfs namenode -format
hadoop-daemon.sh start namenode
③ 另外一台NameNode节点执行:
hdfs namenode -bootstrapStandby
④在zkfc的两个节点执行
hdfs zkfc -formatZK
8关闭所有节点上的进程
stop-dfs.sh
9启动HDFS
start-dfs.sh
成功启动的效果图如下