原生Hadoop HA分布式集群搭建

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 [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密

yarn(在hdfs04上执行)
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] yes PASSWORD 配置设备免密
    ssh-copy-id [email protected] 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

猜你喜欢

转载自my.oschina.net/epoch/blog/1633703