1.先实现node2免密登录node1
在node2下执行:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat id_dsa.pub >> authorized_keys
scp id_dsa.pub node1:`pwd`/node2.pub
在node1下执行:cat node2.pub >> authorized_keys
2.配置第二个NameNode节点
vi hdfs-site.xml
删除:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:50090</value>
</property>
添加:
<property> # mycluster是nameservices的一个逻辑名
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property> # nn1,nn2是namenodes的逻辑名
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property> # 通过rpc映射nn1和物理机地址
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property> # 通过rpc映射nn2和物理机地址
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<property> # 给浏览器访集群提供ip和端口
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property> # 给浏览器访集群提供ip和端口
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<property> # 指明JNs集群部署在哪些节点上,即JNN主机位置
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<property> # 实现故障转移时的代理位置
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property> # 主NameNode出现故障后,备用NameNode通过秘钥登录主NameNode立刻关闭NameNode状态,自己接管变成主节点
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property> # JNN保存日志的路径
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/journalnode</value>
</property>
<property> # 完成自动故障转移
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
vi core-site.xml
修改:
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/full</value>
</property>
修改成:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> # 修改成逻辑名
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/ha</value> # 修改路径为ha
</property>
<property> # zookeep的集群的指定
<name>ha.zookeeper.quorum</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
3.进行分发
执行:scp core-site.xml hdfs-site.xml node2:`pwd`
scp core-site.xml hdfs-site.xml node3:`pwd`
scp core-site.xml hdfs-site.xml node4:`pwd`
4.安装zookeeper
进入node2(zookeeper安装在node2、node3、node4)
tar zxvf zookeeper-3.4.6.tar.gz -C /opt/sxt/
配置zookeeper:
cd /opt/sxt/zookeeper-3.4.6/conf
改文件名:mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改dataDir=/tmp/zookeeper为/var/sxt/zk
再增加:
server.1=node2:2888:3888 # 指明zookeeper所在节点
server.2=node3:2888:3888
server.3=node4:2888:3888
分发到node3和node4:
scp -r zookeeper-3.4.6/ node3:`pwd`
scp -r zookeeper-3.4.6/ node4:`pwd`
5.创建步骤4增加的路径/var/sxt/zk
mkdir -p /var/sxt/zk
echo 1 > /var/sxt/zk/myid
上面2步操作需要在node3和node4上也执行一遍,分别echo 2和echo 3
6.配置zookeeper环境变量
vi + /etc/profile
增加:
export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6
修改:
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
分发文件:scp /etc/profile node3:/etc
scp /etc/profile node4:/etc
修改完全部读一下文件: . /etc/profile
7.集群配置完毕
8.开启zookeeper
执行:zkServer.sh start
查看状态:zkServer.sh status node4为主,node2,、node3为从
关闭:zkServer.sh stop
9.启动JNN(journalnode)用于两个NameNode同步数据(注意:一定要先于集群格式化完成)
在node1、node2、node3节点上执行:hadoop-daemon.sh start journalnode
10.运行JNN后,在node1或者node2上执行格式化操作,这里选择node1
hdfs namenode -format
再启动主节点:
hadoop-daemon.sh start namenode
11.把格式化的主节点的元数据信息拷贝到备用主节点,确保步骤9、步骤10 已经完成
再node2上执行:hdfs namenode -bootstrapStandby 以同步node1格式化后的元数据信息
12.active的节点(node1)在zookeeper服务器上完成注册,即在zookeeper服务器上创建一个节点
执行:hdfs zkfc -formatZK
成功后会自动在zookeeper客户端创建/hadoop-ha/mycluster
查看:执行 zkCli.sh 进去zookeeper客户端,执行 ls / 查看
13.启动集群!!!
在主节点node1执行: start-dfs.sh
14.启动后查看各个节点的进程:执行jps
在node4查看zookeeper客户端目录下的 /hadoop-ha/mycluster,会出现两个注册的节点[ActiveBreadCrumb, ActiveStandbyElectorLock],执行get /hadoop-ha/mycluster/ActiveBreadCrumb查看此节点下的数据
注意:关闭Hadoop集群和zookeeper集群后,在重新启动集群,只需要选启动zookeeper:zkServer.sh start,再启动Hadoop集群:start-dfs.sh即可,不需要再启动JNN集群,因为第一次搭建的时候已经创建了目录节点,start-dfs.sh会自动运行JNN
常用命令
1)停止主节点守护进程(主节点down):hadoop-daemon.sh stop namenode
2)启动主节点守护进程(主节点up):hadoop-daemon.sh start namenode
3)停止主节点zkfc物理进程(不会down,状态会从active切换到standby):hadoop-daemon.sh stop zkfc
4)关闭所有的角色进程:stop-dfs.sh
5)启动集群角色进程:start-dfs.sh
6)关闭zookeeper集群角色进程:zkServer.sh stop
7)进入zookeeper客户端:zkCli.sh
8)