一、背景
在實(shí)際的生產(chǎn)業(yè)務(wù)中,有這樣一種場景粒没,業(yè)務(wù)上面需要不定期的將一份存放在hdfs上面的海量數(shù)據(jù)導(dǎo)入到HBase中,作為冷啟動(dòng)的數(shù)據(jù)簇爆,基于目前存在的Hbase版本癞松,可選擇的常見方式有兩種:基于寫入API的方式;基于HBase Bulkload的方式入蛆。
二拦惋、寫入方式對比
1 基于API寫入的方式
優(yōu)勢:
- 實(shí)現(xiàn)簡單,直接調(diào)用HBase簡易的寫入API即可完成數(shù)據(jù)的寫入安寺。
- 不用關(guān)注底層數(shù)據(jù)存儲的,hbase會(huì)將傳入的數(shù)據(jù)根據(jù)rowkey發(fā)送到指定的RegionServer進(jìn)行存儲首尼。
劣勢:
- 需要訪問Region Server挑庶,在頻繁寫入超大數(shù)據(jù)量的時(shí)候容易產(chǎn)生資源問題。
- 引起RegionServer頻繁flush软能,進(jìn)而不斷compact迎捺、split,影響集群穩(wěn)定性查排。
- 引起RegionServer頻繁GC凳枝,影響集群穩(wěn)定性;消耗大量CPU資源、帶寬資源岖瑰、內(nèi)存資源以及IO資源叛买,與其他業(yè)務(wù)產(chǎn)生資源競爭。
- 在某些場景下蹋订,比如平均KV大小比較大的場景率挣,會(huì)耗盡RegionServer的處理線程,導(dǎo)致集群阻塞露戒。
2 基于HBase Bulkload的方式
優(yōu)勢:
- 數(shù)據(jù)可以立即被hbase使用椒功,并且不會(huì)對集群造成額外的負(fù)載和延遲。
- BulkLoad操作不會(huì)預(yù)寫日志(WALs)智什,因此不會(huì)引起過量的flush和split动漾。
- BulkLoad操作不會(huì)引起過多的垃圾回收(GC) 。
劣勢:
- 實(shí)現(xiàn)復(fù)雜荠锭,需要自己將存儲數(shù)據(jù)構(gòu)造成符合HBase底層HFile存儲文件的格式旱眯。
- 底層操作容易很容易造成一些未知的元數(shù)據(jù)問題。
鑒于兩種方式的對比节沦,Bulkload方式不需要將數(shù)據(jù)寫入請求發(fā)送給RegionServer處理键思,可以有效避免基于API寫入導(dǎo)致的一切資源問題,所有采用基于HBase Bulkload方式進(jìn)行海量離線hdfs數(shù)據(jù)導(dǎo)入HBase是可行的甫贯。
三吼鳞、HBase儲存原理
HBase存儲數(shù)據(jù)其底層使用的是HDFS來作為存儲介質(zhì),HBase的每一張表對應(yīng)的HDFS目錄上的一個(gè)文件夾叫搁,文件夾名以HBase表進(jìn)行命名(如果沒有使用命名空間赔桌,則默認(rèn)在default目錄下),在表文件夾下存放在若干個(gè)Region命名的文件夾渴逻,Region文件夾中的每個(gè)列簇也是用文件夾進(jìn)行存儲的疾党,每個(gè)列簇中存儲就是實(shí)際的數(shù)據(jù),以HFile的形式存在惨奕。路徑格式如下:
/hbase/data/default/<tbl_name>/<region_id>/<cf>/<hfile_id>
四雪位、核心流程
從HBase的視角來看,BulkLoad主要由兩個(gè)階段組成:
1 HFile生成階段
這個(gè)階段會(huì)運(yùn)行一個(gè)MapReduce任務(wù)梨撞,MapReduce的mapper需要自己實(shí)現(xiàn)雹洗,將HDFS文件中的數(shù)據(jù)讀出來組裝成一個(gè)復(fù)合KV,其中Key是rowkey卧波,Value可以是KeyValue對象时肿、Put對象甚至Delete對象;MapReduce的reducer由HBase負(fù)責(zé)港粱,通過方法HFileOutputFormat2.configureIncrementalLoad()進(jìn)行配置螃成,這個(gè)方法主要負(fù)責(zé)以下事項(xiàng)。
- 根據(jù)表信息配置一個(gè)全局有序的partitioner。
- 將partitioner文件上傳到HDFS集群并寫入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è)對應(yīng)的HFile文件淋淀。
2 HFile導(dǎo)入階段
HFile準(zhǔn)備就緒之后,就可以使用工具completebulkload將HFile加載到在線HBase集群覆醇。completebulkload工具主要負(fù)責(zé)以下工作朵纷。
- 依次檢查第一步生成的所有HFile文件,將每個(gè)文件映射到對應(yīng)的Region永脓。
- 將HFile文件移動(dòng)到對應(yīng)Region所在的HDFS文件目錄下袍辞。
- 告知Region對應(yīng)的RegionServer,加載HFile文件對外提供服務(wù)常摧。
如果在BulkLoad的中間過程中Region發(fā)生了分裂搅吁,completebulkload工具會(huì)自動(dòng)將對應(yīng)的HFile文件按照新生成的Region邊界切分成多個(gè)HFile文件,保證每個(gè)HFile都能與目標(biāo)表當(dāng)前的Region相對應(yīng)落午。但這個(gè)過程需要讀取HFile內(nèi)容谎懦,因而并不高效。需要盡量減少HFile生成階段和HFile導(dǎo)入階段的延遲溃斋,最好能夠在HFile生成之后立刻執(zhí)行HFile導(dǎo)入界拦。
打完收工!
文章內(nèi)容來自于書本以及互聯(lián)網(wǎng)資源整理梗劫,僅供學(xué)習(xí)享甸,侵權(quán)聯(lián)系刪除。