某客戶大數據測試場景為:Solr類似畫像的數據查出用戶標簽——通過這些標簽在HBase查詢詳細信息。以上測試功能以及性能。
其中HBase的數據量為500G,Solr約5T。數據均需要從對方的集群人工遷移到我們自己搭建的集群。由於Solr沒有在我們集群中集成,優先開始做HBase的數據遷移,以下總結了HBase使用以及數據遷移遇到的各種問題以及解決方法。
一.遷移過程遇到問題以及解決
客戶HBase版本:Version 0.94.15
騰訊大數據套件HBase版本:Version 1.2.1
客戶私有雲系統版本(測試):tlinux1.2
遇到的問題以及解決過程如下:
1.HBase運行異常現象一(date和hwclock)
HBase運行偶發不正常,出現組件停止運行的情況,看日志有說時間的差異等信息,但date查看完全一致,想到可能是硬件時間的差異問題,通過hwclock看,確實差異很大,通過hwclock -w調整后基本恢復。后確認初始化腳本中只對騰訊雲環境的機器做了硬件時間同步,目前已優化。
2.HBase運行異常現象二(hostname 和/etc/resolv.conf)
HBase再次運行不正常,出現組件停止運行的情況。通過日志看如下錯誤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
通過hostname
看所有機器hostname
均為內網IP,猜想可能是網絡交互的時候查詢什么表導致出現的不一致,查看dns解析信息如下
[root@10 ~]# hostname 10.0.0.106 ; generated by /sbin/dhclient-script #search openstacklocal 0.0.106 #nameserver 10.0.0.2 #nameserver 10.0.0.3
有search openstacklocal
的情況,猜測是虛擬機的異常行為,注釋掉resolv.conf
里相關search信息,停掉nscd服務后,重啟HBase,再未出現這個錯誤,HBase運行完全正常。
3.需要支持snappy的發現與修復過程:
-
遷移表的過程中計划使用官方的import/export工具進行,第一步需要在目標集群建表,通過desc信息在目標集群建表完成后,list可看到表,通過scan查詢后,無法查詢內容,查日志有如下錯誤:
org.apache.hadoop.HBase.DoNotRetryIOException: Compression algorithm 'snappy' previously failed test.
通過google查詢需要HBase支持snappy壓縮算法,通過hadoop checknative
發現集群默認確實不支持snappy算法(雖然安裝snappyrpm
)Native library 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: true revision:99 bzip2: false openssl: false build does not support openssl.
-
通過手動建表的方法用以下desc信息建表后可以list查看到表信息。scan無法查看表內容,日志發現如下錯誤
desc信息:COLUMN FAMILIES DESCRIPTION {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR EVER', 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', TT L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}
錯誤信息:
org.apache.hadoop.HBase.DoNotRetryIOException: java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support
-
在HBase-site.xml增加屬性HBase.regionserver.codecs value為snappy即可,在測試集群通過該方法,HBase啟動失敗
-
后確認tlinux1.2的hadoop集群上支持snappy的方法:即需要在特定系統編譯hadoop相關本地庫(native庫)替換hadoop當前的native庫,然后HBase的啟動環境腳本增加hadoop主目錄即可
-
目前tlinux1.2下的hadoop的
nativesnappy
庫有現網使用,同時需要保證這個hadoop的庫可以引用到libjvm.so(jre的一個so文件)直接替換hadoop/lib
下的native目錄,保證已經安裝snappy的rpm包,在HBase-env.sh
里添加HADOOP_HOME={Hadoop安裝主目錄}
。再hadoop checknative
后發現已支持snappy。逐步全量重啟HBase。Native library 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: true revision:99 bzip2: false openssl: false build does not support openssl.
4.HBase0.9.4集群數據表到HBase1.2.1集群數據表的遷移方法
暴力遷移參考http://my.oschina.net/CainGao/blog/616502
1)找到源集群源表在hdfs上的目錄位置,直接將該目錄移動到目標集群HBase的表在目標集群hdfs上的表根目錄下
2)暴力遷移時tableinfo信息是一個文件即.tableinfo.00000001。0.9.4的版本這個文件位於HBase表在hdfs上表目錄的根目錄下,而1.2.1的這個文件位於HBase表在hdfs上表目錄的根目錄下的./tabledesc目錄下,需要手動創建這個目錄並調整這個文件的位置
3) 修改復制過來的表目錄文件的屬主信息
4) 重啟HBase的所有組件
5) 此時登錄HBaseshell已經可以通過list查看到遷移過來的表,但scan等操作會失敗
6) 通過HBase hbck -fixMeta修復meta信息;HBase hbck -fixAssignments 修復分區。這兩個步驟的操作過程中注意觀察日志是否有異常,實踐中首次嘗試此方法有大量錯誤,發現錯誤內容為snappy相關,支持snappy后,查看表信息,表內容正常,隨機選取表內容對比也正常,可認為此種方法遷移成功。
7) 通過import/export
的方法遷移時需要在目標集群手動創建目標表,查看源集群的表結構如下:
import/export參考地址
COLUMN FAMILIES DESCRIPTION {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR EVER', 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', TT L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}
通過該desc信息創建新表時出現如下錯誤:Unknown argument ignored for column family A: ENCODE_ON_DISK
手動測試只要加這個參數ENCODE_ON_DISK去建表一定會出現這個錯誤,建表會成功,但表信息里沒有這個字段了。經過look查代碼發現這個字段在新版本已經廢棄,但客戶的老集群是版本需要這個字段,通過import的方法無法正常寫入、通過步驟6)的暴力遷移成功后(暴力遷移成功兼容了這個字段),查看表的desc信息如下:
COLUMN FAMILIES DESCRIPTION {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR EVER', 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', TT L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', METADATA => {'ENCODE_ON_DISK' => 'true'}}
老集群表結構
COLUMN FAMILIES DESCRIPTION {NAME => 'A', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOR EVER', 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', TT L => 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true', ENCODE_ON_DISK => 'true'}
可以看到關於ENCODE_ON_DISK
字段在新老版本的定義方法有差異,故我們測試在新集群使用上面的desc信息建表后,再通過import方法導入到HBase。結果依然沒有數據寫入,可以斷定這個參數ENCODE_ON_DISK
在HBase1.2.1中完全廢棄,新版本采用了一個整字段來包裹這個信息。當老集群有參數時,官方import/export方法在HBase0.9.8到HBase1.2.1直接遷移暫時不可用。
二.后續
在HBase0.9.8集群上建表設置ENCODE_ON_DISK=false
(默認為true),在HBase1.2.1上不帶ENCODE_ON_DISK建表,使用export/import方法遷移測試研究其他HBase數據跨集群(版本差異,網絡不通)遷移方法。
相關推薦
Hbase寫入hdfs源碼分析
版權說明:本人作者張浩,轉載請注明文章出處哦。
獲取更多雲計算技術干貨,可請前往騰訊雲技術社區,當然我們也會在博客園持續同步更新~
微信公眾號:騰訊雲技術社區( QcloudCommunity)