一、背景
在實(shí)際的生產(chǎn)業(yè)務(wù)中,有這樣一種場(chǎng)景,業(yè)務(wù)上面需要不定期的將一份存放在hdfs上面的海量數(shù)據(jù)導(dǎo)入到HBase中,作為冷啟動(dòng)的數(shù)據(jù),基于目前存在的Hbase版本,可選擇的常見(jiàn)方式有兩種:基于寫(xiě)入API的方式;基于HBase Bulkload的方式。
二、寫(xiě)入方式對(duì)比
1 基于API寫(xiě)入的方式
優(yōu)勢(shì):
- 實(shí)現(xiàn)簡(jiǎn)單,直接調(diào)用HBase簡(jiǎn)易的寫(xiě)入API即可完成數(shù)據(jù)的寫(xiě)入。
- 不用關(guān)注底層數(shù)據(jù)存儲(chǔ)的,hbase會(huì)將傳入的數(shù)據(jù)根據(jù)rowkey發(fā)送到指定的RegionServer進(jìn)行存儲(chǔ)。
劣勢(shì):
- 需要訪問(wèn)Region Server,在頻繁寫(xiě)入超大數(shù)據(jù)量的時(shí)候容易產(chǎn)生資源問(wèn)題。
- 引起RegionServer頻繁flush,進(jìn)而不斷compact、split,影響集群穩(wěn)定性。
- 引起RegionServer頻繁GC,影響集群穩(wěn)定性;消耗大量CPU資源、帶寬資源、內(nèi)存資源以及IO資源,與其他業(yè)務(wù)產(chǎn)生資源競(jìng)爭(zhēng)。
- 在某些場(chǎng)景下,比如平均KV大小比較大的場(chǎng)景,會(huì)耗盡RegionServer的處理線程,導(dǎo)致集群阻塞。
2 基于HBase Bulkload的方式
優(yōu)勢(shì):
- 數(shù)據(jù)可以立即被hbase使用,并且不會(huì)對(duì)集群造成額外的負(fù)載和延遲。
- BulkLoad操作不會(huì)預(yù)寫(xiě)日志(WALs),因此不會(huì)引起過(guò)量的flush和split。
- BulkLoad操作不會(huì)引起過(guò)多的垃圾回收(GC) 。
劣勢(shì):
- 實(shí)現(xiàn)復(fù)雜,需要自己將存儲(chǔ)數(shù)據(jù)構(gòu)造成符合HBase底層HFile存儲(chǔ)文件的格式。
- 底層操作容易很容易造成一些未知的元數(shù)據(jù)問(wèn)題。
鑒于兩種方式的對(duì)比,Bulkload方式不需要將數(shù)據(jù)寫(xiě)入請(qǐng)求發(fā)送給RegionServer處理,可以有效避免基于API寫(xiě)入導(dǎo)致的一切資源問(wèn)題,所有采用基于HBase Bulkload方式進(jìn)行海量離線hdfs數(shù)據(jù)導(dǎo)入HBase是可行的。
三、HBase儲(chǔ)存原理
HBase存儲(chǔ)數(shù)據(jù)其底層使用的是HDFS來(lái)作為存儲(chǔ)介質(zhì),HBase的每一張表對(duì)應(yīng)的HDFS目錄上的一個(gè)文件夾,文件夾名以HBase表進(jìn)行命名(如果沒(méi)有使用命名空間,則默認(rèn)在default目錄下),在表文件夾下存放在若干個(gè)Region命名的文件夾,Region文件夾中的每個(gè)列簇也是用文件夾進(jìn)行存儲(chǔ)的,每個(gè)列簇中存儲(chǔ)就是實(shí)際的數(shù)據(jù),以HFile的形式存在。路徑格式如下:
/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
四、核心流程
從HBase的視角來(lái)看,BulkLoad主要由兩個(gè)階段組成:

1 HFile生成階段
這個(gè)階段會(huì)運(yùn)行一個(gè)MapReduce任務(wù),MapReduce的mapper需要自己實(shí)現(xiàn),將HDFS文件中的數(shù)據(jù)讀出來(lái)組裝成一個(gè)復(fù)合KV,其中Key是rowkey,Value可以是KeyValue對(duì)象、Put對(duì)象甚至Delete對(duì)象;MapReduce的reducer由HBase負(fù)責(zé),通過(guò)方法HFileOutputFormat2.configureIncrementalLoad()進(jìn)行配置,這個(gè)方法主要負(fù)責(zé)以下事項(xiàng)。
- 根據(jù)表信息配置一個(gè)全局有序的partitioner。
- 將partitioner文件上傳到HDFS集群并寫(xiě)入DistributedCache。
- 設(shè)置reduce task的個(gè)數(shù)為目標(biāo)表Region的個(gè)數(shù)。
- 設(shè)置輸出key/value類滿足HFileOutputFormat所規(guī)定的格式要求。
- 根據(jù)類型設(shè)置reducer執(zhí)行相應(yīng)的排序(KeyValueSortReducer或者PutSortReducer)。
這個(gè)階段會(huì)為每個(gè)Region生成一個(gè)對(duì)應(yīng)的HFile文件。
2 HFile導(dǎo)入階段
HFile準(zhǔn)備就緒之后,就可以使用工具completebulkload將HFile加載到在線HBase集群。completebulkload工具主要負(fù)責(zé)以下工作。
- 依次檢查第一步生成的所有HFile文件,將每個(gè)文件映射到對(duì)應(yīng)的Region。
- 將HFile文件移動(dòng)到對(duì)應(yīng)Region所在的HDFS文件目錄下。
- 告知Region對(duì)應(yīng)的RegionServer,加載HFile文件對(duì)外提供服務(wù)。
如果在BulkLoad的中間過(guò)程中Region發(fā)生了分裂,completebulkload工具會(huì)自動(dòng)將對(duì)應(yīng)的HFile文件按照新生成的Region邊界切分成多個(gè)HFile文件,保證每個(gè)HFile都能與目標(biāo)表當(dāng)前的Region相對(duì)應(yīng)。但這個(gè)過(guò)程需要讀取HFile內(nèi)容,因而并不高效。需要盡量減少HFile生成階段和HFile導(dǎo)入階段的延遲,最好能夠在HFile生成之后立刻執(zhí)行HFile導(dǎo)入。
打完收工!
文章內(nèi)容來(lái)自于書(shū)本以及互聯(lián)網(wǎng)資源整理,僅供學(xué)習(xí),侵權(quán)聯(lián)系刪除。