某客戶大資料測試場景為:Solr類似畫像的資料查出使用者标簽——通過這些标簽在HBase查詢詳細資訊。以上測試功能以及性能。
其中HBase的資料量為500G,Solr約5T。資料均需要從對方的叢集人工遷移到我們自己搭建的叢集。由于Solr沒有在我們叢集中內建,優先開始做HBase的資料遷移,以下總結了HBase使用以及資料遷移遇到的各種問題以及解決方法。
客戶HBase版本:Version 0.94.15
騰訊大資料套件HBase版本:Version 1.2.1
客戶私有雲系統版本(測試):tlinux1.2
遇到的問題以及解決過程如下:
HBase運作偶發不正常,出現元件停止運作的情況,看日志有說時間的差異等資訊,但date檢視完全一緻,想到可能是硬體時間的差異問題,通過hwclock看,确實差異很大,通過hwclock -w調整後基本恢複。後确認初始化腳本中隻對騰訊雲環境的機器做了硬體時間同步,目前已優化。
HBase再次運作不正常,出現元件停止運作的情況。通過日志看如下錯誤
<code>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</code>
通過<code>hostname</code>看所有機器<code>hostname</code>均為内網IP,猜想可能是網絡互動的時候查詢什麼表導緻出現的不一緻,檢視dns解析資訊如下
有<code>search openstacklocal</code>的情況,猜測是虛拟機的異常行為,注釋掉<code>resolv.conf</code>裡相關search資訊,停掉nscd服務後,重新開機HBase,再未出現這個錯誤,HBase運作完全正常。
遷移表的過程中計劃使用官方的import/export工具進行,第一步需要在目标叢集建表,通過desc資訊在目标叢集建表完成後,list可看到表,通過scan查詢後,無法查詢内容,查日志有如下錯誤:
<code>org.apache.hadoop.HBase.DoNotRetryIOException: Compression algorithm 'snappy' previously failed test.</code>
通過google查詢需要HBase支援snappy壓縮算法,通過<code>hadoop checknative</code>發現叢集預設确實不支援snappy算法(雖然安裝<code>snappyrpm</code>
通過手動建表的方法用以下desc資訊建表後可以list檢視到表資訊。scan無法檢視表内容,日志發現如下錯誤
desc資訊:
錯誤資訊:
在HBase-site.xml增加屬性HBase.regionserver.codecs value為snappy即可,在測試叢集通過該方法,HBase啟動失敗
後确認tlinux1.2的hadoop叢集上支援snappy的方法:即需要在特定系統編譯hadoop相關本地庫(native庫)替換hadoop目前的native庫,然後HBase的啟動環境腳本增加hadoop主目錄即可
目前tlinux1.2下的hadoop的<code>nativesnappy</code>庫有現網使用,同時需要保證這個hadoop的庫可以引用到libjvm.so(jre的一個so檔案)直接替換<code>hadoop/lib</code>下的native目錄,保證已經安裝snappy的rpm包,在<code>HBase-env.sh</code>裡添加<code>HADOOP_HOME={Hadoop安裝主目錄}</code>。再<code>hadoop checknative</code>後發現已支援snappy。逐漸全量重新開機HBase。
暴力遷移參考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) 通過<code>import/export</code>的方法遷移時需要在目标叢集手動建立目标表,檢視源叢集的表結構如下:
import/export參考位址
通過該desc資訊建立新表時出現如下錯誤:
<code>Unknown argument ignored for column family A: ENCODE_ON_DISK</code>
手動測試隻要加這個參數ENCODE_ON_DISK去建表一定會出現這個錯誤,建表會成功,但表資訊裡沒有這個字段了。經過look查代碼發現這個字段在新版本已經廢棄,但客戶的老叢集是版本需要這個字段,通過import的方法無法正常寫入、通過步驟6)的暴力遷移成功後(暴力遷移成功相容了這個字段),檢視表的desc資訊如下:
老叢集表結構
可以看到關于<code>ENCODE_ON_DISK</code>字段在新老版本的定義方法有差異,故我們測試在新叢集使用上面的desc資訊建表後,再通過import方法導入到HBase。結果依然沒有資料寫入,可以斷定這個參數<code>ENCODE_ON_DISK</code>在HBase1.2.1中完全廢棄,新版本采用了一個整字段來包裹這個資訊。當老叢集有參數時,官方import/export方法在HBase0.9.8到HBase1.2.1直接遷移暫時不可用。
在HBase0.9.8叢集上建表設定<code>ENCODE_ON_DISK=false</code>(預設為true),在HBase1.2.1上不帶ENCODE_ON_DISK建表,使用export/import方法遷移測試研究其他HBase資料跨叢集(版本差異,網絡不通)遷移方法。