HBase運維和優化


管理工具

HBase Shell
HBase Shell是HBase組件提供的基於JRuby IRB的字符界面的交互式客戶端程序,通過HBase Shell可以實現對HBase的絕大部分操作

通過help ["group-name"]命令,可以獲取該組包含命令的詳細使用說明

hbck工具
hbck工具對HBase中的數據進行掃描,找出錯誤的數據塊,並生產簡單的報表。該工具調用方法如下:
$ bin/hbase hbck
輸出結果摘錄如下:
......
Number of Tables: 1
Number of live region servers: 2
Number of dead region servers: 0
Master: node1,60000,1357616232695
Number of backup masters: 0
......
Summary:
ROOT is okay.
Number of regions: 1
Deployed on: node1,60020,1357613909450
.META. is okay.
Number of regions: 1
Deployed on: node2,60020,1357613870843
t1 is okay.
Number of regions: 1
Deployed on: node1,60020,1357613870843
0 inconsistencies detected.
Status: OK
說明:關於hbck工具的詳細信息,可參考HBase文檔:http://hbase.apache.org/book/hbck.in.depth.html 

hfile工具
hfile工具主要用於分析HBase的數據文件HFile。該工具的使用方法如下:
$ bin/hbase hfile [-a] [-b] [-e] [-f <arg>] [-k] [-m] [-p] [-r <arg>] [-s] [-v]
hfile工具具體的參數如表5-2所示。
表5-2 hfile參數

參數

說明

a,-checkfamily

啟用列族檢查

b,-printblocks

打印塊索引元數據

e,-printkey

打印所有rowkey

f,-file <full/path/to/hfile>

設置要分析的HFile,應輸入完整的路徑名,如hdfs://namenode:8020/hbase/.META./12/34

k,-checkrow

查找沒有排序的行

m,-printmeta

打印hfile的元數據信息

p,-printkv

打印所有的<Key/Value>鍵值對

r,-region <region-name>

設置要分析的Region,輸入Region名,如".META.,,1"

s,-stats

打印統計信息

v,-verbose

打印詳細信息,包括元數據和文件分割符


hlog工具
hlog工具主要用於分析HBase的WAL日志HLog文件。該工具的使用方法如下:
$ bin/hbase hlog <filename...> [-h] [-j] [-p] [-r <arg>] [-s <arg>] [-w <arg>]
hlog工具具體的參數如表5-3所示。
表5-3 hlog參數

參數

說明

h,-help

打印幫助信息

-j, --json

設置分析結果以json格式輸出

p,-printvals

打印所有值

r,-region <region-name>

設置要分析的Region

s,-sequence <sequence-num>

設置要分析的序列

w,-row <row-name>

設置要分析的行

zkcli工具
zkcli工具是hbase包裝的ZooKeeper Shell,通過它可以查看HBase集群使用的ZooKeeper集群的信息。該工具的啟用方法如下:
$ bin/hbase zkcli
啟用后,會進入如下界面:
Welcome to ZooKeeper!
...
JLine support is enabled
... 
WATCHER:: 
WatchedEvent state:SyncConnected type:None path:null
[zk: node5:2181(CONNECTED) 0]
在該提示符下輸入任意一個字符,可獲取zkcli支持的命令列表

 

5.2.3 日常維護

Compaction操作
HBase每隔一段時間會對將許多小的HBase數據文件(HFile)合並成大文件,這個過程叫做Compaction。Compaction操作可有效較少HFile的個數,節約磁盤空間,提高HBase的性能。RegionServer在執行Compaction操作期間會占用大量的內存資源,過於頻繁的Compaction操作會影響HBase的性能,而Compaction操作周期過長也會導致期間積累的HFile過多,單次Compaction時間很長,同樣也會影響性能。如果HBase在運行期間一直保持較高的Compaction頻率,應該考慮添加新的節點以提高集群的負載能力。
說明:關於HBase Compaction的詳細信息,請參考HBase文檔:http://hbase.apache.org/book/regions.arch.html#compaction
Split操作
HBase的Region大小是由上限的,當Region的大小超過了這個限制,RegionServer就會執行一次Split過程,將這個Region一份為二,這個過程叫做Split。Split過程使用標記方式,將實際的數據分割操作放在后台進行,因此,該操作速度較快。Split操作可以將Region分成兩份,分配給不同的RegionServer管理。如果HBase中的數據存在局部過熱的Region,可以考慮手動對這些Region執行split操作,並將這些Region重新分配給不同節點。下面是這個過程的HBase Shell示例:
hbase(main):010:0> split 'test','test,row150,1357626052663.15bbf20f9ce9b38e0a6dcb0732a90945'
hbase(main):012:0> move '9de82062a65b07cc70b999793ad658dd', 'apache-node3,60020,1357613909450'
數據備份
HBase的數據都記錄在HDFS的/hbase目錄下,可以將HBase數據作為普通的HDFS文件進行備份,相關內容可參見3.2.3日常維護章節內容。也可以使用HBase提供的Replication機制進行數據備份。Replication機制基於操作日志將HBase數據同步到備用集群。關於Replication的內容,請參見HBase文檔:http://hbase.apache.org/replication.html
數據遷移
HBase數據遷移問題主要包括三個方面,如下所示:

  1. 從外部數據源(如關系型數據庫)導入數據
  2. 將HBase數據導入外部數據源
  3. HBase集群間的數據遷移

對於第一、二種情況,可以利用HBase API編寫相關的導入程序完成數據導入/導出操作,對於第三種情況,當然也使用可以和一、二兩種情況相同的方法,不過針對第三種情況,有更簡單的方法。

  • 導出數據

HBase提供導出數據的工具用來將HBase表格數據導出本地磁盤或HDFS上,該工具為:org.apache.hadoop.hbase.mapreduce.Export,使用方法如下:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.Export [-D <property=value>]* <tablename> <outputdir> [<versions> [<starttime> [<endtime>]] [^[regex pattern] or [Prefix] to filter]]
設置參數可以限制導出的數據范圍。下面的例子將表t1的f1列族導出到HDFS上:
$ bin/hbase –D hbase.mapreduce.scan.column.family=f1 t1 hdfs://node1:8020/tmp/t2_backup

  • 導入數據

對應的,HBase也提供了導入工具,可將導出的數據導入到HBase中,該工具為org.apache.hadoop.hbase.mapreduce.Import,使用發方法如下:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
*Import工具將數據導入HBase中已存在的表中,如果表不存在,將會發生錯誤。

  • 導入TSV格式的數據

TSV (Tab Separated Values)格式的數據以Tab分隔每個列的數據。HBase提供了ImportTsv工具來導入這種數據:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>
下面給出一個示例,設HDFS上有一個TSV格式的數據文件/tmp/tsv如下所示:
row1c1c2
row2c1c2
row3c1c2
設第一列數據為rowkey,第二列對應HBase中的列為"f1:c1",第三列對應HBase中的列為"f1:c2",使用ImportTsv工具導入數據:
$ bin/base org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,f1:c1,f1:c2 tsv hdfs://node1:8020/tmp/tsv
ImportTsv工具也需要導入前HBase中已存在目標表格。
說明:Sqoop是一個用來將Hadoop和關系型數據庫中的數據相互轉換的數據遷移工具。CDHv1.0不包含Sqoop組件,但是兼容Apache Sqoop 1.4.2及以上版本。關於Sqoop的信息,請參見Sqoop官方網站:http://sqoop.apache.org/
數據壓縮
對於存在I/O瓶頸的應用中,啟用壓縮是一個不錯的選擇。數據壓縮不但節約了磁盤空間,也加快了數據傳輸效率。HBase支持全局設置壓縮算法,也支持按列族壓縮數據。全局壓縮算法通過" hbase.regionserver.codecs"來設置。HBase支持的壓縮算法如表5-5所示。下面的示例為列族"f1"設置GZip壓縮算法。
hbase(main):010:0> distable 't1'
0 row(s) in 1.0700 seconds 
hbase(main):005:0> alter 't1', {NAME => 'f1', COMPRESSION =>'GZ'}
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.2980 seconds 
hbase(main):006:0> enable 't1'
0 row(s) in 2.0700 seconds
表5-5 HBase支持的壓縮算法及性能比較

壓縮算法

配置名

壓縮率

編碼效率

解碼效率

LZO算法

LZO

20.5%

135 MB/s

410 MB/s

GZIP算法

GZ

13.4%

21 MB/s

118 MB/s

SNAPPY

SNAPPY

22.2%

172 MB/s

409 MB/s

添加節點
為HBase添加新的RegionServer非常簡單,只需在新的節點啟動新的RegionServer即可。具體步驟如下:

  1. 在新的節點部署和配置HBase
  2. 在新節點運行下述命令啟動新的RegionServer

$ bin/hbase-daemon.sh start regionserver

  1. 更新集群配置,將新節點加入regionservers文件中
  2. 刷新Web UI,檢查新節點是否已經加入集群

刪除節點
從HBase上動態刪除RegionServer節點也比較方便,具體步驟如下:

  1. 在待刪除的節點運行下述命令關閉RegionServer,該命令將告知Master重新分配該RegionServer上的Region到其他RegionServer上:

$ bin/hbase-daemon.sh stop regionserver

    1. 更新集群配置,將待刪除節點從regionservers文件中刪除
    2. 刷新Web UI,檢查該節點是否已經退出集群

 

5.3性能調優

5.3.1優化系統配置

 

優化項

優化原理

推薦做法

Master服務器的數量

一個集群只有一台active的Master,其他的都作為backup備份機器。可盡量的多配置幾台Master,配置更多數量的Master服務器沒有壞處,但是配置太少會降低高可用性。

在集群的機器上,內存許可的條件下,盡量都運行Master服務

每台機器內存大小

RegionServer會在內存中保留很多數據,需要占用較多的內存。200個region配20G內存給RegionServer還好,若超過200個region便會影響讀寫情況。每台機器除了RS外,大多還運行了Master, ZooKeeper, DataNode等服務,所以單台服務器的整體內存需要一個較高的配置

最好有48G的內存,最少24G的內存

文件句柄數

由於 Linux系統最大可打開文件數一般默認的參數值是1024,通過 ulimit -n 65535 可即時修改,但重啟后就無效了

在文件/etc/security/limits.conf 有服務可打開文件句柄數的最大值配置,重啟后仍有效,添加如下兩行:* soft nofile 327680* hard nofile 327680 同時將單個用戶可用的最大線程數也配大一些,即再添加如下幾行:hdfs soft nproc 131072hdfs hard nproc 131072mapred soft nproc 131072mapred hard nproc 131072hbase soft nproc 131072hbase hard nproc 131072zookeeper soft nproc 131072zookeeper hard nproc 131072hive soft nproc 131072hive hard nproc 131072

5.3.2 優化配置項

優化項

優化原理

推薦做法

zookeeper.session.timeout

RegionServer與Zookeeper間的連接超時時間。當超時時間到后,ReigonServer會被Zookeeper從RS集群清單中移除,HMaster收到移除通知后,會對這台server負責的regions重新balance,讓其他存活的RegionServer接管.這個timeout決定了RegionServer是否能夠及時的failover。設置成1分鍾或更低,可以減少因等待超時而被延長的failover時間。 但是,對於一些Online應用,RegionServer從宕機到恢復時間本身就很短的(網絡閃斷,crash等故障,運維可快速介入),如果調低timeout時間,反而會得不償失。因為當ReigonServer被正式從RS集群中移除時,HMaster就開始做balance了(讓其他RS根據故障機器記錄的WAL日志進行恢復)。當故障的RS在人工介入恢復后,這個balance動作是毫無意義的,反而會使負載不均勻,給RS帶來更多負擔。特別是那些固定分配regions的場景。

修改hbase-site.xml 
將此屬性設置為180000, 單位是毫秒

hbase.regionserver.handler.count

RegionServer的請求處理IO線程數。較少的IO線程,適用於處理單次請求內存消耗較高的Big PUT場景(大容量單次PUT或設置了較大cache的scan,均屬於Big PUT)或ReigonServer的內存比較緊張的場景。較多的IO線程,適用於單次請求內存消耗低,TPS要求(每秒事務處理量非常高的場景。設置該值的時候,以監控內存為主要參考。但是如果server的region數量很少,大量的請求都落在一個region上,因快速充滿memstore觸發flush導致的讀寫鎖會影響全局TPS,不是IO線程數越高越好。

修改hbase-site.xml 推薦設置為50

hbase.hregion.max.filesize

當前ReigonServer上單個Reigon的最大存儲空間,單個Region超過該值時,這個Region會被自動split成更小的region。小region對split和compaction友好,因為拆分region或compact小region里的storefile速度很快,內存占用低。缺點是split和compaction會很頻繁,特別是數量較多的小region不停地split, compaction,會導致集群響應時間波動很大,region數量太多不僅給管理上帶來麻煩,甚至會引發一些Hbase的bug。一般512M以下的都算小region。大region,則不太適合經常split和compaction,因為做一次compact和split會產生較長時間的停頓,對應用的讀寫性能沖擊非常大。此外,大region意味着較大的storefile,compaction時對內存也是一個挑戰。大region適合場景:如果應用場景中某個時間點的訪問量較低,那么此時做compact和split,既能順利完成split和compaction,又能保證絕大多數時間平穩的讀寫性能。

修改hbase-site.xml 
推薦設置為3758096384,單位是B,即3.5G

hfile.block.cache.size

storefile的讀緩存占用Heap的大小百分比,默認0.2表示20%。該值直接影響數據讀的性能。當然是越大越好,如果讀比寫多,開到0.4-0.5也沒問題。如果讀寫較均衡,0.3左右。如果寫比讀多,用默認即可。

修改hbase-site.xml 
推薦設置為0.2

hbase.hstore.blockingStoreFiles

阻塞寫請求的最大storefile數:即當一個store中有超過此值個storefile待compact,則阻塞寫請求。block寫請求會影響當前region的性能,將值設為單個region可以支撐的最大store file數量會是個不錯的選擇,即允許comapction時,memstore繼續生成storefile。最大storefile數量可通過region size/memstore size來計算。

默認7,若寫請求大大多於讀請求,修改修改hbase-site.xml,54 (3.5G/64M),但54太大,將其配置為15.

避免CMS concurrent mode failure

HBase使用CMS GC。默認觸發GC的時機是當年老代內存達到90%的時候,這個百分比由 -XX:CMSInitiatingOccupancyFraction=N 這個參數來設置。concurrent mode failed發生在這樣一個場景: 當年老代內存達到90%的時候,CMS開始進行並發垃圾收集,於此同時,新生代還在迅速不斷地晉升對象到年老代。當年老代CMS還未完成並發標記時,年老代滿了,悲劇就發生了。CMS因為沒內存可用不得不暫停mark,並觸發一次全jvm的stop the world(掛起所有線程),然后采用單線程拷貝方式清理所有垃圾對象。這個過程會非常漫長。為了避免出現concurrent mode failed,我們應該讓GC在未到90%時,就觸發。 通過設置 -XX:CMSInitiatingOccupancyFraction=N 這個百分比, 可以簡單的這么計算。如果你的 hfile.block.cache.size 和 hbase.regionserver.global.memstore.upperLimit 加起來有60%(默認),那么你可以設置 70-80,一般高10%左右差不多。

修改 hbase-env.shexport HBASE_OPTS="$HBASE_OPTS -ea -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"

maxClientCnxns

增大zookeeper的最大連接數可以提高集群的並發性能。

  • 修改hbase-site.xml文件,增大hbase.zookeeper.property.maxClientCnxns配置項的設置,推薦配置為2000。 
  • 對於獨立zookeeper集群的部署方案,應修改ZooKeeper的配置文件zoo.cfg,設置maxClientCnxns=2000。

5.3.3 客戶端優化配置

 

優化項

優化原理

優化方法

建表時預創建region

對於rowkey不以時間作為起始不分的表,可以在建表時預創建region,這樣便免去了開始寫入階段頻繁的split操作。

調用HBaseAdmin的 createTable(final HTableDescriptor desc, byte [][] splitKeys)方法來指定region的分隔符

客戶端AutoFlush

客戶端批量更新開關,設為false則當Put填滿客戶端flush緩存時,才發送到服務端。默認為true

使用HTable的setAutoFlush(boolean autoFlush)來配置為false

Scan Caching

scanner一次緩存多少數據來scan(從服務端一次抓多少數據回來scan)。

修改hbase-site.xml 推薦設置hbase.client.scanner.caching為500

用完關閉ResultScanners

若不關閉ResultScanner, RegionServer可能會出現問題(對應的Server資源無法釋放)。

通過scan取完數據后,要關閉ResultScanner。

選擇性關閉WAL寫日志

當Put一些非重要的數據時,可以關閉WAL,不預寫日志,可進一步提高寫性能,風險是,若RS宕機,則剛才put的數據會丟失,且無法恢復

調用Put的writeToWAL(false)

批量Put

在不影響業務要求的前提下,可以進行批量put,提高寫性能。

調用HTable的put(final List<Put> puts)方法來批量寫

設置不同備份數

在建表時,根據不同表數據的重要性,可以按照列族設置其備份數。

調用HColumnDescriptor的setReplication(short replica)來配置

TTL設置

可以設置列族的TTL(Time To Live, 存活時間),當前時間-錄入時間若超過了設置的TTL值,HBase會將其刪除,設置此項,方便管理有時效性限制的數據。

調用HColumnDescriptor.setTimeToLive(777600),參數單位為秒,如此便設置成3個月;默認是2147483647,68年多一些。

  
 

常見問題

Invalid maximum heap size: -Xmx0m
Could not create the Java virtual machine.
不正確的內存設置(分配給master的最大內存為0MB)會導致master的.out日志文件輸出上述信息,解決方法是修改hbase-env.sh文件,將HBase_MASTER_OPTS中添加-Xmx{size}m項,{size}表示內存大小,以MB為單位,如為master分配2G內存,可使用-Xmx2048m項。
ERROR: Table xxx is enabled. Disable it first.
HBase中應先disable表格,然后刪除表格,否則無法刪除表格,並出現上述信息。該信息還有可能在沒有disable表格之前就進行表格元數據(HTableDescription\HColumnDescription等)的修改操作。 
org.apache.zookeeper.ClientCnxn: Session 0x23c17f38b2e0000 for server null, unexpected error, closing socket connection and attempting reconnect
該錯誤是由於無法連接ZooKeeper集群造成的,出現上述問題時,請檢查如下幾項是否正常:

  • 網絡連接是否正常;
  • 防火牆是否關閉;
  • 檢查HBase ZooKeeper節點配置是否正確;
  • ZooKeeper集群是否運行。

...too many open files...
操作系統同時打開的文件數是有限的(默認為1024),超過該限制將出現上述錯誤。可以通過修改系統文件提高該值,具體如下:
在 /etc/security/limits.conf 的末尾加上以下兩行:
注意,應把下面的root替換成實際用來執行hbase client的linux用戶。
root    soft    nproc   65536
root    hard    nproc   65536
...Master rejected startup because clock is out of sync...
HBase內部各部件的RPC服務需要時間同步,當節點之間的時間差超出了配置的閾值(由hbase.master.maxclockskew配置項設定),將出現上述錯誤,並將導致無法啟動RegionServer。解決方法是調整各個節點的時間,使節點時間差小於設定值。為了一勞永逸的解決這個問題,建議在集群中配置NTP服務器。
...connection reset by peer...
網絡異常和客戶端長時間無操作都有可能導致服務器重置連接,出現上述現象。解決方案:

  • 如果是網絡異常造成上述現象出現,請檢查集群的網絡連接;
  • 如果是客戶端長時間無操作造成連接重置,只需在客戶端中加入重連邏輯即可。

... HBase is able to connect to ZooKeeper but the connection closes immediately....
網絡異常和連接數過多都可能導致上述問題的發生,解決方案:

  • 如果是網絡異常造成上述現象出現,請檢查集群的網絡連接;
  • 如果是連接數過多的情況,需修改配置項hbase.zookeeper.property.maxClientCnxns,增加連接數。

... ScannerTimeoutException...
HBase執行Scan操作時長時間沒有響應將導致上述異常,解決方案:

  • 修改hbase-site.xml,hbase.regionserver.lease.period改為180000,默認60000(ms)
  • 修改客戶端的配置:

conf.setLong(HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, 180000)
... Cluster key invalid, the format should be:...
不正確的系統升級或維護過程不恰當的操作使得一些舊的Zookeeper信息被保留下來,與新的Zookeeper集群發生沖突。解決方案:

    1. 停止HBase集群(如果使用的是獨立ZooKeeper集群,還需停止Zookeeper集群);
    2. 刪除每個ZooKeeper節點下的ZooKeeper數據(由hbase.zookeeper.property.dataDir配置)
    3. 重啟ZooKeeper集群和HBase集群。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM