1. 程式人生 > >HBase ImportTsv匯入資料

HBase ImportTsv匯入資料

一、HBase介紹

HBase是Apache Hadoop中的一個子專案,依託於Hadoop的HDFS作為最基本儲存基礎單元,通過使用hadoop的命令就可以看到HBase資料儲存資料夾的目錄結構,還可以通過Map/Reduce對HBase進行操作。HBase是一個適合於非結構化資料儲存的資料庫.所謂非結構化資料儲存就是說HBase是基於列的而不是基於行的模式。HBase是介於Map Entry(key & value)和DB Row之間的一種資料儲存方式。你很可能需要儲存多個屬性的資料結構,但沒有傳統資料庫表中那麼多的關聯關係,這就是所謂的鬆散資料。簡單來說,你在HBase中的表建立的可以看做是一張很大的表,而這個表的屬性可以根據需求去動態增加,在HBase中沒有表與表之間關聯查詢。你只需要告訴你的資料儲存到HBase的那個column family就可以了,不需要指定具體型別,需要注意的是HBase中不包含事務的功能。

二、ImportTsv介紹

將資料匯入HBase,通常HBase使用者會使用HBase API進行資料匯入,但是如果一次性匯入大批量資料,可能會佔用大量Regionserver資源,影響儲存在該Regionserver上其他表的操作,或者效能低下,那麼怎麼才能高效地將資料匯入HBase呢?
ImportTsv是HBase官方提供了基於mapreduce進行批量資料匯入的工具,ImportTsv可以將HDFS上的TSV格式(預設製表符分隔\t,或者自定義分隔符的其他格式資料檔案也可,逗號‘,’分隔的txt親測可以)的資料檔案通過命令簡單方便地匯入到HBase中,對於大資料量的匯入非常實用。

三、資料匯入

ImportTsv進行資料匯入有兩種方式:
1、直接匯入(使用TableOutputFormat在map中插入)
使用方法:

$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>

其中:
-Dimporttsv.columns即匯入的列,例如:-Dimporttsv.columns=cf:col1,cf:col2…
hdfs-inputdir即資料檔案在HDFS的路徑,例如:/hbase_tsv_input
如果使用的不是製表符\t分隔,請指定引數:’-Dimporttsv.separator=,’
命令舉例:

 $ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=cf:col1,cf:col2 test /hbase_tsv_input

至此,第一種方式匯入資料成功,在控制檯會看到執行一些map任務,執行完成之後資料匯入完成。

總結:這種方式,使用簡單,一條命令搞定,但是在匯入大批量資料的時候有可能會存在問題,尤其是column比較多的寬表匯入的時候,會出現RegionTooBusyException,導致資料丟失,因此建議在資料量不是特別大並且column不是特別多的情況下使用。

2、 使用bulk-load方式(通過mapreduce先生成HFile格式的檔案,再執行CompleteBulkLoad命令將檔案move到HBase相應目錄。)
使用方法:
第一步:

$ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir <tablename> <hdfs-data-inputdir>

第一步中,在1的基礎上添加了-Dimporttsv.bulk.output引數來指定output目錄,即HFile的輸出目錄,此目錄在執行前不能存在,如果存在請刪除。

第二步:

$ bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename>

第二步就是講HFile move到HBase相應的目錄。第一個引數就是第一步中的output目錄,tableName和1中相同,就是表名。

總結:bulk-load匯入方式完成,等待執行結束即可,第一步可能會花費很長時間(62column1000萬資料大約花費20分鐘),第二步瞬間完成。這種方式對Regionserver更加友好一些,載入資料幾乎不佔用Regionserver的計算資源,因為只是在HDFS上生成HFile,移動HFile檔案,然後通知HMaster將該Regionserver的一個或多個region上線,大資料量匯入推薦使用此方式。

四、碰到的問題

在使用的過程中,可能會出現如下異常:

Encountered unrecoverable error from region server, additional details: row ' ' on table 'test'

出現上面異常的原因是執行命令的使用者許可權不夠:
兩種方案:
1.給output目錄賦予許可權

hadoop fs -chmod -R 777 $output

2.切換成有許可權操做的使用者執行。