Hbase優化入門
Hbase有哪些優化策略?
預分割槽
預設情況下,在建立 HBase 表的時候會自動建立一個 Region 分割槽,當匯入資料的時候,所有的 HBase 客戶端都向這一個 Region 寫資料,直到這個 Region 足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先建立一些空的 Regions,這樣當資料寫入 HBase 時,會按照 Region 分割槽情況,在叢集內做資料的負載均衡。
RowKey優化
- 將最近要經常訪問的資料儲存到一塊,(怎麼做呢?利用排序,因為hbase預設會對rowkey按照字典進行排序)
- 加鹽,反轉,加雜湊值等等避免熱點問題
減少列族數量
設計原因,列族過多時會觸發較多的IO操作.
快取策略
建立表的時候,可以通過 HColumnDescriptor.setInMemory(true)
將表放到 RegionServer 的快取中,保證在讀取的時候被 cache 命中。
設定儲存生命期
建立表的時候,可以通過 HColumnDescriptor.setTimeToLive(int timeToLive)
設定表中資料的儲存生命期,過期資料將自動被刪除。
分配合適的記憶體給RegionServer服務
在不影響其他服務的情況下,越大越好。例如在 HBase 的 conf 目錄下的 hbase-env.sh 的最後新增 export HBASE_REGIONSERVER_OPTS="-Xmx16000m$HBASE_REGIONSERVER_OPTS”
其中 16000m 為分配給 RegionServer 的記憶體大小。
寫資料的備份數
備份數與讀效能成正比,與寫效能成反比,且備份數影響高可用性。有兩種配置方式,一種是將 hdfs-site.xml拷貝到 hbase 的 conf 目錄下,然後在其中新增或修改配置項 dfs.replication 的值為要設定的備份數,這種修改對所有的 HBase 使用者表都生效,另外一種方式,是改寫 HBase 程式碼,讓 HBase 支援針對列族設定備份數,在建立表時,設定列族備份數,預設為 3,此種備份數只對設定的列族生效。
WAL(預寫日誌)
可設定開關,表示 HBase 在寫資料前用不用先寫日誌,預設是開啟,關掉會提高效能,但是如果系統出現故障(負責插入的 RegionServer 掛掉),資料可能會丟失。配置 WAL 在呼叫 JavaAPI 寫入時,設定 Put 例項的WAL,呼叫 Put.setWriteToWAL(boolean)
。
不過新版這個方法已經棄用了
def putdata(): Unit = {
val put = new Put(Bytes.toBytes("rk0001"))
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("lisi"))
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("15"))
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("height"), Bytes.toBytes("180"))
val table: Table = HbaseUtil.getTable("ns1:students")
put.setWriteToWAL(false)
table.put(put)
}
批量寫
HBase 的 Put 支援單條插入,也支援批量插入,一般來說批量寫更快,節省來回的網路開銷。在客戶端呼叫JavaAPI 時,先將批量的 Put 放入一個 Put 列表,然後呼叫 HTable 的 Put(Put 列表) 函式來批量寫。
demo
def batchPutdata(): Unit = {
import org.apache.hadoop.hbase.util.Bytes
import java.util
val list = new util.ArrayList[Put]()
val put1 = new Put(Bytes.toBytes("rk00002"))
put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("zhenji"))
put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("23"))
put1.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("f"))
val put2 = new Put(Bytes.toBytes("rk00003"))
put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("zhaoyun"))
put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("25"))
put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("m"))
val put3 = new Put(Bytes.toBytes("rk00004"))
put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("liubei"))
put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("30"))
put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("m"))
val table: Table = HbaseUtil.getTable("ns1:students")
list.add(put1)
list.add(put2)
list.add(put3)
table.put(list)
}
客戶端一次從伺服器拉取的數量
通過配置一次拉去的較大的資料量可以減少客戶端獲取資料的時間,但是它會佔用客戶端記憶體。有三個地方可進行配置:
1)在 HBase 的 conf 配置檔案中進行配置 hbase.client.scanner.caching;
2)通過呼叫HTable.setScannerCaching(intscannerCaching) 進行配置;
3)通過呼叫Scan.setCaching(intcaching) 進行配置。三者的優先順序越來越高。
def scan(): Unit = {
val scan = new Scan(Bytes.toBytes("rk00001"), Bytes.toBytes("rk0001"))
//設定要傳遞給掃描器的快取行數。
// 如果未設定,則將應用配置設定HConstants.HBASE_CLIENT_SCANNER_CACHING。 較高的快取值將啟用更快的掃描程式,但將使用更多的記憶體。
scan.setCaching(1000)
val table: Table = HbaseUtil.getTable("ns1:students")
val scanner: ResultScanner = table.getScanner(scan)
val scit: util.Iterator[Result] = scanner.iterator()
while (scit.hasNext) {
val result: Result = scit.next()
HbaseUtil.printResult(result)
}
}
RegionServer的請求處理I/O執行緒數
較少的 IO 執行緒適用於處理單次請求記憶體消耗較高的 Big Put 場景 (大容量單次 Put 或設定了較大 cache 的Scan,均屬於 Big Put) 或 ReigonServer 的記憶體比較緊張的場景。
較多的 IO 執行緒,適用於單次請求記憶體消耗低,TPS 要求 (每秒事務處理量 (TransactionPerSecond)) 非常高的場景。設定該值的時候,以監控記憶體為主要參考。
在 hbase-site.xml 配置檔案中配置項為 hbase.regionserver.handler.count
。
Region的大小設定
配置項為 hbase.hregion.max.filesize
,所屬配置檔案為 hbase-site.xml.,預設大小 256M。
在當前 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 時對記憶體也是一個挑戰。如果你的應用場景中,某個時間點的訪問量較低,那麼在此時做 compact 和 split,既能順利完成 split 和 compaction,又能保證絕大多數時間平穩的讀寫效能。compaction 是無法避免的,split 可以從自動調整為手動。只要通過將這個引數值調大到某個很難達到的值,比如 100G,就可以間接禁用自動 split(RegionServer 不會對未到達 100G 的 Region 做split)。再配合 RegionSplitter 這個工具,在需要 split 時,手動 split。
手動 split 在靈活性和穩定性上比起自動split 要高很多,而且管理成本增加不多,比較推薦 online 實時系統使用。記憶體方面,小 Region 在設定memstore 的大小值上比較靈活,大 Region 則過大過小都不行,過大會導致 flush 時 app 的 IO wait 增高,過小則因 StoreFile 過多影響讀效能。
.作業系統引數
Linux系統最大可開啟檔案數一般預設的引數值是1024,如果你不進行修改併發量上來的時候會出現“Too Many Open Files”的錯誤,導致整個HBase不可執行,你可以用ulimit -n
命令進行修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max 的引數,具體如何修改可以去Google 關鍵字 “linux limits.conf ”
15.Jvm配置
修改 hbase-env.sh 檔案中的配置引數,根據你的機器硬體和當前作業系統的JVM(32/64位)配置適當的引數
HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小
HBASE_OPTS "‐server ‐XX:+UseConcMarkSweepGC"JVM GC 選項
HBASE_MANAGES_ZKfalse 是否使用Zookeeper進行分散式管理
持久化
重啟作業系統後HBase中資料全無,你可以不做任何修改的情況下,建立一張表,寫一條資料進行,然後將機器重啟,重啟後你再進入HBase的shell中使用 list 命令檢視當前所存在的表,一個都沒有了。是不是很杯具?沒有關係你可以在hbase/conf/hbase-default.xml中設定hbase.rootdir的值,來設定檔案的儲存位置指定一個資料夾,例如:file:///you/hbase-data/path,你建立的HBase中的表和資料就直接寫到了你的磁碟上,同樣你也可以指定你的分散式檔案系統HDFS的路徑例如:hdfs://NAMENODE_SERVER:PORT/HBASE_ROOTDIR,這樣就寫到了你的分散式檔案系統上了。
緩衝區大小
hbase.client.write.buffer
這個引數可以設定寫入資料緩衝區的大小,當客戶端和伺服器端傳輸資料,伺服器為了提高系統執行效能開闢一個寫的緩衝區來處理它,這個引數設定如果設定的大了,將會對系統的記憶體有一定的要求,直接影響系統的效能。
. 掃描目錄表
hbase.master.meta.thread.rescanfrequency
定義多長時間HMaster對系統表 root 和 meta 掃描一次,這個引數可以設定的長一些,降低系統的能耗。
split/compaction時間間隔
hbase.regionserver.thread.splitcompactcheckfrequency
這個引數是表示多久去RegionServer伺服器執行一次split/compaction的時間間隔,當然split之前會先進行一個compact操作.這個compact操作可能是minorcompact也可能是major compact.compact後,會從所有的Store下的所有StoreFile檔案最大的那個取midkey.這個midkey可能並不處於全部資料的mid中.一個row-key的下面的資料可能會跨不同的HRegion。
快取在JVM堆中分配的百分比
hfile.block.cache.size
指定HFile/StoreFile 快取在JVM堆中分配的百分比,預設值是0.2,意思就是20%,而如果你設定成0,就表示對該選項遮蔽。
ZooKeeper客戶端同時訪問的併發連線數
hbase.zookeeper.property.maxClientCnxns
這項配置的選項就是從zookeeper中來的,表示ZooKeeper客戶端同時訪問的併發連線數,ZooKeeper對於HBase來說就是一個入口這個引數的值可以適當放大些。
memstores佔用堆的大小引數配置
hbase.regionserver.global.memstore.upperLimit
在RegionServer中所有memstores佔用堆的大小引數配置,預設值是0.4,表示40%,如果設定為0,就是對選項進行遮蔽。
Memstore中快取寫入大小
hbase.hregion.memstore.flush.size
Memstore中快取的內容超過配置的範圍後將會寫到磁碟上,例如:刪除操作是先寫入MemStore裡做個標記,指示那個value, column 或 family等下是要刪除的,HBase會定期對儲存檔案做一個major compaction,在那時HBase會把MemStore刷入一個新的HFile儲存檔案中。如果在一定時間範圍內沒有做major compaction,而Memstore中超出的範圍就寫入磁碟上了。
資料來源:
作者:辛修燦
來源:CSDN
原文:https://blog.csdn.net/u012743772/article/details/77098128
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- JVM效能優化入門指南JVM優化
- ASP.NET 效能監控和優化入門ASP.NET優化
- ASP.NET效能監控和優化入門ASP.NET優化
- 斜率最佳化入門
- 前端時間國際化入門前端
- Android外掛化入門指南Android
- HBase篇--HBase常用優化優化
- 漫談Nuclear Web元件化入門篇Web元件化
- Hbase優化優化
- 讀書筆記:《SEO教程:搜尋引擎優化入門與進階》(4)——程式碼優化筆記優化
- 系列化入門讀物-PART 3 (轉)
- HBase入門教程
- 前端必看的資料視覺化入門指南前端視覺化
- 《iOS 專案化入門教程之試題2》iOS
- 《iOS 專案化入門教程之試題4》iOS
- 資料庫向量化入門與實現資料庫
- HBase查詢優化優化
- HBase 基本入門篇
- Python中format函式字串格式化入門PythonORM函式字串格式化
- RobotFramework + Python 自動化入門 四 (Web進階)FrameworkPythonWeb
- PHP的序列化和反序列化入門PHP
- HBase的特徵和優點特徵
- HBase建模、使用以及優化優化
- Apache HBase MTTR 優化實踐Apache優化
- 一條資料HBase之旅,簡明HBase入門教程開篇
- Flutter資料持久化入門以及與Web開發的對比Flutter持久化Web
- 函式正規化入門(惰性求值與函式式狀態)函式
- 辦公自動化入門指南,從此告別繁瑣操作
- 資訊圖製作與WEB資料視覺化入門培訓Web視覺化
- HBase資料庫效能調優OW資料庫
- python函式每日一講 - format函式字串格式化入門Python函式ORM字串格式化
- HBase最佳實踐-讀效能優化策略優化
- HBase記憶體配置及JVM優化記憶體JVM優化
- hadoop hive hbase 入門學習 (三)HadoopHive
- HBase最佳實踐-列族設計優化優化
- HBase 資料庫檢索效能優化策略資料庫優化
- Android元件化入門:一步步搭建元件化架構Android元件化架構
- HBase 讀流程解析與優化的最佳實踐優化