<轉(zhuǎn)載>HBase跨版本數(shù)據(jù)遷移總結(jié)

本文結(jié)合客戶案例,分享了5.5T數(shù)據(jù)遷移至騰訊云HBase使用以及數(shù)據(jù)遷移遇到的各種問(wèn)題以及解決方法。

作者:王亮

出處:騰云閣文章

------------------------------


某客戶大數(shù)據(jù)測(cè)試場(chǎng)景為:Solr類似畫像的數(shù)據(jù)查出用戶標(biāo)簽——通過(guò)這些標(biāo)簽在HBase查詢?cè)敿?xì)信息。以上測(cè)試功能以及性能。

其中HBase的數(shù)據(jù)量為500G,Solr約5T。數(shù)據(jù)均需要從對(duì)方的集群人工遷移到我們自己搭建的集群。由于Solr沒(méi)有在我們集群中集成,優(yōu)先開(kāi)始做HBase的數(shù)據(jù)遷移,以下總結(jié)了HBase使用以及數(shù)據(jù)遷移遇到的各種問(wèn)題以及解決方法。


一.遷移過(guò)程遇到問(wèn)題以及解決

客戶HBase版本:Version 0.94.15

騰訊大數(shù)據(jù)套件HBase版本:Version 1.2.1

客戶私有云系統(tǒng)版本(測(cè)試):tlinux1.2

遇到的問(wèn)題以及解決過(guò)程如下:

1.HBase運(yùn)行異?,F(xiàn)象一(date和hwclock)

HBase運(yùn)行偶發(fā)不正常,出現(xiàn)組件停止運(yùn)行的情況,看日志有說(shuō)時(shí)間的差異等信息,但date查看完全一致,想到可能是硬件時(shí)間的差異問(wèn)題,通過(guò)hwclock看,確實(shí)差異很大,通過(guò)hwclock -w調(diào)整后基本恢復(fù)。后確認(rèn)初始化腳本中只對(duì)騰訊云環(huán)境的機(jī)器做了硬件時(shí)間同步,目前已優(yōu)化。

2.HBase運(yùn)行異?,F(xiàn)象二(hostname 和/etc/resolv.conf)

HBase再次運(yùn)行不正常,出現(xiàn)組件停止運(yùn)行的情況。通過(guò)日志看如下錯(cuò)誤

ERROR [regionserver//10.0.0.106:16020] regionserver.HRegionServer: Master passed us a different hostname to use; was=10.0.0.106, but now=host-10-0-0-106.openstacklocal

通過(guò)hostname看所有機(jī)器hostname均為內(nèi)網(wǎng)IP,猜想可能是網(wǎng)絡(luò)交互的時(shí)候查詢什么表導(dǎo)致出現(xiàn)的不一致,查看dns解析信息如下

[root@10~]# hostname

10.0.0.106

; generatedby/sbin/dhclient-script

#search openstacklocal 0.0.106

#nameserver 10.0.0.2

#nameserver 10.0.0.3

有search openstacklocal的情況,猜測(cè)是虛擬機(jī)的異常行為,注釋掉resolv.conf里相關(guān)search信息,停掉nscd服務(wù)后,重啟HBase,再未出現(xiàn)這個(gè)錯(cuò)誤,HBase運(yùn)行完全正常。

3.需要支持snappy的發(fā)現(xiàn)與修復(fù)過(guò)程:

遷移表的過(guò)程中計(jì)劃使用官方的import/export工具進(jìn)行,第一步需要在目標(biāo)集群建表,通過(guò)desc信息在目標(biāo)集群建表完成后,list可看到表,通過(guò)scan查詢后,無(wú)法查詢內(nèi)容,查日志有如下錯(cuò)誤:

org.apache.hadoop.HBase.DoNotRetryIOException: Compression algorithm 'snappy' previously failed test.

通過(guò)google查詢需要HBase支持snappy壓縮算法,通過(guò)hadoop checknative發(fā)現(xiàn)集群默認(rèn)確實(shí)不支持snappy算法(雖然安裝snappyrpm)

Nativelibrary checking:

hadoop:true/data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so

zlib:true/lib64/libz.so.1

snappy:false

lz4:truerevision:99

bzip2:false

openssl:falsebuild does not support openssl.

通過(guò)手動(dòng)建表的方法用以下desc信息建表后可以list查看到表信息。scan無(wú)法查看表內(nèi)容,日志發(fā)現(xiàn)如下錯(cuò)誤

desc信息:

COLUMN FAMILIES DESCRIPTION ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

{NAME =>'A', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'1', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', METADATA => {'ENCODE_ON_DISK'=>'true'}} ? ? ? ? ? ? {NAME =>'D', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'2147483647', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', ENCODE_ON_DISK =>'true'}

錯(cuò)誤信息:

org.apache.hadoop.HBase.DoNotRetryIOException:java.lang.RuntimeException:nativesnappylibrarynotavailable:thisversionoflibhadoopwasbuiltwithoutsnappysupport

在HBase-site.xml增加屬性HBase.regionserver.codecs value為snappy即可,在測(cè)試集群通過(guò)該方法,HBase啟動(dòng)失敗

后確認(rèn)tlinux1.2的hadoop集群上支持snappy的方法:即需要在特定系統(tǒng)編譯hadoop相關(guān)本地庫(kù)(native庫(kù))替換hadoop當(dāng)前的native庫(kù),然后HBase的啟動(dòng)環(huán)境腳本增加hadoop主目錄即可

目前tlinux1.2下的hadoop的nativesnappy庫(kù)有現(xiàn)網(wǎng)使用,同時(shí)需要保證這個(gè)hadoop的庫(kù)可以引用到libjvm.so(jre的一個(gè)so文件)直接替換hadoop/lib下的native目錄,保證已經(jīng)安裝snappy的rpm包,在HBase-env.sh里添加HADOOP_HOME={Hadoop安裝主目錄}。再hadoop checknative后發(fā)現(xiàn)已支持snappy。逐步全量重啟HBase。

Nativelibrary checking:

hadoop:true/data/tbds-base/usr/hdp/2.2.0.0-2041/hadoop/lib/native/libhadoop.so

zlib:true/lib64/libz.so.1

snappy:true/usr/lib64/libsnappy.so.1

lz4:truerevision:99

bzip2:false

openssl:falsebuild does not support openssl.

4.HBase0.9.4集群數(shù)據(jù)表到HBase1.2.1集群數(shù)據(jù)表的遷移方法

暴力遷移參考http://my.oschina.net/CainGao/blog/616502

1)找到源集群源表在hdfs上的目錄位置,直接將該目錄移動(dòng)到目標(biāo)集群HBase的表在目標(biāo)集群hdfs上的表根目錄下

2)暴力遷移時(shí)tableinfo信息是一個(gè)文件即.tableinfo.00000001。0.9.4的版本這個(gè)文件位于HBase表在hdfs上表目錄的根目錄下,而1.2.1的這個(gè)文件位于HBase表在hdfs上表目錄的根目錄下的./tabledesc目錄下,需要手動(dòng)創(chuàng)建這個(gè)目錄并調(diào)整這個(gè)文件的位置

3) 修改復(fù)制過(guò)來(lái)的表目錄文件的屬主信息

4) 重啟HBase的所有組件

5) 此時(shí)登錄HBaseshell已經(jīng)可以通過(guò)list查看到遷移過(guò)來(lái)的表,但scan等操作會(huì)失敗

6) 通過(guò)HBase hbck -fixMeta修復(fù)meta信息;HBase hbck -fixAssignments 修復(fù)分區(qū)。這兩個(gè)步驟的操作過(guò)程中注意觀察日志是否有異常,實(shí)踐中首次嘗試此方法有大量錯(cuò)誤,發(fā)現(xiàn)錯(cuò)誤內(nèi)容為snappy相關(guān),支持snappy后,查看表信息,表內(nèi)容正常,隨機(jī)選取表內(nèi)容對(duì)比也正常,可認(rèn)為此種方法遷移成功。

7) 通過(guò)import/export的方法遷移時(shí)需要在目標(biāo)集群手動(dòng)創(chuàng)建目標(biāo)表,查看源集群的表結(jié)構(gòu)如下:

import/export參考地址

COLUMN FAMILIES DESCRIPTION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

{NAME =>'A', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'1', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', METADATA => {'ENCODE_ON_DISK'=>'true'}} ? ? ? ? ? ? {NAME =>'D', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'2147483647', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', ENCODE_ON_DISK =>'true'}

通過(guò)該desc信息創(chuàng)建新表時(shí)出現(xiàn)如下錯(cuò)誤:

Unknown argument ignored for column family A: ENCODE_ON_DISK

手動(dòng)測(cè)試只要加這個(gè)參數(shù)ENCODE_ON_DISK去建表一定會(huì)出現(xiàn)這個(gè)錯(cuò)誤,建表會(huì)成功,但表信息里沒(méi)有這個(gè)字段了。經(jīng)過(guò)look查代碼發(fā)現(xiàn)這個(gè)字段在新版本已經(jīng)廢棄,但客戶的老集群是版本需要這個(gè)字段,通過(guò)import的方法無(wú)法正常寫入、通過(guò)步驟6)的暴力遷移成功后(暴力遷移成功兼容了這個(gè)字段),查看表的desc信息如下:

COLUMN FAMILIES DESCRIPTION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

{NAME =>'A', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'1', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', METADATA => {'ENCODE_ON_DISK'=>'true'}} ? ? ? ? ? ? {NAME =>'D', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'2147483647', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', METADATA => {'ENCODE_ON_DISK'=>'true'}}

老集群表結(jié)構(gòu)

COLUMN FAMILIES DESCRIPTION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

{NAME =>'A', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'1', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', METADATA => {'ENCODE_ON_DISK'=>'true'}} ? ? ? ? ? ? {NAME =>'D', DATA_BLOCK_ENCODING =>'NONE', BLOOMFILTER =>'NONE', REPLICATION_SCOPE =>'0', VERSIONS =>'2147483647', COMPRESSION =>'SNAPPY', MIN_VERSIONS =>'0', TTL =>'FOREVER', KEEP_DELETED_CELLS =>'false', BLOCKSIZE =>'65536', IN_MEMORY =>'false', BLOCKCACHE =>'true', ENCODE_ON_DISK =>'true'}

可以看到關(guān)于ENCODE_ON_DISK字段在新老版本的定義方法有差異,故我們測(cè)試在新集群使用上面的desc信息建表后,再通過(guò)import方法導(dǎo)入到HBase。結(jié)果依然沒(méi)有數(shù)據(jù)寫入,可以斷定這個(gè)參數(shù)ENCODE_ON_DISK在HBase1.2.1中完全廢棄,新版本采用了一個(gè)整字段來(lái)包裹這個(gè)信息。當(dāng)老集群有參數(shù)時(shí),官方import/export方法在HBase0.9.8到HBase1.2.1直接遷移暫時(shí)不可用。

二.后續(xù)

在HBase0.9.8集群上建表設(shè)置ENCODE_ON_DISK=false(默認(rèn)為true),在HBase1.2.1上不帶ENCODE_ON_DISK建表,使用export/import方法遷移測(cè)試研究其他HBase數(shù)據(jù)跨集群(版本差異,網(wǎng)絡(luò)不通)遷移方法。


------------------------------------------------------------------------------------------

獲取更多云計(jì)算技術(shù)干貨,可請(qǐng)前往?騰訊云技術(shù)社區(qū)

微信公眾號(hào):騰訊云技術(shù)社區(qū)( QcloudCommunity)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容