HBase ImportTSV
TSV文件与CSV文件的区别
TSV是Tab-separatedvalues的缩写,即制表符分隔值。
相对来说CSV,Comma-separatedvalues(逗号分隔值)更常见一些。
ImportTSV功能描述:
ImportTSV可以将tsv(也可以是csv,每行数据中各个字段使用分隔符分割)格式文本数据,加载到HBase表中。
- 采用Put方式加载导入
- 采用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的缺点很明显:
- ROWKEY不能是组合主键,只能是某一个字段
- 当表中列很多时,书写-Dimporttsv.columns值时很麻烦,容易出错