前要說明
1.叢集說明
Hbase在完全分布式環境下,由Master程序負責管理RegionServers叢集的負載均衡以及資源配置設定,ZooKeeper負責叢集中繼資料的維護并且監控叢集的狀态以防止單點故障,每個RegionServer會負責具體資料塊的讀寫,HBase所有的資料存儲在HDSF系統上。
master slaver1 slaver2 slaver3 master1主機名(需要現有的主機名替換)
2.版本說明
版本:目前Ubuntu系統,jdk1.7.0_55
Hadoop選的最新穩定版:hadoop-2.7.3 t:16.8.26
Zookeeper選的最新穩定版:zookeeper-3.4.10 t:16.9.3
Hbase最新穩定版:hbase-1.2.5 t:16.10.26
理論上說,這是套系統,從時間更新的情況看也是這樣,但是具體是否相容或有問題得實際搭建看情況。
附加:CDH版本,目前主流生産環境都用這個,連網的情況,隻需下個用戶端,其他自動給配置,問題相對少很多,基本功能免費,進階功能收費。但是一般情況基本功能就可以,選擇的換肯定是CDH5,但是具體哪個5點幾沒有研究過(理論上說應該都可以)
3.所有伺服器環境配置說明
1.基本要求,為友善配置要求所有機器的所有安裝路徑檔案路徑及使用者名
解壓指令:
tar zxvf jdk-7u80-linux-x64.tar.gz 解壓jdk
tar zxvf zookeeper-3.4.10.tar.gz 解壓zk
tar zxvf hadoop-2.7.3.tar.gz 解壓hadoop
tar zxvf hbase-1.2.5-bin.tar.gz 解壓hbase
安裝順序jdk,zk,hadoop,hbase
啟動順序zk,hadoop,hbase
關閉順序hbase,hadoop,zk
2.修改/etc/profile檔案
即添加環境變量
在最後添加如下内容:
#java
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH
#zk
export ZOOKEEPER=/home/hadoop/zookeeper-3.4.10
export PATH=$ZOOKEEPER/bin:$PATH
#hadoop
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#hbase
export HBASE_HOME=/home/hadoop/hbase-1.2.5
export PATH=$HBASE_HOME/bin:$PATH
執行source /etc/profile是環境變量生效
如果使用export PATH=$PATH: $JAVA_HOME/bin需切換jdk版本
$ sudo update-alternatives –install /usr/bin/javah javah /home/hadoop/jdk1.7.0_80/bin/javah
$ sudo update-alternatives –install /usr/bin/javac javac/home/hadoop/jdk1.7.0_80/bin/javac
$ sudo update-alternatives –install /usr/bin/javaws javaws /home/hadoop/jdk1.7.0_80/bin/javaws
$ sudo update-alternatives –install /usr/bin/java java /home/hadoop/jdk1.7.0_80/bin/java
$ sudo update-alternatives –install /usr/bin/jar jar/home/hadoop/jdk1.7.0_80/bin/jar
$ sudo update-alternatives –config java
$ sudo update-alternatives –config javac
$ sudo update-alternatives –config javah
$ sudo update-alternatives –config jar
3 配置host
配置所有機器主機名及ip位址
修改/etc/hosts
将127的ip全部用#注掉
并添加下面内容:
192.168.1.171 master
192.168.1.172 slaver1
192.168.1.173 slaver2
192.168.1.174 slaver3
192.168.1.175 master1
4建立ssh無密碼登入
為了友善起見,所有機器都為無密碼通路:
https://blog.csdn.net/dawn_rainbow/article/details/83746525
Zookeeper叢集部署:
1)建立配置檔案conf/zoo.cfg
mv zoo_sample.cfg zoo.cfg
2)更改conf/zoo.cfg的内容
# ZK中的一個時間單元。ZK中所有時間都是以這個時間單元為基礎,進行整數倍配置的
tickTime=2000
#Leader-Follower初始通信時限, Follower在啟動過程中,會從Leader同步所有最新資料,然後确定自己能夠對外服務的起始狀态。Leader允許Follower在 initLimit 時間(10*tickTime)内完成這個工作
initLimit=10
#Leader-Follower同步通信時限,在運作過程中,Leader負責與ZK叢集中所有機器進行通信,例如通過一些心跳檢測機制,來檢測機器的存活狀态。如果L發出心跳包在syncLimit(2*tickTime)之後,還沒有從F那裡收到響應,那麼就認為這個F已經不線上了。注意:不要把這個參數設定得過大,否則可能會掩蓋一些問題
syncLimit=2
#存儲快照檔案snapshot的目錄。預設情況下,事務日志也會存儲在這裡。建議同時配置參數dataLogDir, 事務日志的寫性能直接影響zk性能(在啟動zk前要建好這個目錄)
dataDir= /home/hadoop/data/zookeeper
#用戶端連接配接端口
clientPort=2181
#伺服器名稱與位址:叢集資訊(伺服器編号,伺服器位址,LF通信端口,選舉端口)必須為奇數個伺服器(本機用0.0.0.0)
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server.4=slave3:2888:3888
server.5=master1:2888:3888
3)更改conf/log4j.properties的内容
第4行
zookeeper.log.dir=/home/hadoop/logs/zookeeper/
第6行
zookeeper.log.threshold=INFO
第7行
zookeeper.tracelog.dir=/home/hadoop/logs/zookeeper/
4)更改bin/ zkEnv.sh
第56行
ZOO_LOG_DIR="/home/hadoop/logs/zookeeper/"
5)拷貝zookeeper到每台機器
相關指令建文檔開頭
6)在每台的機器的dataDir目錄下,建立檔案myid,輸入對應的編号
建立檔案:touch myid
即server.X後面的X
7)啟動zookeeper
如配置環境變量直接執行如下指令,若沒有配置需進到zookeeper安裝文檔下的bin目錄
每台機器都需要啟動
zkServer.sh start
剛起來的時候會報錯,全部機器都起來後,就不會報錯了
8)測試
Java代碼
zkServer.sh status
出現:
Mode:leader或Mode:follower
證明啟動成功
Hadoop(hdfs)叢集部署:
1.修改etc/hadoop/hadoop-env.sh
修改如下内容:
第25行修改jdk路徑
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
第72行去掉#,并修改日志位址
export HADOOP_LOG_DIR=/home/hadoop/logs/hadoop
2.修改etc/hadoop/core-site.xml,
在<configuration>标簽中添加如下内容:
<property>
<name>fs.defaultFS</name>
<value>hdfs://myHadoop</value>
<description>表示hdfs路徑的邏輯名稱hadoop 2.x以後叫fs.defaultFS </description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hdfs/tmp</value>
<description>表示hadoop存放資料的目錄,即包括NameNode的資料,
也包括DataNode的資料。該路徑任意指定,隻要實際存在該檔案夾即可</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,master1:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
3.修改etc/hadoop/hdfs-site.xml
在<configuration>标簽中添加如下内容:
<!--指定hdfs預設副本數,預設3 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--指定hdfs的nameservice為ns,需要和core-site.xml中的保持一緻 -->
<property>
<name>dfs.nameservices</name>
<value>myHadoop</value>
</property>
<!-- myHadoop下面有兩個NameNode,分别是h1,h2 -->
<property>
<name>dfs.ha.namenodes.myHadoop</name>
<value>h1,h2</value>
</property>
<!-- h1的RPC通信位址 -->
<property>
<name>dfs.namenode.rpc-address.myHadoop.h1</name>
<value>master:9000</value>
</property>
<!-- h2的RPC通信位址 -->
<property>
<name>dfs.namenode.rpc-address.myHadoop.h2</name>
<value>master1:9000</value>
</property>
<!-- h1的http通信位址 -->
<property>
<name>dfs.namenode.http-address.myHadoop.h1</name>
<value>master:50070</value>
</property>
<!-- h2的http通信位址 -->
<property>
<name>dfs.namenode.http-address.myHadoop.h2</name>
<value>master1:50070</value>
</property>
<!-- 指定NameNode的中繼資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485/myHadoop</value>
</property>
<!-- 開啟NameNode故障時自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實作方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myHadoop</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制,如果ssh是預設22端口,value直接寫sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh免登陸 -->
<!--
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
-->
<!-- 指定JournalNode在本地磁盤存放資料的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journal</value>
</property>
<!-- 在h1和h2上開啟WebHDFS (REST API)功能,不是必須 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!-- 存貯在本地的名位元組點資料鏡象的目錄,作為名位元組點的備援備份 -->
<!--
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
-->
<!-- 資料節點的塊本地存放目錄 -->
<!--
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
-->
4.修改etc/hadoop/slaves,這個是所有datanode的機器
slave1
slave2
slave3
6.修改etc/hadoop/log4j.properties
第19行
hadoop.log.dir=/home/hadoop/logs/hadoop
7.初始化hadoop
将配置好的hadoop加壓檔案拷貝到所有其他機器,
注:所有機器路徑必須一緻使用者名一樣
如果已經配置文檔開頭的hadoop環境變量則可以在使用者的根目錄即/home/hadoop/下直接執行下面相關指令,若沒有配置環境變量隻有進到hadoop安裝文檔下相應的sbin即bin目錄下執行
初始化hdfs檔案:
1.在每個journalnode(即slave1,slave2,slave3)節點用如下指令啟動journalnode
sbin/hadoop-daemon.sh start journalnode
驗證:執行jps指令 出現JournalNode證明啟動成功
2.在主namenode(master)節點用格式化namenode
bin /hdfs namenode –format
3.在主namenode(master)節點啟動namenode程序
sbin /hadoop-daemon.sh start namenode
4.在備namenode(master1)節點執行指令
bin/hdfs namenode –bootstrapStandby
說明:這個是把備namenode節點的目錄格式化并把中繼資料從主namenode節點copy過來,并且這個指令不會把journalnode目錄再格式化了
5.啟動備namenode(master1)程序
sbin /hadoop-daemon.sh start namenode
驗證:執行jps指令 出現NameNode證明啟動成功
這時候,使用浏覽器通路 http://192.168.1.171:50070 和 http://192.168.1.175:50070 。如果能夠看到兩個頁面,證明NameNode啟動成功了(本機C:\Windows\System32\drivers\etc\hosts必須添加192.168.1.171 master 192.168.1.175 master2 否則拒絕通路)。這時,兩個NameNode的狀态都是standby
6.在其中一個namenode節點下格式化zk
bin/hdfs zkfc –formatZK
7.在兩個namenode節點都執行以下指令進行主NameNode選舉
sbin/hadoop-daemon.sh start zkfc
8.在所有datanode節點都執行以下指令啟動datanode
sbin/hadoop-daemon.sh start datanode
9.停止叢集指令
sbin/stop-dfs.sh
8.日常啟停指令
sbin/start-dfs.sh
sbin/stop-dfs.sh
Hbase叢集部署:
1.修改conf/hbase-env.sh
第28行
export JAVA_HOME=/home/hadoop/jdk1.7.0_80
第31行
export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
第48行
export HBASE_LOG_DIR=/home/hadoop/logs/hbase
第129行
export HBASE_MANAGES_ZK=false
2.修改conf/hbase-site.xml
在<configuration>标簽下添加
<property>
<name>hbase.rootdir</name>
<value>hdfs://myHadoop/hbase</value>
<description>設定 hbase 資料庫存放資料的目錄,這裡是放在hadoop hdfs上,這裡要與hadoop的core-site.xml檔案中的fs.defaultFS中的值一緻,然後在後面添加自己的子目錄,我這裡定義是hbase</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>打開 hbase 分布模式</description>
</property>
<property>
<name>hbase.master</name>
<value>60000</value>
<description>主備情況下隻需要寫端口号,不必寫主機名</description>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
<description>web界面通路端口</description>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/hadoop/data/hbase</value>
<description>hbase的一些臨時檔案存放目錄。</description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2,slave3,master1</value>
<description> 指定 zookeeper 叢集節點名 , 因為是由 zookeeper 表決算法決定的</description>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
<description> 連接配接到zookeeper的端口,預設是2181</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/data/zookeeper</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>master與regionserver允許有3分鐘誤差</description>
</property>
3.修改conf/regionservers
在regionsers檔案中添加
slave1
slave2
slave3
4.新增conf/backup-masters
在conf目錄下新增檔案
mkdir backup-masters
在backup-masters檔案中添加
master1
作用:主要用于主機當機後備用機接管hbase
5.修改conf/log4j.properties
第20行
hbase.log.dir=/home/hadoop/logs/hbase
6.拷貝hbase到所有的節點
同hadoop與zk
7.啟動hbase
配置了環境變量直接執行,沒有配置進入bin目錄下
start-hbase.sh
8.hbase自帶的web界面
http://192.168.1.171:60010/
http://192.168.1.175:60010/
9.測試
1.登入hbase用戶端
文檔開頭配置hbase環境變量直接執行,沒有配置進到hbase安裝目錄下的bin
hbase shell
2.建立資料表,并插入3條記錄
hbase(main):003:0> create 'test', 't1'
(create '表名', '列族')
0 row(s) in 1.2200 seconds
hbase(main):003:0> list 'table'
test
1 row(s) in 0.0550 seconds
hbase(main):004:0> put 'test', 'row1', 't1:a', 'value1'
(put '表名', '行号', '列族:列', '列值' )
0 row(s) in 0.0560 seconds
hbase(main):005:0> put 'test', 'row2', 't1:b', 'value2'
0 row(s) in 0.0370 seconds
hbase(main):006:0> put 'test', 'row3', 't1:c', 'value3'
0 row(s) in 0.0450 seconds
3.檢視插入的資料
hbase(main):007:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1288380727188, value=value1
(行号 column=列族:列, timestamp=時間版本時間搓, value=列值)
row2 column=cf:b, timestamp=1288380738440, value=value2
row3 column=cf:c, timestamp=1288380747365, value=value3
3 row(s) in 0.0590 seconds
4.讀取單條記錄
hbase(main):008:0> get 'test', 'row1'
COLUMN CELL
cf:a timestamp=1288380727188, value=value1
1 row(s) in 0.0400 seconds
5.停用并删除資料表
hbase(main):012:0> disable 'test'
0 row(s) in 1.0930 seconds
hbase(main):013:0> drop 'test'
0 row(s) in 0.0770 seconds
先停用後删除
6.退出
hbase(main):014:0> exit
如果Ctrl+z退出需要手動殺死線程(不然連接配接不會被釋放)
jps
殺死 Main線程号
10.日常指令
start-hbase.sh
stop-hbase.sh
dfs.namenode.support.allow.format=true
NN是否允許被格式化?在生産系統,把它設定為false,阻止任何格式化操作在一個運作的DFS上。
建議初次格式化後,修改配置禁止
dfs.client.write.exclude.nodes.cache.expiry.interval.millis=600000
最大周期去讓DN保持在例外節點隊列中。毫秒。操過此周期,先前被排除的DN将被移除緩存并被嘗試再次申請Block。預設為10分鐘。
dfs.heartbeat.interval=3
DN的心跳間隔3秒
dfs.namenode.heartbeat.recheck-interval
HeartbeatMonitor 會定期的檢測已注冊的資料節點的心跳包,每一次檢測間隔300000毫秒即預設5分鐘
Namenode判斷一個DataNode死亡的時間為2* dfs.namenode.heartbeat.recheck-interval+10* dfs.heartbeat.interval即如果都為預設值為10分30秒