原生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 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容