Hadoop Hbase HA高可用集群搭建

本文用以记录Hadoop、Hbase HA高可用集群搭建

基础环境准备
根据前面hadoop集群搭建hbase集群搭建添加外部zookeeper集群

下载zookeeper: zookeeper-3.4.13

zookeeper安装

1、下载及安装
解压到/home/zookeeper/目录下:

tar -zxvf zookeeper-3.4.13.tar.gz -C /home/zookeeper/

2、拷贝 zoo_sample.cfg
进入zookeeper的conf目录,拷贝zoo_sample.cfg并重命名为zoo.cfg :

cd zookeeper-3.4.13/conf/
cp zoo_sample.cfg zoo.cfg

3、修改 zoo.cfg

vi zoo.cfg

修改如下,若原文件没有dataDir则直接添加:

dataDir=/home/zookeeper/zookeeper-3.4.13/data/zkData
//在最后添加,指定zookeeper集群主机及端口,机器数必须为奇数
server.1=hadoop-master:2888:3888
server.2=hadoop-slave1:2888:3888
server.3=hadoop-slave2:2888:3888

4、创建并编辑myid
//在zookeeper根目录下创建zoo.cfg中配置的目录

mkdir data/zkData/ -p
//创建并编辑文件
vi myid
//输入1,即表示当前机器为在zoo.cfg中指定的server.1
1
//保存退出
:wq

5、拷贝zookeeper到其他机器
上述操作是在hadoop-master机器上进行的,要将zookeeper拷贝到其他zookeeper集群机器上:

cd /home/zookeeper
scp -r zookeeper-3.4.13/ hadoop-slave1:/home/zookeeper/
scp -r zookeeper-3.4.13/ hadoop-slave2:/home/zookeeper/

6、修改其他机器的myid文件
myid文件是作为当前机器在zookeeper集群的标识,这些标识在zoo.cfg文件中已经配置好了,但是之前在hadoop-master这台机器上配置的myid为1,所以还需要修改其他机器的myid文件:

//在hadoop-slave1机器上
echo 2 > /home/zookeeper/zookeeper-3.4.13/data/zkData/myid
//在hadoop-slave2机器上
echo 3 > /home/zookeeper/zookeeper-3.4.13/data/zkData/myid

7、配置环境变量 vim /etc/profile

添加:
export ZOOKEEPER_HOME=/home/zookeeper/zookeeper-3.4.13
export PATH=$PATH:$ZOOKEEPER_HOME/bin
其它服务器同样配置

配置生效 source /etc/profile
8、启动zookeeper集群

cd zookeeper-3.4.11/bin/
//分别在master188、master189、slave190上启动
/home/zookeeper/zookeeper-3.4.13/bin/zkServer.sh start

//查看状态
/home/zookeeper/zookeeper-3.4.13/bin/zkServer.sh  status
三台机器的zookeeper状态必须只有一个leader,其他都是follower。

//查看进程,若有QuorumpeerMain,则启动成功
jps
//停止
/home/zookeeper/zookeeper-3.4.13/bin/zkServer.sh stop

hadoop添加zookeeper

1、配置core-site.xml

添加:
  <!-- 指定ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop-master:2181,hadoop-slave1:2181,hadoop-slave2:2181</value>
  </property>
修改:
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://hadoop-master:9000</value>
    </property> 
为:
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://ns1</value>
    </property> 

2、配置hdfs-site.xml

<configuration>
  <!-- 指定副本数,不能超过机器节点数  -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>

  <!-- 为namenode集群定义一个services name -->
  <property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
  </property>

  <!-- nameservice 包含哪些namenode,为各个namenode起名 -->
  <property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>hadoop-master,hadoop-slave1</value>
  </property>

  <!-- 名为hadoop-master的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
  <property>
    <name>dfs.namenode.rpc-address.ns1.hadoop-master</name>
    <value>hadoop-master:9000</value>
  </property>

  <!-- 名为hadoop-slave1的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
  <property>
    <name>dfs.namenode.rpc-address.ns1.hadoop-slave1</name>
    <value>hadoop-slave1:9000</value>
  </property>

  <!--名为hadoop-master的namenode的http地址和端口号,用来和web客户端通讯 -->
  <property>
    <name>dfs.namenode.http-address.ns1.hadoop-master</name>
    <value>hadoop-master:50070</value>
  </property>

  <!-- 名为hadoop-slave1的namenode的http地址和端口号,用来和web客户端通讯 -->
  <property>
    <name>dfs.namenode.http-address.ns1.hadoop-slave1</name>
    <value>hadoop-slave1:50070</value>
  </property>

  <!-- namenode间用于共享编辑日志的journal节点列表 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop-master:8485;hadoop-slave1:8485;hadoop-slave2:8485/ns1</value>
  </property>

  <!-- 指定该集群出现故障时,是否自动切换到另一台namenode -->
  <property>
    <name>dfs.ha.automatic-failover.enabled.ns1</name>
    <value>true</value>
  </property>

  <!-- journalnode 上用于存放edits日志的目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/hadoop/tmp/data/dfs/journalnode</value>
  </property>

  <!-- 客户端连接可用状态的NameNode所用的代理类 -->
  <property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <!-- 一旦需要NameNode切换,使用ssh方式进行操作 -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>

  <!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置 -->
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>

  <!-- connect-timeout超时时间 -->
  <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>

  <property>
       <name>dfs.name.dir</name>
       <value>/home/hadoop/hadoop/hdfs/name</value>
  </property>

  <property>
       <name>dfs.data.dir</name>
       <value>/home/hadoop/hadoop/hdfs/data</value>
  </property>
</configuration>

3、配置 mapred-site.xml

取消:
 <!-- <property>
        <name>mapred.job.tracker</name>
        <value>http://hadoop-master:9001</value>
  </property>-->

4、配置 yarn-site.xml

<configuration>
  <!-- 启用HA高可用性 -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <!-- 指定resourcemanager的名字 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yrc</value>
  </property>
  <!-- 使用了2个resourcemanager,分别指定Resourcemanager的地址 -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <!-- 指定rm1的地址 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hadoop-master</value>
  </property>
  <!-- 指定rm2的地址  -->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hadoop-slave1</value>
  </property>
  <!-- 指定当前机器hadoop-master作为rm1 -->
  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm1</value>
  </property>
  <!-- 指定zookeeper集群机器 -->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hadoop-master:2181,hadoop-slave1:2181,hadoop-slave2:2181</value>
  </property>
  <!-- NodeManager上运行的附属服务,默认是mapreduce_shuffle -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

5、vi slaves

hadoop-master
hadoop-slave1
hadoop-slave2

拷贝hadoop到其他机器

1、拷贝

scp -r /home/hadoop/hadoop hadoop-slave1:/home/hadoop/
scp -r /home/hadoop/hadoop hadoop-slave2:/home/hadoop/

2、修改yarn-site.xml
在hadoop-slave1机器,即ResourceManager备用主节点上修改如下属性,表示当前机器作为rm2::

  <property>
    <name>yarn.resourcemanager.ha.id</name>
    <value>rm2</value>
  </property>

同时删除hadoop-slave2机器上的该属性对,因为hadoop-slave2机器并不作为ResourceManager。

Hadoop启动

1、启动zookeeper

zkServer.sh start

2、启动所有Journalnode(建议一台台启动,切记不能使用hadoop-daemons.sh批量启动“带s的”,只需启动在hdfs-site.xml(dfs.namenode.shared.edits.dir)配置的qjournal节点)

hadoop-daemon.sh start  journalnode

3、格式化namenode(从网页复制可能会有问题,建议手动输入,仅第一次启动操作)

# 首先在master1上格式化 
hdfs namenode -format
# 然后启动master1的namenode进程
hadoop-daemon.sh start namenode
# 然后再在master2上同步master1的namenode元数据(注:必须按照此顺序,不能直接启动master2,否则如果直接启动master2的namenode导致影响HA模式) 
hdfs namenode -bootstrapStandby
# 格式化 zkfc(在master1即可)(注意“-”全角半角,这里直接复制会有问题,最好手动输入)
hdfs zkfc -formatZK

4、启动HDFS、YARN、ZookeeperFailoverController

start-dfs.sh
// jps验证,显示NameNode和DataNode
start-yarn.sh
// jps 验证,显示ResourceManager和NodeManager

5、启动resourcemanager(hadoop-master、hadoop-slave1)

yarn-daemon.sh start resourcemanager

6、启动zkfc来监控NN状态(在master1、master2)

hadoop-daemon.sh start zkfc

7、检查master的HA节点状态(其中nn1,nn2在hdfs-site.xml中dfs.namenode.rpc-address.emr-cluster.nn1指定)

hdfs haadmin -getServiceState nn1

Apache hdfs官方文档

启动命令:

# master1
start-all.sh
hadoop-daemon.sh start zkfc
# master2
yarn-daemon.sh start resourcemanager
hadoop-daemon.sh start zkfc

停止命令:

# master1
stop-all.sh
hadoop-daemon.sh stop zkfc
# master2
yarn-daemon.sh stop resourcemanager
hadoop-daemon.sh stop zkfc

启动所有进程显示:

image

错误处理:
1、NameNode is not formatted

原因:  Path /home/hadoop/hadoop/hdfs/name should be specified as a URI in configura
tion files.
方法:把dfs.namenode.name.dir、dfs.datanode.data.dir的原路径格式如/usr/mywind/name改成file:/usr/mywind/name,即使用完全路径。
还有个原因:格式化命令复制进去运行报错,手动输入正常

测试
wordcount程序测试,在本地创建一个测试文件,并上传到hdfs上

#https:// 为下面文字加颜色
https://

#创建一个测试文件
 vim test.txt 
#上传到hdfs上
hadoop fs -put test.txt /input
#查询hdfs上面是否存在input文件
hadoop fs -ls /input
#计算
 hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /input /output1
#查看输出结果
hadoop fs -cat /output1/part*

image

Hbase安装配置
进入/home/hbase/hbase/conf/目录,修改配置文件:
1、配置 hbase-env.sh

//配置JDK
export JAVA_HOME=/usr/java/

//保存pid文件
export HBASE_PID_DIR=/home/hbase/hbase/data/hbase/pids

//修改HBASE_MANAGES_ZK,禁用HBase自带的Zookeeper,因为我们是使用独立的Zookeeper
export HBASE_MANAGES_ZK=false

2、配置 hbase-site.xml

<configuration>
  <!-- 设置HRegionServers共享目录,请加上端口号 -->
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://master188:9000/hbase</value>
  </property>

  <!-- 指定HMaster主机 -->
  <property>
    <name>hbase.master</name>
    <value>hdfs://master188:60000</value>
  </property>

  <!-- 启用分布式模式 -->
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>

  <!-- 指定Zookeeper集群位置 -->
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop-master:2181,hadoop-slave1:2181,hadoop-slave2:2181</value>
  </property>

  <!-- 指定独立Zookeeper安装路径 -->
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/zookeeper/zookeeper-3.4.13</value>
  </property>

  <!-- 指定ZooKeeper集群端口 -->
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
</configuration>

3)vi regionservers
修改regionservers文件,因为当前是使用独立的Zookeeper集群,所以要指定RegionServers所在机器:

hadoop-master
hadoop-slave1
hadoop-slave2

4)创建pid文件保存目录
在/home/hbase/hbase/目录下:

mkdir data/hbase/pids -p

3、拷贝HBase到其他机器

scp -r /home/hbase/hbase/ hadoop-slave1:/home/hadoop/
scp -r /home/hbase/hbase/ hadoop-slave2:/home/hadoop/

4、启动HBase
在主节点上启动HBase(主节点指NameNode状态为active的节点,非指文中的机器声明):

/home/hbase/hbase/bin/start-hbase.sh

5、查看HMaster、Regionserver进程是否启动

jps
注意:此时Hadoop集群应处于启动状态,并且是在主节点执行start-hbase.sh启动HBase集群,否则HMaster进程将在启动几秒后消失,
而备用的HMaster进程需要在备用主节点单独启动,命令是:./hbase-daemon.sh start master。

在备用主节点启动HMaster进程,作为备用HMaster:
/home/hbase/hbase/bin/hbase-daemon.sh start master

5、HA高可用测试

在浏览器中输入 ip:16010 ,查看主节点和备用主节点上的HMaster的状态,在备用主节点的web界面中,
可以看到“Current Active Master: master188”,表示当前HBase主节点是master188机器;

主节点--->备用主节点
这里的主节点指使用start-hbase.sh命令启动HBase集群的机器

kill掉主节点的HMaster进程,在浏览器中查看备用主节点的HBase是否切换为active;

若上述操作成功,则在主节点启动被杀死的HMaster进程:

/home/hbase/hbase/bin/hbase-daemon.sh start master

然后,kill掉备用主节点的HMaster进程,在浏览器中查看主节点的HBase是否切换为active,若操作成功,则HBase高可用集群搭建完成;

6、HBase基本操作

//启动HBase
[root@vnet ~] start-hbase.sh

//进入HBase Shell
[root@vnet ~] hbase shell

//查看当前HBase有哪些表
hbase(main):> list

//创建表t_user,cf1和cf2是列族,列族一般不超过3个
hbase(main):> create 't_user','cf1','cf2'

//获得表t_user的描述信息
hbase(main):> describe 't_user'

//禁用表
hbase(main):> disable 't_user'

//删除表,删除表之前要先把表禁用掉
hbase(main):> drop 't_user'

//查询表是否存在
hbase(main):> exists 't_user'

//查看全表数据
hbase(main):> scan 't_user'

//插入数据,分别是表名、key、列(列族:具体列)、值。HBase是面向列的数据库,列可无限扩充
hbase(main):> put 't_user' ,'001','cf1:name','chenxj'
hbase(main):> put 't_user' ,'001','cf1:age','18'
hbase(main):> put 't_user' ,'001','cf2:sex','man'
hbase(main):> put 't_user' ,'002','cf1:name','chenxj'
hbase(main):> put 't_user' ,'002','cf1:address','fuzhou'
hbase(main):> put 't_user' ,'002','cf2:sex','man'

//获取数据,可根据key、key和列族等进行查询
hbase(main):> get 't_user','001'
hbase(main):> get 't_user','002','cf1'
hbase(main):> get 't_user','001','cf1:age'

7、集群启动结果
Hadoop + Zookeeper + HBase 高可用集群启动后,进程状态如下:

描述 hadoop-master hadoop-slave1 hadoop-slave2
HDFS主 NameNode NameNode
HDFS从 DataNode DataNode DataNode
YARN主 ResourceManager ResourceManager
YARN从 NodeManager NodeManager NodeManager
HBase主 HMaster HMaster
HBase从 HRegionServer HRegionServer HRegionServer
Zookeeper独立进程 QuorumPeerMain QuorumPeerMain QuorumPeerMain
NameNodes数据同步 JournalNode JournalNode JournalNode
主备故障切换 DFSZKFailoverController DFSZKFailoverController

总结
需要注意的地方:

1)备用节点上的NameNode、ResourceManager、HMaster均需单独启动;

hadoop-daemon.sh start namenode
yarn-daemon.sh start resourcemanager
hbase-daemon.sh start master 

2)可以使用-forcemanual参数强制切换主节点与备用主节点,但强制切换后集群的自动故障转移将会失效,需要重新格式化zkfc:hdfs zdfc -formatZK;

(这个没有测试)
hdfs haadmin -transitionToActive/transitionToStandby  -forcemanual  hadoop-slave1
yarn rmadmin -transitionToActive/transitionToStandby  -forcemanual  rm2

3)在备用主节点同步主节点的元数据时,主节点的HDFS必须已经启动;

4)无法查看standby状态的节点上的hdfs;

5)格式化namenode时要先启动各个JournalNode机器上的journalnode进程:
否则会报journalnode拒绝连接错误

hadoop-daemon.sh start journalnode;

6)若遇到问题,可以先考虑是哪个组件出现问题,然后查看该组件或与该组件相关的组件的日志信息;若各组件web页面无法访问,或存在其他连接问题,可以从「防火墙是否关闭」、「端口是否被占用」、「SSH」、「集群机器是否处于同一网段」内等角度考虑

参考: Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

作者:dj远方的猫
链接:https://www.jianshu.com/p/9bd2327230c1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

推荐阅读更多精彩内容