一、前言
终于搭建了四台虚拟机,正式开始搭建Hadoop集群,目前是四台虚拟分别为:
node01(192.168.122.11),node02(192.168.122.12),node03(192.168.122.13),node04(192.168.122.14)
二、集群规划
规划搭建HDFS2.X HA:
角色划分如下:
节点
NN-1
NN-2
DN
ZK
ZKFC
JNN
RM
NM
node01
√
√
√
node02
√
√
√
√
√
√
node03
√
√
√
√
√
node04
√
√
√
√
三、搭建Hadoop HA集群
1.环境准备
- 依赖软件 ssh ,jdk
- 环境配置:
- ip地址配置(静态ip)
- hostname配置:修改/etc/hostname
- hosts映射配置:修改/etc/hosts
- 防火墙关闭:
sudo ufw disable
- ssh免密登陆:
四台虚拟机运行命令ssh-keygen -t rsa -P ""
生成密钥后,将node02、node03、node04的生成的id_rsa.pub公钥文件拷贝到node01里 (sudo scp id_rsa.pub node02@node02:/root/.ssh/id_rsa.pub.node02
),再将这些公钥追加到node01的authorized_keys(没有该文件新建一个)文件里,最后将生成的包含四个节点的秘钥的authorized_keys 复制到node02、node03、node04的.ssh目录下(sudo scp authorized_keys node01:node02:/home/node02/.ssh/
) - JAVA_HOME环境变量
- 虚拟机时间同步:
ntpdate cn.pool.ntp.org
hwclock --systohc
1. 安装zookeeper集群
先安装zookeeper集群是因为hadoop集群中需要配置zookeeper节点。
-
下载安装包 zookeeper-3.4.6.tar.gz
-
解压:
tar -zxvf /opt/software/zookeeper-3.4.6.tar.gz -C home/hadoop/app/
-
配置:
cd /home/hadoop/app/zookeeper-3.4.6/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/home/hadoop/app/zookeeper-3.4.6/tmp
在最后添加:
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
保存退出
然后创建一个tmp文件夹
mkdir /home/hadoop/app/zookeeper-3.4.6/tmp
echo 1 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid
-
将配置好的zookeeper拷贝到其他节点:
首先分别在node03、node04目录下创建一个hadoop目录:
sudo mkdir -p /home/hadoop/app
修改文件夹用户:
sudo chown node03:node03 /home/hadoop/app
拷贝至node03、node04节点:
scp -r /home/hadoop/app/zookeeper-3.4.6/node03@node03:/home/hadoop/app/
scp -r /home/hadoop/app/zookeeper-3.4.6/node04@node04:/home/hadoop/app/
注意:node03、node04对应/hadoop/zookeeper-3.4.6/tmp/myid内容
node03:
echo 2 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid
node04:
echo 3 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid
2. 安装Hadoop集群
-
下载安装包:因为网速较慢,下载的是hadoop-2.7.6.tar.gz 附:hadoop安装包下载地址
-
上传到虚拟机后解压:
tar -zxvf hadoop-2.7.6.tar.gz -C /home/hadoop/app/
-
配置相应环境变量
(1) 配置HADOOP_HOME环境变量:修改/etc/profile
export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.6
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
(2) 修改hadoo-env.sh mapred-env.sh yarn-env.sh的JAVA_HOME
-
配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves
fs.defaultFS hdfs://mycluster hadoop.tmp.dir /var/hadoop/tmp ha.zookeeper.quorum node02:2181,node03:2181,node04:2181
(1) core-site.xml
(2) hdfs-site.xml
<!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/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>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/leehan/.ssh</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(3) mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(4) yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 开启RM高可用 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
(5) slaves
node02
node03
node04
- 将node01节点的配置复制到node02、node03、node04上(注意权限问题,因为没有使用root 用户)
scp -r /home/hadoop/app/hadoop-2.7.6/ node02@node02:/home/hadoop/app
3. 启动集群
严格按照下面的步骤!!!
3.1启动zookeeper集群(分别在node02、node03、node04上执行)
在all slave上启动zookeeper服务:
cd /home/hadoop/app/zookeeper-3.4.6/bin/
./zkServer.sh start
可查看状态:一个leader,两个follower
zkServer.sh status
3.2 手动启动journalnode(分别在在node01、node02、node03上执行)
hadoop-daemon.sh start journalnode
运行jps命令检验,是否多了JournalNode进程。
***** 初次启动需要格式化,以后启动无需格式化。*****
3.3 格式化namenode
在node01上执行命令:
hdfs namenode -format
在node02上执行:
hdfs namenode -bootstrapStandby
3.4 格式化ZKFC(在node02上执行一次即可)
hdfs zkfc -formatZK
启动过程中出现报错Configuration has multiple addresses that match local node’s address. Please configure the system with dfs.nameservice.id and dfs.ha.namenode.id:
原因是/etc/hosts文件中配置了多个本机,所以最好不要127.0.0.1的信息。
3.5 启动hdfs(在node01上执行)
start-dfs.sh
这里出现了需要密码认证,原因是四台虚拟机的用户名不一样,所以无法认证,因此需要将虚拟机的用户名统一。
3.6 启动YARN
在node01上执行:
start-yarn.sh
node03-node04启动resourcemanager:
yarn-daemon.sh start resourcemanager
以后启动集群
集群启动:
all slave —-> zkServer.sh start node02 node03、node04
one master —->start-dfs.sh node01
one master —–>start-yarn.sh node01
backup master —->yarn-daemon.sh start resourcemanager node03、node04
正常集群启动后,
namenode上的jps后的进程有:
2648 ResourceManager
2553 DFSZKFailoverController
3036 NameNode
3325 Jps
datanode上的jps后进程有:
2353 NodeManager
2200 DataNode
2264 JournalNode
2137 QuorumPeerMain
2526 Jps
到此,hadoop-2.7.6配置完毕,可以统计浏览器访问:
http://node01:50070
NameNode 'node01:9000' (active)
http://node02:50070
NameNode 'node02:9000' (standby)
验证HDFS HA
首先向hdfs上传一个文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通过浏览器访问:http://192.168.1.202:50070
NameNode 'hadoop02:9000' (active)
这个时候hadoop02上的NameNode变成了active
在执行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile
刚才上传的文件依然存在!!!
手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
通过浏览器访问:http://192.168.1.201:50070
NameNode 'hadoop01:9000' (standby)
验证YARN:
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
OK,大功告成!!!
测试集群工作状态的一些指令 :
bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息
bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态
sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程
./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程