聲明:做者原創,轉載註明出處。做者:帥氣陳吃蘋果java
主機名 | IP | 用戶名 | 密碼 | 安裝目錄 |
---|---|---|---|---|
master188 | 192.168.29.188 | hadoop | hadoop | /home/hadoop/ |
master189 | 192.168.29.189 | hadoop | hadoop | /home/hadoop/ |
slave190 | 192.168.29.190 | hadoop | hadoop | /home/hadoop/ |
master188 | master189 | slave190 |
---|---|---|
NameNode | NameNode | |
DataNode | DataNode | DataNode |
Zookeeper | Zookeeper | Zookeeper |
ResourceManager | ResourceManager | |
NodeManager | NodeManager | NodeManager |
HMaster | HMasetr | |
RegionServer | RegionServer | RegionServer |
HBase Version | JDK 6 | JDK 7 | JDK 8 |
---|---|---|---|
2.0 | X | X | Y |
1.3 | X | Y | Y |
1.2 | X | Y | Y |
1.1 | X | Y | NT |
1.0 | X | Y | NT |
0.98 | Y | Y | NT |
0.94 | Y | Y | N |
HadoopHBase | HBase-1.1.x | HBase-1.2.x | HBase-1.3.x | HBase-2.0.x |
---|---|---|---|---|
Hadoop-2.0.x-alpha | X | X | X | X |
Hadoop-2.1.0-beta | X | X | X | X |
Hadoop-2.2.0 | NT | X | X | X |
Hadoop-2.3.x | NT | X | X | X |
Hadoop-2.4.x | Y | Y | Y | X |
Hadoop-2.5.x | Y | Y | Y | X |
Hadoop-2.6.0 | X | X | X | X |
Hadoop-2.6.1+ | NT | Y | Y | Y |
Hadoop-2.7.0 | X | X | X | X |
Hadoop-2.7.1+ | NT | Y | Y | Y |
Hadoop-2.8.0 | X | X | X | X |
Hadoop-2.8.1 | X | X | X | X |
Hadoop-3.0.0-alphax | NT | NT | NT | NT |
考慮到HBase與JDK、Hadoop各版本兼容性,咱們採用的組件版本以下:node
組件 | 版本 |
---|---|
JDK | 1.8 |
Hadoop | 2.6.5 |
Zookeeper | 3.4.11 |
HBase | 1.3.1 |
下載地址:http://mirrors.hust.edu.cn/ap...web
在master188機器上,下載後解壓到/home/hadoop/目錄下:shell
tar -zxvf zookeeper-3.4.11.tar.gz -C /home/hadoop/
zoo_sample.cfg
進入zookeeper的conf目錄,拷貝zoo_sample.cfg
並重命名爲zoo.cfg
:數據庫
cd zookeeper-3.4.11/conf/ cp zoo_sample.cfg zoo.cfg
zoo.cfg
vi zoo.cfg
修改以下,若原文件沒有dataDir則直接添加:apache
dataDir=/home/hadoop/zookeeper-3.4.11/data/zkData //在最後添加,指定zookeeper集羣主機及端口,機器數必須爲奇數 server.1=master188:2888:3888 server.2=master189:2888:3888 server.3=slave190:2888:3888
myid
//在zookeeper根目錄下建立zoo.cfg中配置的目錄 mkdir data/zkData/ -p //建立並編輯文件 vi myid //輸入1,即表示當前機器爲在zoo.cfg中指定的server.1 1 //保存退出 :wq
上述操做是在master188機器上進行的,要將zookeeper拷貝到其餘zookeeper集羣機器上:bootstrap
cd /home/hadoop scp -r zookeeper-3.4.11/ hadoop@master189:/home/hadoop/ scp -r zookeeper-3.4.11/ hadoop@slave190:/home/hadoop/
集羣中各組件的安裝目錄最好保持一致。瀏覽器
myid
文件myid
文件是做爲當前機器在zookeeper集羣的標識,這些標識在zoo.cfg
文件中已經配置好了,可是以前在master188這臺機器上配置的myid
爲1,因此還須要修改其餘機器的myid
文件:bash
//在master189機器上 echo 2 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid //在slave190機器上 echo 3 > /home/hadoop/zookeeper-3.4.11/data/zkData/myid
cd zookeeper-3.4.11/bin/ //分別在master18八、master18九、slave190上啓動 ./zkServer.sh start //查看狀態 ./zkServer.sh status
三臺機器的zookeeper狀態必須只有一個leader
,其餘都是follower
。服務器
//查看進程,如有QuorumpeerMain,則啓動成功 jps
下載地址:http://mirrors.hust.edu.cn/ap...
在master88機器上,解壓到/home/hadoop/目錄下:
tar -zxcf hadoop-2.6.5.tar.gz -C /home/hadoop/
進入配置文件目錄,修改配置文件
cd hadoop-2.6.5/etc/hadoop/
配置JDK安裝路徑:
JAVA_HOME=/opt/jdk
<configuration> <!-- hdfs地址,ha模式中是鏈接到nameservice --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 這裏的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄,也能夠單獨指定 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/hadoop-2.6.5/tmp</value> </property> <!-- 指定ZooKeeper集羣的地址和端口。注意,數量必定是奇數,且很多於三個節點--> <property> <name>ha.zookeeper.quorum</name> <value>master188:2181,master189:2181,slave190:2181</value> </property> </configuration>
<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>master188,master189</value> </property> <!-- 名爲master188的namenode的rpc地址和端口號,rpc用來和datanode通信 --> <property> <name>dfs.namenode.rpc-address.ns1.master188</name> <value>master188:9000</value> </property> <!-- 名爲master189的namenode的rpc地址和端口號,rpc用來和datanode通信 --> <property> <name>dfs.namenode.rpc-address.ns1.master189</name> <value>master189:9000</value> </property> <!--名爲master188的namenode的http地址和端口號,用來和web客戶端通信 --> <property> <name>dfs.namenode.http-address.ns1.master188</name> <value>master188:50070</value> </property> <!-- 名爲master189的namenode的http地址和端口號,用來和web客戶端通信 --> <property> <name>dfs.namenode.http-address.ns1.master189</name> <value>master189:50070</value> </property> <!-- namenode間用於共享編輯日誌的journal節點列表 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master188:8485;master189:8485;slave190: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-2.6.5/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>/home/hadoop/.ssh/id_rsa</value> </property> <!-- connect-timeout超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
<!-- 採用yarn做爲mapreduce的資源調度框架 --> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<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>master188</value> </property> <!-- 指定rm2的地址 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>master189</value> </property> <!-- 指定當前機器master188做爲rm1 --> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property> <!-- 指定zookeeper集羣機器 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master188:2181,master189:2181,slave190:2181</value> </property> <!-- NodeManager上運行的附屬服務,默認是mapreduce_shuffle --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
master188 master189 slave190
scp -r hadoop-2.6.5 hadoop@master189:/home/hadoop/ scp -r hadoop-2.6.5 hadoop@slave190:/home/hadoop/
在master189機器,即ResourceManager備用主節點上修改以下屬性,表示當前機器做爲rm2::
<property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value> </property>
同時刪除slave190機器上的該屬性對,由於slave190機器並不做爲ResourceManager。
cd hadoop-2.6.5/sbin/ ./hadoop-daemon.sh start //查看進程JouralNode是否啓動 jps
在master188機器上,執行格式化操做:
cd hadoop-2.6.5/bin ./hdfs namenode -format ./hdfs zkfc -formatZK
在master189(備用主節點)機器上,執行同步操做:
cd hadoop-2.6.5/bin ./hdfs namenode -bootstrapStanby
若服務器是最小化安裝centeros時,有可能系統沒有fuster程序,那麼跳過這個安裝步驟直接進行後面的操做時,將有可能出現如下問題:
master188做爲主節點時,kill掉master188上的NameNode和ResourceManager進程時,能夠實現故障轉移,master189將從stanby狀態自動變成active狀態;可是當master189做爲主節點時,若kill掉master189上的進程,master188上的進程狀態卻仍是stanby,並不能實現故障自動轉移。緣由是咱們在 hdfs-site.xml中配置了當集羣須要故障自動轉移時採用SSH方式進行,而由於缺乏fuster程序,將在zkfc的日誌文件中發現以下錯誤:
PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 9000 via ssh: bash: fuser: 未找到命令 Unable to fence service by any configured method java.lang.RuntimeException: Unable to fence NameNode at master189/192.168.29.189:9000
提示未找到fuster程序,致使沒法進行fence,因此能夠經過以下命令來安裝,Psmisc軟件包中包含了fuster程序:
//分別在master18八、master18九、slave190上執行 sudo yum install psmisc
在master188機器上:
cd hadoop-2.6.5/sbin ./start-dfs.sh //驗證,顯示NameNode和DataNode jps ./start-yarn.sh //驗證,顯示ResourceManager和NodeManager jps ./hadoop-daemon.sh start zkfc //驗證,顯示ZookeeperFailoverController jps
在master189機器上,啓動ResourceManager,備用主節點的ResourceManager須要手動啓動:
cd hadoop-2.6.5/sbin yarn-daemon.sh start resourcemanager
在master188機器上執行:
hdfs haadmin -getServiceState master188 yarn rmadmin -getServiceState rm1 hdfs haadmin -getServiceState master189 yarn rmadmin -getServiceState rm2
也能夠經過Web界面來查看,瀏覽器中輸入 ip:50070 查看HDFS,輸入 ip:8088/cluster/cluster 查看YARN。
kill掉主節點的namenode,查看備用主節點的namenode狀態是否切換爲active;
kill掉主節點的ResourceManager,查看備用主節點的ResourceManager是否切換爲active;
若上述操做執行成功,那麼再測試反向故障自動轉移
先啓動被殺死的原主節點的namenode和ResourceManager
hadoop-daemon.sh start namenode yarn-daemon.sh start resourcemanager
再kill備用主節點的namenode和ResourceManager,查看主節點的狀態,若能切換爲active,那麼Hadoop HA高可用集羣搭建完成。
下載地址:http://mirrors.hust.edu.cn/ap...
在master188機器上,解壓到/home/hadoop/目錄下:
tar -zxvf hbase-1.3.1-bin.tar.gz
進入hbase-1.3.1/conf/目錄,修改配置文件:
cd hbase-1.3.1/conf/
//配置JDK export JAVA_HOME=/opt/jdk //保存pid文件 export HBASE_PID_DIR=/home/hadoop/data/hbase/pids //修改HBASE_MANAGES_ZK,禁用HBase自帶的Zookeeper,由於咱們是使用獨立的Zookeeper export HBASE_MANAGES_ZK=false
<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>master188:2181,master189:2181,slave190:2181</value> </property> <!-- 指定獨立Zookeeper安裝路徑 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/zookeeper-3.4.11</value> </property> <!-- 指定ZooKeeper集羣端口 --> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> </configuration>
修改regionservers文件,由於當前是使用獨立的Zookeeper集羣,因此要指定RegionServers所在機器:
master188 master189 slave190
在/home/hadoop/目錄下:
mkdir data/hbase/pids -p
cd /home/hadoop/ scp -r hbase-1.3.1 hadoop@master189:/home/hadoop/ scp -r hbase-1.3.1 hadoop@slave190:/home/hadoop/
在主節點上啓動HBase(這裏的主節點是指NameNode狀態爲active的節點,而非指文中對本實驗的機器聲明):
cd hbase-1.3.1/bin ./start-hbase.sh //查看HMaster、Regionserver進程是否啓動 jps
注意:此時Hadoop集羣應處於啓動狀態,而且是在主節點執行start-hbase.sh啓動HBase集羣,不然HMaster進程將在啓動幾秒後消失,而備用的HMaster進程須要在備用主節點單獨啓動,命令是:
./hbase-daemon.sh start master
。
在備用主節點啓動HMaster進程,做爲備用HMaster:
cd hbase-1.3.1/bin ./hbase-daemon.sh start master
在瀏覽器中輸入 ip:16010
,查看主節點和備用主節點上的HMaster的狀態,在備用主節點的web界面中,能夠看到「Current Active Master: master188」,表示當前HBase主節點是master188機器;
這裏的主節點指使用start-hbase.sh命令啓動HBase集羣的機器
kill掉主節點的HMaster進程,在瀏覽器中查看備用主節點的HBase是否切換爲active;
若上述操做成功,則在主節點啓動被殺死的HMaster進程:
cd hbase-1.3.1/bin/ ./hbase-daemon.sh start master
而後,kill掉備用主節點的HMaster進程,在瀏覽器中查看主節點的HBase是否切換爲active,若操做成功,則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'
Hadoop + Zookeeper + HBase 高可用集羣啓動後,進程狀態以下:
描述 | master188 | master189 | slave190 |
---|---|---|---|
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 master189 yarn rmadmin -transitionToActive/transitionToStandby -forcemanual rm2
3)在備用主節點同步主節點的元數據時,主節點的HDFS必須已經啓動;4)沒法查看standby狀態的節點上的hdfs;
5)格式化namenode時要先啓動各個JournalNode機器上的journalnode進程:
hadoop-daemon.sh start journalnode
;6)若遇到問題,能夠先考慮是哪一個組件出現問題,而後查看該組件或與該組件相關的組件的日誌信息;若各組件web頁面沒法訪問,或存在其餘鏈接問題,能夠從「防火牆是否關閉」、「端口是否被佔用」、「SSH」、「集羣機器是否處於同一網段」內等角度考慮;
最後,歡迎指正。喜歡的話,點個讚唄,請你吃蘋果。