1. 程式人生 > >Docker實戰(十六):Docker安裝HBase環境

Docker實戰(十六):Docker安裝HBase環境

Docker安裝HBase環境

HBase安裝
# 下載HBase
$ wget http://apache.fayea.com/hbase/0.98.19/hbase-0.98.19-hadoop2-bin.tar.gz

# 解壓Hive壓縮包
$ tar -zxvf hbase-0.98.19-hadoop2-bin.tar.gz

# 需要修改下面HBase相關的配置檔案
Dockerfile檔案
############################################
# version : birdben/hbase:v1
# desc : 當前版本安裝的hbase
############################################ # 設定繼承自我們建立的 jdk7 映象 FROM birdben/jdk7:v1 # 下面是一些建立者的基本資訊 MAINTAINER birdben (191654006@163.com) # 設定環境變數,所有操作都是非互動式的 ENV DEBIAN_FRONTEND noninteractive # 新增 supervisord 的配置檔案,並複製配置檔案到對應目錄下面。(supervisord.conf檔案和Dockerfile檔案在同一路徑) COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 設定 hbase 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV HBASE_HOME /software/hbase-0.98.19 ENV PATH ${HBASE_HOME}/bin:$PATH # 複製 hbase-0.98.19 檔案到映象中(hbase-0.98.19 資料夾要和Dockerfile檔案在同一路徑),這裡直接把上一篇Hadoop環境直接用上了 ADD hbase-0.98.19 /software/hbase-0.98.19 # 授權HBASE_HOME路徑給admin使用者 RUN sudo chown -R admin /software/hbase-0.98.19 # 容器需要開放HBase 60010埠 EXPOSE 60010 # 執行supervisord來同時執行多個命令,使用 supervisord 的可執行路徑啟動服務。
CMD ["/usr/bin/supervisord"]
Dockerfile原始檔連結:
supervisor配置檔案內容
# 配置檔案包含目錄和程序
# 第一段 supervsord 配置軟體本身,使用 nodaemon 引數來執行。
# 第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:hbase]
command=/software/hbase-0.98.19/bin/start-hbase.sh
配置HBASE_HOME/conf/hbase-env.sh
export JAVA_HOME=/software/jdk7
export HBASE_CLASSPATH=/software/hbase-0.98.19/lib/
export HBASE_IDENT_STRING=my
export HBASE_PID_DIR=${HBASE_HOME}/tmp
export HBASE_MANAGES_ZK=true
配置HBASE_HOME/conf/hbase-site.xml,hbase-default.xml並不在conf目錄, 需要從./src/main/resources/目錄拷貝並且改名為hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <!-- 使用本地檔案系統 -->
    <value>file:///software/hbase-0.98.19/hbase_dir</value>
    <!-- 使用本地的HDFS檔案系統 -->
    <!-- <value>hdfs://Ben:9000/hbase</value> -->
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/software/hbase-0.98.19/zookeeper_dir</value>
  </property>
</configuration>
控制檯終端
# 構建映象
$ docker build -t="birdben/hbase:v1" .
# 執行已經構件好的映象,掛載在宿主機器的儲存路徑也不同,-h設定hostname,Hadoop配置檔案需要使用
$ docker run -p 9999:22 -p 60010:60010 -t -i 'birdben/hbase:v1'
supervisor無法監控hbase
supervisor監控hbase不成功,是因為supervisor啟動的程式必須是非daemon的啟動方式,之前的文章已經反覆提過好幾次這個問題,但是${HBASE_HOME}/bin/start-hbase.sh的啟動指令碼,實際上是呼叫了hbase-daemon.sh的daemon啟動指令碼,所以這裡supervisor啟動hbase後,hbase程序的狀態仍然是hbase (exit status 0; expected),是因為無法監控hbase程序,但是不影響hbase的正常啟動和使用
使用hbase shell登入HBase伺服器進行操作
# 通過ssh遠端連線使用admin賬號遠端登入HBase的Docker容器
$ cd /software/hbase-0.98.19/bin/
$ ./hbase shell
2016-06-30 06:03:57,427 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.19-hadoop2, r1e527e73bc539a04ba0fa4ed3c0a82c7e9dd7d15, Fri Apr 22 19:07:24 PDT 2016
hbase(main):001:0>

# 查詢所有的Table
hbase(main):001:0> list

# 建立新表
hbase(main):001:0> create 'test','name'
0 row(s) in 0.5780 seconds
=> Hbase::Table - test

# 再次查詢所有的Table
hbase(main):001:0> list
TABLE
test
1 row(s) in 0.0100 seconds
=> ["test"]
瀏覽器檢視
# 檢視HBase:
http://10.211.55.4:60010/master-status
啟動hbase可能會報錯 Address already in use
master: java.net.BindException: Address already in use
master:         at sun.nio.ch.Net.bind(Native Method)
master:         at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:124)
master:         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
master:         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:52)
master:         at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:111)
master:         at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
master:         at org.apache.hadoop.hbase.zookeeper.HQuorumPeer.runZKServer(HQuorumPeer.java:73)
master:         at org.apache.hadoop.hbase.zookeeper.HQuorumPeer.main(HQuorumPeer.java:63)

# 報錯的原因是Zookeeper的埠被佔用了或者Zookeeper已經啟動了。
export HBASE_MANAGES_ZK=true
# 這個引數表示啟動hbase之前自動啟動zk
# 解決的辦法有2種:
1.啟動hbase的之前kill掉所有的zk程序,讓hbase啟動zk
2.將引數HBASE_MANAGES_ZK 改成false
# 在hbase之前手動啟動zk

# 我這裡使用的是方式一,可能之前zk的2181埠被其他應用佔用了,所以kill掉所有佔用2181埠的程序,再啟動hbase就好用了

參考文章: