HBase ImportTSV

TSV文件與CSV文件的區別

TSV是Tab-separatedvalues的縮寫,即製表符分隔值。
相對來說CSV,Comma-separatedvalues(逗號分隔值)更常見一些。

ImportTSV功能描述:

ImportTSV可以將tsv(也可以是csv,每行數據中各個字段使用分隔符分割)格式文本數據,加載到HBase表中。

  1. 採用Put方式加載導入
  2. 採用BulkLoad方式批量加載導入

ImportTSV這個功能藏在HBase自帶的工具類jar包裏。

使用如下命令,查看HBase官方自帶工具類使用說明:

HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf 
${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar

(也可以直接用yarn運行hbase目錄下的lib目錄下的hbase-server的jar包,然後後面跟上importtsv即可。)

執行上述命令提示如下信息:

An example program must be given as the first argument.
Valid program names are:
  CellCounter: Count cells in HBase table.
  WALPlayer: Replay WAL files.
  completebulkload: Complete a bulk data load.
  copytable: Export a table from local cluster to peer cluster.
  export: Write table data to HDFS.
  exportsnapshot: Export the specific snapshot to a given FileSystem.
  import: Import data written by Export.
  importtsv: Import data in TSV format.
  rowcounter: Count rows in HBase table.
  verifyrep: Compare the data from tables in two different clusters. 

翻譯過來就是

必須給出一個示例程序作爲第一個參數。
有效的程序名是:
        CellCounter:對HBase表中的單元格進行計數。
        WALPlayer:重放WAL文件。
        completebulkload:完成批量數據加載。
        copytable:將表從本地羣集導出到對等羣集。
        export:將表數據寫入HDFS。
        exportsnapshot:將特定快照導出到給定的文件系統。
        import:導入通過導出寫入的數據。
        importtsv:導入TSV格式的數據。
        rowcounter:計算HBase表中的行數。
        verifyrep:比較兩個不同集羣中表中的數據。

其中importtsv就是將文本文件(比如CSV、TSV等格式)數據導入HBase表工具類,使用說明如下:

Usage: importtsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>
//用法:importtsv -Dimporttsv.columns=a,b,c 表名 輸入路徑

The column names of the TSV data must be specified using the -Dimporttsv.columns
option. This option takes the form of comma-separated column names, where each
column name is either a simple column family, or a columnfamily:qualifier. 
The special column name HBASE_ROW_KEY is used to designate that this column 
should be used as the row key for each imported record. 



To instead generate HFiles of data to prepare for a bulk data load, pass the option:
-Dimporttsv.bulk.output=/path/for/output

//如果想要產生爲bulkload做準備的HFiles文件,就加入這個選項(注意下面第二個例子就使用到了):
//-Dimporttsv.bulk.output=/path/for/output

//指定分隔符
'-Dimporttsv.separator=|' - eg separate on pipes instead of tabs

For performance consider the following options:
  -Dmapreduce.map.speculative=false
  -Dmapreduce.reduce.speculative=false
  
//如果想提升性能,可以將上面這倆參數設爲false

下面舉倆使用的例子

1,直接導入Put方式

HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf 
${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
importtsv \
-Dimporttsv.columns=HBASE_ROW_KEY,detail:log_id,detail:remote_ip,detail:site_global_ticket,detail:site_global_session,detail:global_user_id,detail:cookie_text,detail:user_agent,detail:ref_url,detail:loc_url,detail:log_time \
tbl_logs2 \
/user/hive/warehouse/tags_dat2.db/tbl_logs

上述命令本質上運行一個MapReduce應用程序,將文本文件中每行數據轉換封裝到Put對象,然後插入到HBase表中

回顧一下:
	採用Put方式向HBase表中插入數據流程:
		Put
			-> WAL 預寫日誌
			-> MemStore(內存) ,當達到一定大寫Spill到磁盤上:StoreFile(HFile)
數據寫兩遍是不是特別慢!!!更快的方法呢?不經過日誌和內存,直接生成HFile文件
	思考:
		對海量數據插入,能否將數據直接保存爲HFile文件,然後加載到HBase表中

2,轉換爲HFile文件,再加載至表

# 生成HFILES文件
HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf 
${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
importtsv \
-Dimporttsv.bulk.output=hdfs://bd001:8020/datas/output_hfile/tbl_tag_logs \
-Dimporttsv.columns=HBASE_ROW_KEY,detail:log_id,detail:remote_ip,detail:site_global_ticket,detail:site_global_session,detail:global_user_id,detail:cookie_text,detail:user_agent,detail:ref_url,detail:loc_url,detail:log_time \
tbl_logs2 \
/user/hive/warehouse/tags_dat2.db/tbl_logs

# 將HFILE文件加載到表中
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf ${HADOOP_HOME}/bin/yarn jar \
${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
completebulkload \
hdfs://bd001:8020/datas/output_hfile/tbl_tag_logs \
tbl_logs2

importtsv的缺點很明顯:

  1. ROWKEY不能是組合主鍵,只能是某一個字段
  2. 當表中列很多時,書寫-Dimporttsv.columns值時很麻煩,容易出錯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章