HDFS完整集群搭建思路
节点 | NN | JNN | DN | ZKFC | ZK |
node01 | √ | √ | √ | ||
node02 | √ | √ | √ | √ | √ |
node03 | √ | √ | √ | ||
node04 | √ | √ |
说明:
- JNN代替了伪分布式(单机)的SNN
流程
- 基础设施
ssh免密(免密原因:) 1)启动start-dfs.sh脚本的机器需要将公钥分发给别的节点 2)在HA模式下,每一个NN身边会启动ZKFC,ZKFC会用免密的方式控制自己和其他NN节点的NN状态
- 应用搭建
HA 依赖 ZK 搭建ZK集群
hadoop的配置文件
初始化启动
具体操作流程
- zk搭建流程
zookeeper 集群搭建 java语言开发 需要jdk 部署在node2,node3,node4 node02: tar xf zook....tar.gz mv zoo... /opt/bigdata cd /opt/bigdata/zoo.... cd conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg datadir=/var/bigdata/hadoop/zk server.1=node02:2888:3888 server.2=node03:2888:3888 server.3=node04:2888:3888 mkdir /var/bigdata/hadoop/zk echo 1 > /var/bigdata/hadoop/zk/myid vi /etc/profile export ZOOKEEPER_HOME=/opt/bigdata/zookeeper-3.4.6 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin . /etc/profile cd /opt/bigdata scp -r ./zookeeper-3.4.6 node03:`pwd` scp -r ./zookeeper-3.4.6 node04:`pwd` node03: mkdir /var/bigdata/hadoop/zk echo 2 > /var/bigdata/hadoop/zk/myid *环境变量 . /etc/profile node04: mkdir /var/bigdata/hadoop/zk echo 3 > /var/bigdata/hadoop/zk/myid *环境变量 . /etc/profile node02~node04: zkServer.sh start
zkServer.sh status 查看主从说明: server.数字 数字就是权重, echo 数字 > /var/bigdata/hadoop/zk/myid 也是对应权重
- 配置Hadoop
1.配置hadoop的core和hdfs core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node02:2181,node03:2181,node04:2181</value> </property> hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/var/bigdata/hadoop/ha/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/var/bigdata/hadoop/ha/dfs/data</value>
</property>#以下是 一对多,逻辑到物理节点的映射 <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>node01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node02:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node01:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node02:50070</value> </property> #以下是JN在哪里启动,数据存那个磁盘 <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/bigdata/hadoop/ha/dfs/jn</value> </property> #HA角色切换的代理类和实现方法,我们用的ssh免密 <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_dsa</value> </property> #开启自动化: 启动zkfc <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
2.分发配置
给每一台都分发
初始化:(手动启动)
1)先启动JN(三台) hadoop-daemon.sh start journalnode 2)选择一个NN 做格式化:hdfs namenode -format <只有第一次搭建做,以后不用做> 3)node01: hadoop-daemon.sh start namenode 4)node02: hdfs namenode -bootstrapStandby 5)格式化zk: hdfs zkfc -formatZK <只有第一次搭建做,以后不用做> 6) start-dfs.sh
使用验证
去看jn的日志和目录变化
目录: /opt/bigdata/hadoop-2.6.5/logs/hadoop-root-journalnode-ke03.log
node04
zkCli.sh ls / 启动之后可以看到锁: get /hadoop-ha/mycluster/ActiveStandbyElectorLock
杀死namenode 杀死zkfc
kill -9 xxx a)杀死active NN b)杀死active NN身边的zkfc c)shutdown activeNN 主机的网卡 : ifconfig eth0 down 2节点一直阻塞降级,查看日志报错,node02一直是standby状态,node01访问不通 如果恢复2上的网卡 ifconfig eth0 up 最终 1编程active
注意点:
- 当某一环节起不来时排除点
- 1.防火墙是否关闭
- 2.时间是否同步
- 3.如果前两个是后面环节发现,name需要关闭1.2,同时kill掉所有之前启动的进程。重新按照步骤操作、重新格式化