20190711-高可用HA集群环境搭建

本文搭建了一个由4个节点(node1、node2、node3、node4)构成的Hadoop-ha&zk集群.

HDFS 2.0 HA

主备NameNode

解决单点故障

主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换

所有DataNode同时向两个NameNode汇报数据块信息

两种切换选择

手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合

自动切换:基于Zookeeper实现

基于Zookeeper自动切换方案

ZooKeeper Failover Controller:监控NameNode健康状态,

并向Zookeeper注册NameNode

NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active

1、基础集群的搭建

2、集群网络配置

    开启虚拟机,修改配置文件 输入如下命令

ls  -l  /etc/sysconfig/network-scripts/ifcfg-ens33

vi /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=static

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=ens33

UUID=2fd4e3fc-509d-47b2-a833-e55f360a4661

DEVICE=ens33

ONBOOT=yes

IPADDR=192.168.4.110

NETMASK=255.255.255.0

GATEWAY=192.168.4.100

DNS1=8.8.8.8

DNS2=8.8.8.4

需要修改的地方有:

BOOTPROTO=static#dhcp改为static(修改)

ONBOOT=yes#开机启用本配置,一般在最后一行(修改)

IPADDR=192.168.4.110 #静态IP(增加)

GATEWAY=192.168.4.100 #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)

NETMASK=255.255.255.0#子网掩码(增加)

#DNS1=8.8.8.8

重启网卡

service network restart

3、集群SSH免密登陆设置

3.1  创建hadoop用户

为三个节点分别创建相同的用户hadoop,并在以后的操作均在此用户下操作,操作如下:

#useradd -m hadoop

#passwd hadoop

为hadoop添加sudo权限,切换到root用户

#visudo

在该行root ALL=(ALL) ALL下添加hadoop ALL=(ALL) ALL保存后退出,并切换回hadoop用户

#su hadoop

注意事项:四个节点的用户名必须相同,不然以后会对后面ssh及hadoop集群搭建产生巨大影响

3.2  hosts文件设置

为了不直接使用IP,可以通过设置hosts文件达到ssh  node1这样的的效果(四个节点设置相同)

$sudo vim /etc/hosts

在文件尾部添加如下行,保存后退出:

192.168.4.110  node1

192.168.4.120  node2

192.168.4.130  node3

192.168.4.140  node4

#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

#::1        localhost localhost.localdomain localhost6 localhost6.localdomain6

注意事项:不要在127.0.0.1后面添加主机名,如果加了master,会造成后面hadoop的一个很坑的问题,在slave节点应该解析出masterIP的时候解析出127.0.0.1,造成hadoop搭建完全正确,但是系统显示可用节点一直为0。

3.3  hostname修改

centos7默认的hostname是localhost,为了方便将每个节点hostname分别修改为node1、node2、node3、node4(以下以node1节点为例)。

$sudo hostnamectl set-hostname node1

重启terminal,然后查看:$hostname

3.3  ssh设置

设置node1节点和node2、node3、node4节点之间的双向ssh免密通信,下面以node1节点ssh免密登陆其它节点设置为例,进行ssh设置介绍(以下操作均在node1机器上操作):

[在node1节点设置完后,登录node2、node3、node4节点分别进行设置]

首先生成node1的rsa密钥:$ssh-keygen -t rsa

设置全部采用默认值进行回车

将生成的rsa追加写入授权文件:$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

给授权文件权限:$chmod 600  ~/.ssh/authorized_keys

进行本机ssh测试:$ssh node1正常免密登陆后所有的ssh第一次都需要密码,此后都不需要密码

将node1上的authorized_keys传到node2

sudo scp ~/.ssh/id_rsa.pub hadoop@node2:~/

登陆到node2操作:$ssh node2输入密码登陆

$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

修改authorized_keys权限:$chmod 600  ~/.ssh/authorized_keys

退出node2:$exit

进行免密ssh登陆测试:$ssh node2

4、java安装

目的:hadoop是基于Java的,所以要安装配置Java环境(三个节点均需要操作,以下以node1节点为例)

下载并安装:$sudo yum install java-1.8.0-openjdk  java-1.8.0-openjdk-devel

验证是否安装完成:$java -version

配置环境变量,修改~/.bashrc文件,添加行: export JAVA_HOME=/usr/lib/jvm/java-1.8.0

使环境变量生效:$source ~/.bashrc

5、Hadoop安装配置

目的:获得正确配置的完全分布式Hadoop集群(以下操作均在node1主机下操作)

安装前 四台节点都需要需要关闭防火墙和selinux

$sudo systemctl stop firewalld.service

$sudo systemctl disable firewalld.service

5.1  Hadoop安装

首先在node1节点进行hadoop安装配置,之后使用scp传到node2、node3、node4。

下载Hadoop二进制源码至node1,下载地址,并将其解压在~/ 主目录下

$tar -xvf ~/hadoop-2.5.2.tar -C ~/

$mv ~/hadoop-2.5.2/* ~/hadoop/

5.2  Hadoop的node节点配置

配置hadoop的配置文件core-site.xml  hdfs-site.xml  mapred-site.xml  yarn-site.xml  slaves(都在~/hadoop/etc/hadoop文件夹下)

$cd ~/hadoop/etc/hadoop

$vim core-site.xml其他文件相同,以下为配置文件内容:

1.core-site.xml

<property>

  <name>fs.defaultFS</name>

  <value>hdfs://mycluster</value>

</property>

<property>

  <name>ha.zookeeper.quorum</name>

  <value>node1:2181,node2:2181,node3:2181</value>

</property>

2.hdfs-site.xml

<property>

  <name>dfs.nameservices</name>

  <value>mycluster</value>

</property>

<property>

  <name>dfs.ha.namenodes.mycluster</name>

  <value>nn1,nn2</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.mycluster.nn1</name>

  <value>node1:8020</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.mycluster.nn2</name>

  <value>node2:8020</value>

</property>

<property>

  <name>dfs.namenode.http-address.mycluster.nn1</name>

  <value>node1:50070</value>    

</property>

<property>

  <name>dfs.namenode.http-address.mycluster.nn2</name>

  <value>node2:50070</value>

</property>

<property>

  <name>dfs.namenode.shared.edits.dir</name>

  <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</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>

<property>

  <name>dfs.ha.fencing.ssh.private-key-files</name>

  <value>~/.ssh/id_rsa</value>

</property>

<property>

  <name>dfs.ha.automatic-failover.enabled</name>

  <value>true</value>

</property>



5.3  Hadoop的其他节点配置

此步骤的所有操作仍然是在node1节点上操作,以node1节点在node2节点上配置为例

复制hadoop文件至node2:$scp -r ~/hadoop hadoop@slave2:~/

5.4  Hadoop环境变量配置

配置环境变量,修改~/.bashrc文件,添加行(每个节点都需要此步操作,以node1节点为例):

#hadoop environment vars

export HADOOP_HOME=/home/hadoop/hadoop

export HADOOP_INSTALL=$HADOOP_HOME

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

使环境变量生效:$source ~/.bashrc


6.0  Zookeeper安装配置

配置环境变量,修改~/.bashrc文件,添加行(每个节点都需要此步操作,以node1节点为例):

zookeeper安装目录  /home/hadoop/zookeeper

修改conf/zoo.cfg

dataDir=/home/hadoop/zookeeper/zk

server.1=0.0.0.0:2888:3888  (注意:本机地址要配置成0.0.0.0,node2)

server.2=node3:2888:3888

server.3=node4:2888:3888

创建目录: mkdir  /home/hadoop/zookeeper/zk

创建文件:  echo 1 >> myid     //数字根据节点规划 ,以node2为例


拷贝多台节点

Scp –r 拷贝 目录

修改myid

6.1  Zookeeper环境变量配置

export HADOOP_HOME=/home/hadoop/hadoop

export HADOOP_INSTALL=$HADOOP_HOME

export HADOOP_MAPRED_HOME=$HADOOP_HOME

export HADOOP_COMMON_HOME=$HADOOP_HOME

export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

export ZK_HOME=/home/hadoop/zookeeper

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ZK_HOME/bin:$ZK_HOME/sbin


拷贝多台节点

scp ~/.bashrc  node2:~

scp ~/.bashrc node3:~

scp ~/.bashrc node4:~

使环境变量生效:$source ~/.bashrc

6.2  启动Zookeeper集群(node2、node3、node4)

同时启动三台机器 :zkServer.sh start

查看zookeeper服务:zkServer.sh status

从节点状态:ZooKeeper JMX enabled by default

Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg

Mode: follower

主节点状态:ZooKeeper JMX enabled by default

Using config: /home/hadoop/zookeeper/bin/../conf/zoo.cfg

Mode: leader

6.3  启动journalnode服务(node1、node2、node3)

  hadoop-daemon.sh start journalnode

成功启动后:执行jps命令查看服务

9565 JournalNode

8558 QuorumPeerMain

9599 Jps

注意:需要先启动 journalnode服务 然后再进行hadoop格式化


6.4  最后一步

配置文件:集群中要同步!!!

启动zookeeper集群

zkServer.sh start  ||  zkServer.sh status

hadoop-daemon.sh start journalnode   [在node1、node2、node3上执行]

第一台NN:

hdfs namenode –format  [在node1、node2上执行]

hadoop-daemon.sh start namenode [在node1上执行]

另一台NN:

hdfs namenode –bootstrapStandby  [在node上2执行]

hadoop-daemon.sh start namenode  [在node2上执行]

stop-dfs.sh   ||    start-dfs.sh   [在node1上重启集群]

最后一步格式化zkfc

先在node2节点启动    zkCli.sh

然后在node1节点格式化zkfc:     hdfs  zkfc   –formatZK

在node2节点查看集群详情: ls  /

[zk: localhost:2181(CONNECTED) 0]  ls /

[zookeeper, hadoop-ha]

[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha/mycluster

[ActiveBreadCrumb, ActiveStandbyElectorLock]

[zk: localhost:2181(CONNECTED) 2] get /hadoop-ha/mycluster

cZxid = 0x400000004

ctime = Sat Jul 13 09:02:24 EDT 2019

mZxid = 0x400000004

mtime = Sat Jul 13 09:02:24 EDT 2019

pZxid = 0x40000003d

cversion = 30

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 0

numChildren = 2

[zk: localhost:2181(CONNECTED) 3]

注意 :第二次以后启动只需要

1.启动zk

2.start-dfs.sh


Web浏览器查看集群管理界面

node1:50070

node2:50070

问题纪录:

1.多次格式化集群会出现问题 ,解决办法是手工将四个节点的name、data文件下文件清空

    /home/hadoop/hadoop/hdfs/ha/dfs/name/XXX

    /home/hadoop/hadoop/hdfs/ha/dfs/data/XXX

然后在node1、node2、node3启动   hadoop-daemon.sh start journalnode

然后在node1、node2节点重新格式化namenode   [hdfs namenode –format]

如果还有问题,删除以下目录缓存文件或者重启四台机器

/tmp/hadoop/dfs/journalnode/mycluster



如果以上办法都不行则根据报错信息收工修改

view /home/hadoop/hadoop/logs/hadoop-hadoop-namenode-node1.log

This node has namespaceId '1252632511 and clusterId 'CID-614ab438-d36e-4e37-8c20-a631ee8a1783' but the requesting node expected '276561900' and 'CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83'

/tmp/hadoop/dfs/journalnode/mycluster/current/VERSION 中的 namespaceID、clusterID

#Sat Jul 13 08:22:37 EDT 2019

namespaceID=276561900

clusterID=CID-8fd68be0-6c4d-4cde-a171-34397ce9cd83

cTime=0

storageType=JOURNAL_NODE

layoutVersion=-57

~

~



2.配置zookeeper时出现问题 ,原因是zookeeper文件组权限及文件拥有者

sudo chmod -R  777  /home/hadoop/zookeeper   [改变文件权限]

sudo chown hadoop:hadoop  /home/hadoop/zookeeper [改变文件拥有者]


3.在格式化node1节点zkfc时出现连接拒绝问题

 hdfs zkfc  –formatZK

原因是需要先在node2、node3、node4节点启动zk服务  zkServer.sh  start,然后在node2节点运行zkCli.sh,最后在node1节点格式化zkfc 

4. 启动namenode 、datanode、或journalnode若有报错

则到该目录下查看相应的错误日志 /home/hadoop/hadoop/logs

zookeeper错误日志 在当前执行zk命令的目录下查看 zookeeper.out

5.ha环境配置好后,以后只需要启动zk和start-dfs.sh服务即可

   在node2、node3、node4机器启动zk服务  [zkServer.sh start]

   在node1 机器启动hdfs服务  start-dfs.sh

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

推荐阅读更多精彩内容