前要說明
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界面
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秒