Hadoop HA分布式集群搭建
注意:apache提供的hadoop-2.7.5的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库,所以如果在64位的操作上安装hadoop-2.7.5就需要重新在64操作系统上重新编
hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,从hadoop-2.4.1开始解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。
集群规划
主机名 | IP | 安装的软件 | 运行的进程 |
---|---|---|---|
hdfs02 | 192.168.174.112 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc) |
hdfs03 | 192.168.174.113 | jdk、hadoop | NameNode、DFSZKFailoverController(zkfc) |
hdfs04 | 192.168.174.114 | jdk、hadoop | ResourceManager |
hdfs05 | 192.168.174.115 | jdk、hadoop | ResourceManager |
hdfs06 | 192.168.174.116 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hdfs07 | 192.168.174.117 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hdfs08 | 192.168.174.118 | jdk、hadoop、zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
说明:
在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。 Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。 hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。 在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。 通常配置奇数个JournalNode这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
关闭防火墙
sudo systemctl stop firewalld
创建新的用户
root用户操作
[root@hdfs02 ~]# adduser admin
为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略:
[root@hdfs02 ~]# passwd admin
更改用户 es 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
给新用户赋予sudo无秘权限
root用户操作
[root@hdfs02 ~]# vi /etc/sudoers
添加 : USERNAME ALL=(ALL) NOPASSWD:ALL
此时切换到新创建的用户(admin),以下的所有操作都将在admin用户下操作,所有的文件都上传到/home/admin 路径下
安装JDK
解压配置环境变量即可使用
[admin@hdfs02 ~]# sudo mkdir -p /opt/env
[admin@hdfs02 ~]# sudo chown -R admin:admin /opt/env
将jdk解压到env目录下
tar -zxvf jdk-8u131-linux-x64.tar.gz -C /opt/env
配置环境变量
export JAVA_HOME=/opt/env/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
[admin@hdfs02 ~]# source /etc/profile
#自JDK1.7之后 CLASSPATH 可以不配置
配置hosts
sudo vi /etc/hosts
192.168.174.112 hdfs02
192.168.174.113 hdfs03
192.168.174.114 hdfs04
192.168.174.115 hdfs05
192.168.174.116 hdfs06
192.168.174.117 hdfs07
192.168.174.118 hdfs08
以上的操作需要在每一台设备都要操作
安装zookeeper
根据我们的部署规划,我们将会在hdfs06,hdfs07,hdfs08下安装zookeeper集群。 接下来的操作在以上提到的这三台机器上执行。
上传zookeeper安装包并解压到相应的目录下
sudo mkdir -p /opt/zookeeper
sudo chown -R admin:admin /opt/zookeeper
tar -zxvf zookeeper-3.4.11.tar.gz -C /opt/zookeeper
sudo chown -R admin:admin /opt/zookeeper
修改配置文件
# cd /opt/zookeeper/zookeeper-3.4.11/conf/
# cp zoo_sample.cfg zoo.cfg
# vi zoo.cfg
修改:dataDir=/opt/zookeeper/data
在最后添加:
server.1=hdfs06:2888:3888
server.2=hdfs07:2888:3888
server.3=hdfs08:2888:3888
保存退出
然后创建一个data文件夹
mkdir /opt/zookeeper/data
最后穿件myid文件并追加内容
echo 1 > /opt/zookeeper/data/myid
将配置好的zookeeper拷贝到其他节点
# scp -r /opt/zookeeper/ root@hdfs07:/opt/
# scp -r /opt/zookeeper/ root@hdfs08:/opt/
去以上两台机器上将文件的权限修改为admin
sudo chown -R admin:admin /opt/zookeeper
注意:修改hdfs07、hdfs08对应/opt/zookeeper/data/myid内容
hdfs07: echo 2 > /opt/zookeeper/data/myid
hdfs08: echo 3 > /opt/zookeeper/data/myid
安装Hadoop
免密策略
hdfs的免密策略
根据我们的部署规划,我们在hdfs02,hdfs03,hdfs06,hdfs07,hdfs08上启动了相应的进程。 因为我们启动想要在hdfs02上启动hdfs,那么我们其他的机器就要对hdfs02免密,因为hdfs02要通过ssh去相应的机器上启动相应的进程。 同时不要忘了,自己还在在本机上启动namenode,所以还要对自己免密。
yarn的免密策略
根据我们的部署规划,我们在hdfs04,hdfs05,hdfs06,hdfs07,hdfs08上启动了相应的进程。 因为我们启动想要在hdfs04上启动yarn,那么我们其他的机器就要对hdfs04免密,因为hdfs04要通过ssh去相应的机器上启动相应的进程。 但是yarn的启动resourcemanager方式和hdfs启动namenode的方式有些不同,yarn启动resourcemanager的方式是启动的本地进程。 而通过ssh去启动的nodemanager,而且standby resourcemanager 也需要手动单独去启动
ssh 的配置命令
# 以下命令只在hdfs02和hdfs04上执行即可
ssh_keygen –t rsa 一路回车,什么都不输入
sudo service sshd start/stop/status/restart
sudo chkconfig sshd on 设置SSH开机启动
# 接下来将我们的密钥发送到需要对我们免密的服务器
hdfs(在hdfs02上执行)
ssh-copy-id admin@192.168.174.112 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.113 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.116 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.117 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.118 yes PASSWORD 配置设备免密
yarn(在hdfs04上执行)
ssh-copy-id admin@192.168.174.116 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.117 yes PASSWORD 配置设备免密
ssh-copy-id admin@192.168.174.118 yes PASSWORD 配置设备免密
上传Hadoop安装包并解压到相应的目录下
# 创建data目录用于存放hdfs的文件
sudo mkdir -p /opt/hadoop/data
sudo chown -R admin:admin /opt/hadoop
# tar -zxvf hadoop-2.7.5-x64.tar.gz -C /opt/hadoop/
创建journaldata目录用于存放journal的数据
只需要在hdfs06,hdfs07,hdfs08上创建即可
sudo mkdir -p /opt/hadoop/journaldata
sudo chown -R admin:admin /opt/hadoop
修改Hadoop配置
# hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下
# cd /opt/hadoop/hadoop-2.7.5/etc/hadoop
File1:hadoop-env.sh
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/env/jdk1.8.0_131
File2:core-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs02://ns1/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/data</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hdfs06:2181,hdfs07:2181,hdfs08:2181</value>
</property>
</configuration>
File3:hdfs-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hdfs02:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hdfs02:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hdfs03:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hdfs03:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hdfs06:8485;hdfs07:8485;hdfs08:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/admin/.ssh/id_rsa</value><!-- 这个是安装用户的ssh的id_rsa文件的路径,我使用的是admin用户 -->
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
File4:mapred-site.xml
mv mapred-site.xml.template mapred-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
File5:yarn-site.xml
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/yarn-site.xml
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</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>hdfs04</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hdfs05</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hdfs06:2181,hdfs07:2181,hdfs08:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
File6:slaves
slaves是指定子节点的位置,因为要在hdfs01上启动HDFS、在hdfs03启动yarn。
所以hdfs02上的slaves文件指定的是datanode的位置。
hdfs06
hdfs07
hdfs08
hdfs04上的slaves文件指定的是nodemanager的位置
hdfs06
hdfs07
hdfs08
由于我们现实生产环境中,为了避免过多的网络开销,我惊经常将nodemanager和datanode部署在相同节点上,所以slaves的文件配置也相同
vi /opt/hadoop/hadoop-2.7.5/etc/hadoop/slaves
删除localhost
添加如下:
hdfs06
hdfs07
hdfs08
将配置好的hadoop发送到其他节点
# scp -r /opt/hadoop/ root@hdfs03:/opt/
# scp -r /opt/hadoop/ root@hdfs04:/opt/
# scp -r /opt/hadoop/ root@hdfs05:/opt/
# scp -r /opt/hadoop/ root@hdfs06:/opt/
# scp -r /opt/hadoop/ root@hdfs07:/opt/
# scp -r /opt/hadoop/ root@hdfs08:/opt/
# 记得将这几台设备的文件的权限交给admin用户
sudo chown -R admin:admin /opt/hadoop
启动Hadoop HA集群
启动zookeeper
分别在在号hdfs06、hdfs07、hdfs08上执行
# cd /opt/zookeeper/zookeeper-3.4.11/bin/
# ./zkServer.sh start
#查看状态:一个leader,两个follower
# ./zkServer.sh status
启动journalnode(分别在hdfs06、hdfs07、hdfs08上执行)
首次启动要单独启动这个进程,以后就不需要了。(因为我们在进行namenode format时需要连接JournalNode监听的8485端口)
# cd /opt/hadoop/hadoop-2.7.5
# sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,hdfs06、hdfs07、hdfs08上多了JournalNode进程
格式化HDFS(在hdfs02上执行即可)
# cd /opt/hadoop/hadoop-2.7.5
#在hdfs02上执行命令:
# bin/hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/opt/hadoop/data,然后将/opt/hadoop/data拷贝到hdfs03的/opt/hadoop/下。
scp -r /opt/hadoop/data hdfs03:/opt/hadoop/
##也可以这样,建议hdfs namenode -bootstrapStandby
格式化ZKFC(在hdfs02上执行即可)
# bin/hdfs zkfc -formatZK
启动HDFS(在hdfs02上执行即可)
# sbin/start-dfs.sh
启动YARN
注意:是在hdfs04上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
# cd /opt/hadoop/hadoop-2.7.5
# sbin/start-yarn.sh
# 在hdfs05上单独启动resourcemanager
# cd /opt/hadoop/hadoop-2.7.5
# sbin/yarn-daemon.sh start resourcemanager
访问Hadoop页面监控
http://192.168.174.112:50070
NameNode 'hdfs02:9000' (active)
http://192.168.174.113:50070
NameNode 'hdfs03:9000' (standby)
http://192.168.174.114:8088
ResourceManager 'hdfs04:8088' (active)
http://192.168.174.115:8088
ResourceManager 'hdfs05:8088' (standby)
验证HA集群
验证HDFS HA
首先向hdfs上传一个文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9 <pid of NN>
通过浏览器访问:http://192.168.174.113:50070
NameNode 'hdfs03:9000' (active)
这个时候hdfs03上的NameNode变成了active
在执行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2018-01-06 15:36 /profile
刚才上传的文件依然存在!!!
手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
通过浏览器访问:http://192.168.174.112:50070
NameNode 'hdfs02:9000' (standby)
验证YARN
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.5.jar wordcount /profile /out
高可用集群的安装
centos安装 zip unzip 命令 yum -y install zip unzip