誰用誰的流年,亂了浮生……
1.1 單機模式
HBase 可以以單機模式方式執行,如果以此種方式執行,那麼所有的 HBase 程序:Master、RegionServers 和 zookeeper 都執行在一個 JVM 例項上。
1.1.1 配置
在 conf/hbase-env.sh 檔案配置 JAVA_HOME。 編輯 conf/hbase-site.xml 檔案,配置如下屬性:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/hbase</value>
<desription>此目錄由 hbase 自動在本地檔案系統建立</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/zookeeper</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
< value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</ property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
</configuration>
**PS:**在開發或測試環境下,可以配置 hbase.rootdir 指向本地檔案系統,但是在生成環境中,不建議這麼做,以防丟失資料。應該指向 hdfs 檔案系統,比如:
hbase.rootdir=hdfs://namenode.example.org:8020/hbase
PS:在本地模式啟動 hbase 後,進入 hbase shell 操作頁面出現 zookeeper 相關異常,建議使用自己安裝的 zookeeper,不要使用 hbase 自帶的 hbase,把 zookeeper 的配置檔案拷貝到 ${HBASE_HOME}/conf/ 目錄下。如果進入 hbase shell 正常,然而使用 hbase 命令操作,出現異常,如 Server is not yet run,且使用 jps 命令也沒有看到 HMaster 程序,那麼應該修改 hbase-site.xml 配置檔案中的hbase.rootdir 和 hbase.zookeeper.property.dataDir 這兩個屬性,使得配置的值(目錄)對當前啟動 hbase 的使用者有讀寫能力。
1.2 偽分散式模式
配置 hbase-site.xml:
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:8020/hbase</value>
<description>hdfs 在本地安裝,埠為 8082。不要在 hdfs 建立目錄,由 hbase 自動建立</description>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>true</value>
<description>此屬性要麼配置為 true,要麼就移除此屬性配置</description>
</property>
</configuration>
現在,可以啟動 hbase,驗證是否一切正常。
HMaster 程序管理著整個 hbase 叢集,為了高可用,避免單點故障問題,可以啟動多個 backup HMaster 程序例項,為了啟動 backup HMaster 程序例項,可以使用 指令碼啟動,不過對每個啟動的 backup HMaster 程序例項,都需要新增引數來表示相對於 master HMaster 程序例項的埠偏移量。master HMaster 程序例項的預設兩個埠是 16000 和 16010,從而埠偏移量都是加在這兩個埠上。比如下面命令,開啟了 3 個 backup HMaster 程序例項,分別使用的埠是 16002/16012、16003/16013 和 16005/16015。
$ ./bin/local-master-backup.sh start 2 3 5
為了停止 backup HMaster 程序例項,而又不影響整個 hbase 叢集,即 master HMaster 程序例項依然正常服務,那麼需要找到 backup HMaster 程序例項的 pid,這個 pid 可以從檔案 /tmp/hbase-USER-X-master.pid,此檔案內容只儲存 pid。如下命令就會停止埠偏移量為 1 的 HMaster 程序例項,但叢集正常服務中…
$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9
1.2.1 啟動和停止額外的 HRegionServer
HRegionServer 按照 HMaster 的指示管理其 StoreFiles 中的資料,通常來說,HRegionServer 程序例項應該是跟叢集的節點一一對應的,然而在偽分散式模式下,為了測試,在同一個節點執行多個 HRegionServer 程序例項是非常有用的。命令 就可以啟動多個 HRegionServer,它的工作原理跟之前說的 local-master-backup.sh 差別不大。在 Hbase 1.1.0 之後,HMaster 不適用 HRegionServer 的埠,因此預留了 10 個埠(16020-16029 和 16030-16039)給 HRegionServer(它的預設埠是 16020 和 16030)。但是,在使用剛才說的命令執行額外的 HRegionServer 程序之前,還需要給環境變數 HBASE_RS_BASE_PORT 和 HBASE_RS_INFO_BASE_PORT 設定合適的值。在一臺機器上,可以支援 99 個 HRegionServer,埠是 16200-16300。
$ .bin/local-regionservers.sh start 2 3 4 5
$ .bin/local-regionservers.sh stop 3
1.3 完全分散式
實際上,在真實場景中和完全測試 hbase 叢集能力,需要搭建 hbase 完全分散式叢集,在完全分散式叢集中,包含許多節點,而每個節點都可能執行一個或多個 HBase 守護程序。比如 主從 HMaster、zookeeper 和 HRegionServer。下表是分散式叢集架構樣例:
1.3.1 免密碼登入
為了啟動守護程序,node-a 需要登入 node-b 和 node-c,當然還有它本身。因此,最簡單的方式就是所有機器都是同一個使用者名稱,並且配置從 node-a 登入到其他機器都是不需要密碼的,即免密碼登入。
-
在 node-a 上生成祕鑰對
生成以執行 hbase 的使用者名稱的祕鑰對。命令如下:
$ ssh-keygen -t rsa
公鑰的預設檔名是 id_rsa.pub
-
在其他機器上建立目錄存放公鑰
在 node-b 和 node-c 上的使用者 home 目錄下建立 .ssh 目錄
-
拷貝公鑰到其他機器
可以使用 scp 命令把 node-a 上的公鑰拷貝到其他機器的 ${home}/.ssh 目錄下。在其他機器上還需 要建立一個檔案 ${home}/.ssh/authorized_keys,然後再把 id_rsa.pub 檔案的內容追加到檔案 authorized_keys 的末尾。不過需要注意的是,node-a 本身也需要完成這件事。
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
-
測試免密碼登入
如果剛才的操作都正確的話,那麼使用 ssh 命令從 node-a 上登入到其他機器應該就不需要在輸入密碼了。
-
由於在 node-b 上執行 backup HMaster 程序例項,因此需要重複上述步驟,只不過這次是以 node-b 為出發點,而不是 node-a,且需要注意的是,不要覆蓋之前的 .ssh/authorized_keys 檔案內容,因此使用重定向符號 >> ,而不是 >。
1.3.2 準備 node-a
node-a 機器將會執行 primary HMaster 程序 和 zookeeper 程序,但是是不需要執行 HRegionServer 程序。
-
編輯 conf/regionservers 檔案,移除包含 localhost 的那一行,然後新增 node-b 和 node-c 的主機名或 ip 地址。
-
在 node-b 配置 HBase,執行 backup HMaster
在 conf 目錄下建立檔名為 backup-masters 的檔案,新增 node-b 的主機名。
-
配置 zookeeper
在生成環境中,需要仔細考慮下 zookeeper 的配置,因為配置的屬性將會直接指導 HBase 啟動和管理叢集中各個節點上的 zookeeper 例項。 在 node-a 機器上,編輯 conf/hbase-site.xml 檔案,新增如下屬性:
<property> <name>hbase.zookeeper.quorum</name> <value>node-a.example.com,node-b.example.com,node-c.example.com</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/usr/local/zookeeper</value> </property>
1.3.3 準備 node-b 和 node-c
node-b 機器會執行一個 backup HMaster 程序例項 和 zookeeper 程序例項。
-
下載且解壓 hbase
-
拷貝 node-a 機器上的配置到 node-b 和 node-c 機器
叢集每個機器上有相同的配置
1.3.4 啟動和測試叢集
通過 web 頁面訪問,在 0.98.x 之前,HMaster 的埠是 60010,HRegionServer 的埠是 60030,而之後的埠分別是 16010 和 16030。