原生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安装的软件运行的进程
hdfs02192.168.174.112jdk、hadoopNameNode、DFSZKFailoverController(zkfc)
hdfs03192.168.174.113jdk、hadoopNameNode、DFSZKFailoverController(zkfc)
hdfs04192.168.174.114jdk、hadoopResourceManager
hdfs05192.168.174.115jdk、hadoopResourceManager
hdfs06192.168.174.116jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、QuorumPeerMain
hdfs07192.168.174.117jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、QuorumPeerMain
hdfs08192.168.174.118jdk、hadoop、zookeeperDataNode、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

转载于:https://my.oschina.net/epoch/blog/1633703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值