1. 程式人生 > >HBase引數配置與優化

HBase引數配置與優化

hbase.rootdir   這個目錄是region server的共享目錄,用來持久化Hbase。URL需要是’完全正確’的,還要包含檔案系統的scheme。例如,要表示hdfs中的/hbase目錄,namenode執行在namenode.example.org的9090埠。則需要設定為hdfs://namenode.example.org:9000 /hbase。預設: file:///tmp/hbase-${user.name}/hbase

hbase.master.port   Hbase的Master的埠。預設: 60000

hbase.cluster.distributed   Hbase的執行模式。false是單機模式,true是分散式模式。若為false,Hbase和Zookeeper會執行在同一個JVM裡面。預設: false

hbase.tmp.dir   本地檔案系統的臨時資料夾。可以修改到一個更為持久的目錄上。(/tmp會在重啟時清除)預設: /tmp/hbase-${user.name}

hbase.master.info.port   HBase Master web 介面埠. 設定為-1 意味著不執行。預設: 60010

hbase.master.info.bindAddress   HBase Master web 介面繫結的埠。預設: 0.0.0.0

hbase.client.write.buffer   HTable 客戶端的寫緩衝的預設大小。這個值越大,需要消耗的記憶體越大。因為緩衝在客戶端和服務端都有例項,所以需要消耗客戶端和服務端兩個地方的記憶體。得到的好處是,可以減少RPC的次數。可以這樣估算伺服器端被佔用的記憶體:hbase.client.write.buffer * hbase.regionserver.handler.count

。預設: 2097152

hbase.regionserver.port   HBase RegionServer繫結的埠。預設: 60020

hbase.regionserver.info.port   HBase RegionServer web 介面繫結的埠,設定為-1表示不執行 RegionServer 介面。預設: 60030

hbase.regionserver.info.port.auto   Master或RegionServer是否要動態搜一個可以用的埠來繫結介面。當hbase.regionserver.info.port已經被佔用的時候,可以搜一個空閒的埠繫結。這個功能在測試的時候很有用。預設關閉。預設: false

hbase.regionserver.info.bindAddress   HBase RegionServer web 介面的IP地址。預設: 0.0.0.0

hbase.client.pause   通常的客戶端暫停時間。最多的用法是客戶端在重試前的等待時間。比如失敗的get操作和region查詢操作等都很可能用到。預設: 1000

hbase.client.retries.number   最大重試次數。例如 region查詢,Get操作,Update操作等等都可能發生錯誤,需要重試。這是最大重試錯誤的值。預設: 10

hbase.client.scanner.caching   當呼叫Scanner的next方法,而值又不在快取裡的時候,從服務端一次獲取的行數。越大的值意味著Scanner會快一些,但是會佔用更多的記憶體。當緩衝被佔滿的時候,next方法呼叫會越來越慢。慢到一定程度,可能會導致超時。例如超過了hbase.regionserver.lease.period。預設: 1

hbase.client.keyvalue.maxsize   一個KeyValue例項的最大size.這個是用來設定儲存檔案中的單個entry的大小上界。因為一個KeyValue是不能分割的,所以可以避免因為資料過大導致region不可分割。明智的做法是把它設為可以被最大region size整除的數。如果設定為0或者更小,就會禁用這個檢查。預設10MB。

hbase.regionserver.lease.period   客戶端租用HRegion server 期限,即超時閥值。單位是毫秒。預設情況下,客戶端必須在這個時間內發一條資訊,否則視為死掉。預設: 60000

hbase.regionserver.handler.count   RegionServers受理的RPC Server例項數量。對於Master來說,這個屬性是Master受理的handler數量,預設: 10

hbase.regionserver.msginterval   RegionServer 發訊息給 Master 時間間隔,單位是毫秒。預設: 3000

hbase.regionserver.optionallogflushinterval   將Hlog同步到HDFS的間隔。如果Hlog沒有積累到一定的數量,到了時間,也會觸發同步。單位毫秒,預設: 1000

hbase.regionserver.regionSplitLimit   region的數量到了這個值後就不會在分裂了。這不是一個region數量的硬性限制。但是起到了一定指導性的作用,到了這個值就該停止分裂了。預設是MAX_INT,就是說不阻止分裂。

hbase.regionserver.logroll.period   提交commit log的間隔,不管有沒有寫足夠的值。預設: 3600000

hbase.regionserver.thread.splitcompactcheckfrequency   region server 多久執行一次split/compaction 檢查.預設: 20000

hbase.regionserver.nbreservationblocks   儲備的記憶體block的數量。當發生out of memory 異常的時候,我們可以用這些記憶體在RegionServer停止之前做清理操作。預設: 4

hbase.balancer.period   Master執行region balancer的間隔。預設: 300000

hbase.regions.slop   當任一regionserver有average + (average * slop)個region是會執行Rebalance。預設: 0

hbase.master.logcleaner.ttl   Hlog存在於.oldlogdir 資料夾的最長時間, 超過了就會被 Master 的執行緒清理掉.預設: 600000

hbase.regionserver.global.memstore.upperLimit   單個region server的全部memtores的最大值。超過這個值,一個新的update操作會被掛起,強制執行flush操作。預設: 0.4

hbase.regionserver.global.memstore.lowerLimit   當強制執行flush操作的時候,當低於這個值的時候,flush會停止。預設是堆大小的 35% . 如果這個值和 hbase.regionserver.global.memstore.upperLimit相同就意味著當update操作因為記憶體限制被掛起時,會盡量少的執行flush(譯者注:一旦執行flush,值就會比下限要低,不再執行)

hbase.server.thread.wakefrequency   service工作的sleep間隔,單位毫秒。 可以作為service執行緒的sleep間隔,比如log roller.預設: 10000

hbase.hregion.memstore.flush.size   當memstore的大小超過這個值的時候,會flush到磁碟。這個值被一個執行緒每隔hbase.server.thread.wakefrequency檢查一下。預設: 67108864

hbase.hregion.preclose.flush.size   當一個region中的memstore的大小大於這個值的時候,我們又觸發了close.會先執行“pre-flush”操作,清理這個需要關閉的 memstore,然後將這個region下線。當一個region下線了,我們無法再進行任何寫操作。如果一個memstore很大的時候,flush 操作會消耗很多時間。”pre-flush”操作意味著在region下線之前,會先把memstore清空。這樣在最終執行close操作的時 候,flush操作會很快。預設: 5242880

hbase.hregion.memstore.block.multiplier   如果memstore有hbase.hregion.memstore.block.multiplier倍數的 hbase.hregion.flush.size的大小,就會阻塞update操作。這是為了預防在update高峰期會導致的失控。如果不設上界,flush的時候會花很長的時間來合併或者分割,最壞的情況就是引發out of memory異常。預設: 2

hbase.hregion.max.filesize   最大HStoreFile大小。若某個Column families的HStoreFile增長達到這個值,這個Hegion會被切割成兩個。預設: 256M.

hbase.hstore.compactionThreshold   當一個HStore含有多於這個值的HStoreFiles(每一個memstore flush產生一個HStoreFile)的時候,會執行一個合併操作,把這HStoreFiles寫成一個。這個值越大,需要合併的時間就越長。預設: 3

hbase.hstore.blockingStoreFiles   當一個HStore含有多於這個值的HStoreFiles(每一個memstore flush產生一個HStoreFile)的時候,會執行一個合併操作,update會阻塞直到合併完成,直到超過了hbase.hstore.blockingWaitTime的值。預設: 7

hbase.hstore.blockingWaitTime   hbase.hstore.blockingStoreFiles所限制的StoreFile數量會導致update阻塞,這個時間是來限制阻塞時間的。當超過了這個時間,HRegion會停止阻塞update操作,不過合併還有沒有完成。預設: 90000,單位ms。

hbase.hstore.compaction.max   每個“小”合併的HStoreFiles最大數量。預設: 10

hbase.hregion.majorcompaction   一個Region中的所有HStoreFile的major compactions的時間間隔。預設是1天。 設定為0就是禁用這個功能。預設: 86400000

hbase.mapreduce.hfileoutputformat.blocksize   MapReduce 中HFileOutputFormat可以寫 storefiles/hfiles. 這個值是hfile的blocksize的最小值。通常在Hbase寫Hfile的時候,bloocksize是由table schema(HColumnDescriptor)決定的,但是在mapreduce寫的時候,我們無法獲取schema中blocksize。這個值 越小,你的索引就越大,你隨機訪問需要獲取的資料就越小。如果你的cell都很小,而且你需要更快的隨機訪問,可以把這個值調低。預設: 65536

hfile.block.cache.size   分配給HFile/StoreFile的block cache佔最大堆(-Xmx setting)的比例。預設是20%,設定為0就是不分配。預設: 0.2

hbase.hash.type   雜湊函式使用的雜湊演算法。可以選擇兩個值:: murmur (MurmurHash) 和 jenkins (JenkinsHash). 這個雜湊是給 bloom filters用的.預設: murmur

zookeeper.session.timeout   ZooKeeper 會話超時.Hbase把這個值傳遞改zk叢集,向他推薦一個會話的最大超時時間。單位是毫秒,預設: 180000

zookeeper.znode.parent   ZooKeeper中的Hbase的根ZNode。所有的Hbase的ZooKeeper會用這個目錄配置相對路徑。預設情況下,所有的Hbase的ZooKeeper檔案路徑是用相對路徑,所以他們會都去這個目錄下面。預設: /hbase

zookeeper.znode.rootserver   ZNode 儲存的根region的路徑. 這個值是由Master來寫,client和regionserver 來讀的。如果設為一個相對地址,父目錄就是 ${zookeeper.znode.parent}.預設情形下,意味著根region的路徑儲存在/hbase/root-region- server.預設: root-region-server

hbase.zookeeper.quorum   Zookeeper 叢集的地址列表,用逗號分割。例 如:"host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".預設是 localhost,是給偽分散式用的。要修改才能在完全分散式的情況下使用。如果在hbase-env.sh設定了HBASE_MANAGES_ZK, 這些ZooKeeper節點就會和Hbase一起啟動。預設: localhost

hbase.zookeeper.peerport   ZooKeeper節點使用的埠。預設: 2888

hbase.zookeeper.leaderport   ZooKeeper用來選擇Leader的埠,預設: 3888

hbase.zookeeper.property.initLimit   ZooKeeper的zoo.conf中的配置。 初始化synchronization階段的ticks數量限制。預設: 10

hbase.zookeeper.property.syncLimit   ZooKeeper的zoo.conf中的配置。 傳送一個請求到獲得承認之間的ticks的數量限制,預設: 5

hbase.zookeeper.property.dataDir   ZooKeeper的zoo.conf中的配置。 快照的儲存位置,預設: ${hbase.tmp.dir}/zookeeper

hbase.zookeeper.property.clientPort   ZooKeeper的zoo.conf中的配置。 客戶端連線的埠,預設: 2181

hbase.zookeeper.property.maxClientCnxns   ZooKeeper的zoo.conf中的配置。 ZooKeeper叢集中的單個節點接受的單個Client(以IP區分)的請求的併發數。這個值可以調高一點,防止在單機和偽分散式模式中出問題。預設: 2000

hbase.rest.port   HBase REST server的埠,預設: 8080

hbase.rest.readonly   定義REST server的執行模式。可以設定成如下的值: false: 所有的HTTP請求都是被允許的 - GET/PUT/POST/DELETE. true:只有GET請求是被允許的。預設: false

zookeeper.session.timeout   預設值3分鐘(180000ms)。RegionServer與Zookeeper間的連線超時時間。當超時時間到後,ReigonServer會 被Zookeeper從RS叢集清單中移除,HMaster收到移除通知後,會對這臺server負責的regions重新balance,讓其他存活的 RegionServer接管.   調優:這個timeout決定了RegionServer是否能夠及時的failover。設定成1分鐘或更低,可以減少因等待超時而被延長的failover時間。   不過需要注意的是,對於一些Online應用,RegionServer的宕機到恢復時間本身就很短的(網路閃斷,crash等故障,運維可快速介入), 如果調低timeout時間,會得不償失。因為當ReigonServer被正式從RS叢集中移除時,HMaster就開始做balance了,當故障的 RS快速恢復後,這個balance動作是毫無意義的,反而會使負載不均勻,給RS帶來更多負擔。

hbase.regionserver.handler.count   預設值10。RegionServer的請求處理IO執行緒數。   調優:這個引數的調優與記憶體息息相關。較少的IO執行緒,適用於處理單次請求記憶體消耗較高的Big PUT場景(大容量單次PUT或設定了較大cache的scan,均屬於Big PUT)或ReigonServer的記憶體比較緊張的場景。   較多的IO執行緒,適用於單次請求記憶體消耗低,TPS要求非常高的場景。這裡需要注意的是如果server的region數量很少,大量的請求都落在一個region上,因快速充滿memstore觸發flush導致的讀寫鎖會影響全域性TPS,不是IO執行緒數越高越好。

hbase.hregion.max.filesize   預設值256M。在當前ReigonServer上單個Reigon的大小,單個Region超過指定值時,這個Region會被自動split成更小的region。   調優:小region對split和compaction友好,因為拆分region或compact小region裡的storefile速度很快,記憶體佔用低。缺點是split和compaction會很頻繁。   特別是數量較多的小region不停地split, compaction,會使響應時間波動很大,region數量太多不僅給管理上帶來麻煩,甚至引發一些Hbase的bug。 一般512以下的都算小region。   大region,則不太適合經常split和compaction,因為做一次compact和split會產生較長時間的停頓,對應用的讀寫效能衝擊非常大。此外,大region意味著較大的storefile,compaction時對記憶體也是一個挑戰。   當然,大region還是有其用武之地,你只要在某個訪問量低峰的時間點統一做compact和split,大region就可以發揮優勢了,畢竟它能保證絕大多數時間平穩的讀寫效能。   compaction是無法避免的,split倒是可以從自動調整為手動。只要通過將這個引數值調大到某個很難達到的值,比如100G,就可以間接禁用自動split(RegionServer不會對未到達100G的region做split)。   記憶體方面,小region在設定memstore的大小值上比較靈活,大region則過大過小都不行,過大會導致flush時app的IO wait增高,過小則因store file過多讀效能降低。

hbase.regionserver.global.memstore.upperLimit/lowerLimit   預設值。0.4/0.35   upperlimit說明:hbase.hregion.memstore.flush.size這個引數的作用是 當單個memstore達到指定值時,flush該memstore。但是,一臺ReigonServer可能有成百上千個memstore,每個 memstore也許未達到flush.size,jvm的heap就不夠用了。該引數就是為了限制memstores佔用的總記憶體。   當ReigonServer內所有的memstore所佔用的記憶體綜合達到heap的40%時,HBase會強制block所有的更新並flush這些memstore以釋放所有memstore佔用的記憶體。   lowerLimit說明: 同upperLimit,只不過當全域性memstore的記憶體達到35%時,它不會flush所有的memstore,它會找一些記憶體佔用較大的 memstore,個別flush,當然更新還是會被block。lowerLimit算是一個在全域性flush前的補救措施。可以想象一下,如果 memstore需要在一段時間內全部flush,且這段時間內無法接受寫請求,對HBase叢集的效能影響是很大的。   這是一個Heap記憶體保護引數,預設值已經能適用大多數場景。它的調整一般是為了配合某些專屬優化,比如讀密集型應用,將讀快取開大,降低該值,騰出更多記憶體給其他模組使用。   這個引數會給使用者帶來什麼影響?比如,10G記憶體,100個region,每個memstore 64M,假設每個region只有一個memstore,那麼當100個memstore平均佔用到50%左右時,就會達到lowerLimit的限制。 假設此時,其他memstore同樣有很多的寫請求進來。在那些大的region未flush完,就可能又超過了upperlimit,則所有 region都會被block,開始觸發全域性flush。

hfile.block.cache.size   預設值0.2。storefile的讀快取佔用Heap的大小百分比,0.2表示20%。該值直接影響資料讀的效能。   該值當然是越大越好,如果讀比寫少,開到0.4-0.5也沒問題。如果讀寫較均衡,0.3左右。如果寫比讀多,果斷 預設吧。設定這個值的時候,你同時要參考 hbase.regionserver.global.memstore.upperLimit ,該值是 memstore佔heap的最大百分比,兩個引數一個影響讀,一個影響寫。如果兩值加起來超過80-90%,會有OOM的風險,謹慎設定。

hbase.hstore.blockingStoreFiles   預設值7。在compaction時,如果一個Store(Coulmn Family)內有超過7個storefile需要合併,則block所有的寫請求,進行flush,限制storefile數量增長過快。   block請求會影響當前region的讀寫效能,將值設為單個region可以支撐的最大store file數量會是個不錯的選擇。最大storefile數量可通過region size/memstore size來計算。如果你將region size設為無限大,那麼你需要預估一個region可能產生的最大storefile數。

hbase.hregion.memstore.flush.size   每次update之後會檢查此region memstore是否達到這個大小,達到之後就會請求flush。預設值為64MB

hbase.hregion.memstore.block.multiplier   預設值2。當一個region裡的memstore超過hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier的大小時,block該 region的所有請求,進行flush,釋放記憶體。雖然我們設定了memstore的總大小,比如64M,但想象一下,在最後63.9M的時候,我 Put了一個100M的資料或寫請求量暴增,最後一秒鐘put了1萬次,此時memstore的大小會瞬間暴漲到超過預期的memstore.size。 這個引數的作用是當memstore的大小增至超過memstore.size時,block所有請求,遏制風險進一步擴大。   這個引數的預設值還是比較靠譜的。如果你預估你的正常應用場景(不包括異常)不會出現突發寫或寫的量可控,那麼保持預設值即可。如果正常情況下,你的寫量 就會經常暴增,那麼你應該調大這個倍數並調整其他引數值,比如hfile.block.cache.sizehbase.regionserver.global.memstore.upperLimit/lowerLimit,以預留更多記憶體,防止HBase server OOM。