ImportTsv-HBase数据导入工具
一、概述
HBase官方提供了基于Mapreduce的批量数据导入工具:Bulk load和ImportTsv。关于Bulk load大家可以看下我另一篇博文。
通常HBase用户会使用HBase API导数,但是如果一次性导入大批量数据,可能占用大量Regionserver资源,影响存储在该Regionserver上其他表的查询,本文将会从源码上解析ImportTsv数据导入工具,探究如何高效导入数据到HBase。
二、ImportTsv介绍
ImportTsv是Hbase提供的一个命令行工具,可以将存储在HDFS上的自定义分隔符(默认\t)的数据文件,通过一条命令方便的导入到HBase表中,对于大数据量导入非常实用,其中包含两种方式将数据导入到HBase表中:
第一种是使用TableOutputformat在reduce中插入数据;
第二种是先生成HFile格式的文件,再执行一个叫做CompleteBulkLoad的命令,将文件move到HBase表空间目录下,同时提供给client查询。
三、源码解析
本文基于CDH5 HBase0.98.1,ImportTsv的入口类是org.apache.hadoop.hbase.mapreduce.ImportTsv
- String hfileOutPath = conf.get(BULK_OUTPUT_CONF_KEY);
- String columns[] = conf.getStrings(COLUMNS_CONF_KEY);
- if (hfileOutPath != null) {
- if (!admin.tableExists(tableName)) {
- LOG.warn(format("Table '%s' does not exist.", tableName));
- // TODO: this is backwards. Instead of depending on the existence of a table,
- // create a sane splits file for HFileOutputFormat based on data sampling.
- createTable(admin, tableName, columns);
- }
- HTable table = new HTable(conf, tableName);
- job.setReducerClass(PutSortReducer.class);
- Path outputDir = new Path(hfileOutPath);
- FileOutputFormat.setOutputPath(job, outputDir);
- job.setMapOutputKeyClass(ImmutableBytesWritable.class);
- if (mapperClass.equals(TsvImporterTextMapper.class)) {
- job.setMapOutputValueClass(Text.class);
- job.setReducerClass(TextSortReducer.class);
- } else {
- job.setMapOutputValueClass(Put.class);
- job.setCombinerClass(PutCombiner.class);
- }
- HFileOutputFormat.configureIncrementalLoad(job, table);
- } else {
- if (mapperClass.equals(TsvImporterTextMapper.class)) {
- usage(TsvImporterTextMapper.class.toString()
- + " should not be used for non bulkloading case. use "
- + TsvImporterMapper.class.toString()
- + " or custom mapper whose value type is Put.");
- System.exit(-1);
- }
- // No reducers. Just write straight to table. Call initTableReducerJob
- // to set up the TableOutputFormat.
- TableMapReduceUtil.initTableReducerJob(tableName, null, job);
- job.setNumReduceTasks(0);
- }
从ImportTsv.createSubmittableJob方法中判断参数BULK_OUTPUT_CONF_KEY开始,这步直接影响ImportTsv的Mapreduce作业最终以哪种方式入HBase库
如果不为空并且用户没有自定义Mapper实现类(参数importtsv.mapper.class)时,则使用PutSortReducer,其中会对Put排序,如果每行记录有很多column,则会占用Reducer大量的内存资源进行排序。
- Configuration conf = job.getConfiguration();
- HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));
- job.setOutputFormatClass(TableOutputFormat.class);
如果为空,调用TableMapReduceUtil.initTableReducerJob初始化TableOutputformat的Reducer输出,此方式不需要使用Reducer,因为直接在mapper的Outputformat中会批量的调用Put
API将数据提交到Regionserver上(相当于并行的执行HBase Put API)
四、实战
1、使用TableOutputformat的Put API上传数据,非bulk-loading
- $ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c <tablename> <hdfs-inputdir>
2、使用bulk-loading生成StoreFiles(HFile)
step1、生成Hfile
- $ bin/hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir <tablename> <hdfs-data-inputdir>
step2、完成导入
- $ bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename>
五、总结
在使用ImportTsv时,一定要注意参数importtsv.bulk.output的配置,通常来说使用Bulk
output的方式对Regionserver来说更加友好一些,这种方式加载数据几乎不占用Regionserver的计算资源,因为只是在HDFS上移动了HFile文件,然后通知HMaster将该Regionserver的一个或多个region上线。
----------------------------------------------
1.hbase到hdfs
hbase org.apache.hadoop.hbase.mapreduce.Export "ns:core_tran_info" /hbase2hdfs
注:hdfs文件系统路径/hbase2hdfs不要存在,不然报错
2.hdfs到hbase
hbase org.apache.hadoop.hbase.mapreduce.Driver import 'hdfs2hbase' /hbase2hdfs/*
注:hdfs2hbase为hbase中已存在的表,且表hdfs2hbase的column family要和hdfs文件路下导出的hbase表的列族相同。
命令说明importtsv
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=hdfs://storefile-outputdir <tablename> <hdfs-data-inputdir>
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles <hdfs://storefileoutput> <tablename>
导入tsv文件
第一种:
step1:根据hdfs中的文件生成Hfile
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,cf:a,cf:b -Dimporttsv.bulk.output=hdfs:///storefile tsvtab /hdfs2hbase/hdfs2hbase.tsv
注:
(1)tsv文件不能有文件头;
(2)importtsv.columns=HBASE_ROW_KEY必须要指定列,且必须要有HBASE_ROW_KEY
(3)Dimporttsv.bulk.output=hdfs:///storefile,hdfs上的storefile目录开始不能存在
step2:完成导入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs:///storefile tsvtab
第二种:
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` $HADOOP_HOME/bin/yarn jar $HBASE_HOME/lib/hbase-server-1.3.1.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,baseinfo:INTERNAL_KEY,baseinfo:TRAN_DATE,baseinfo:SOURCE_TYPE,baseinfo:TERMINAL_ID,baseinfo:BRANCH,baseinfo:OFFICER_ID,baseinfo:TRAN_TYPE,baseinfo:EFFECT_DATE,baseinfo:POST_DATE,baseinfo:REVERSAL_TRAN_TYPE,baseinfo:REVERSAL_DATE,baseinfo:STMT_DATE,baseinfo:TRAN_AMT,baseinfo:REFERENCE,baseinfo:PREVIOUS_BAL_AMT,baseinfo:ACTUAL_BAL_AMT,baseinfo:TFR_INTERNAL_KEY,baseinfo:TFR_SEQ_NO, dshuangfu:teacher1 /user/hac/input/2-1/dshuangfu_hbase_zhongyuan111.tsv
导入csv文件
step1:根据hdfs中的文件生成Hfile
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,cf:a -Dimporttsv.bulk.output=hdfs:///storefile/csvtab csvtab /hdfs2hbase/hdfs2hbase.csv
注:
(1)tsv文件不能有文件头;
(2)importtsv.columns=HBASE_ROW_KEY必须要指定列,且必须要有HBASE_ROW_KEY
(3)Dimporttsv.bulk.output=hdfs:///storefile,hdfs上的storefile目录开始不能存在
(4)
step2:完成导入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs:///storefile/csvtab csvtab
ImportTsv-HBase数据导入工具的更多相关文章
- Redis数据导入工具优化过程总结
Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...
- CYS-Sqlite数据导入工具
界面: 曹永思 下载地址:asp.net 2.0版 Sqlite数据导入工具.zip 欢迎转载,转载请注明出处,希望帮到更多人.
- hbase数据导入
hbase数据导入: 参考http://blog.csdn.net/hua840812/article/details/7414875,在把代码copy下来后,发现运行总是报错: java.io.IO ...
- HBase数据导入导出工具
hbase中自带一些数据导入.导出工具 1. ImportTsv直接导入 1.1 hbase中建表 create 'testtable4','cf1','cf2' 1.2 准备数据文件data.txt ...
- Bulk Load-HBase数据导入最佳实践
一.概述 HBase本身提供了非常多种数据导入的方式,通常有两种经常使用方式: 1.使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase 2 ...
- graphql 数据导入工具
graphql 是比 比较方便的工具,但是数据导入也是一个比较重要的工具类似prisma 包含一个seed 的功能,类似docker我们使用mysql 数据库的initdb.d,但是那个基本上就 是添 ...
- Hbase数据导入导出
平时用于从生产环境hbase到导出数据到测试环境. 导入数据: import java.io.BufferedReader; import java.io.File; import java.io.F ...
- oracle批量数据导入工具 sqlldr
sqlldr工具参数: [oracle@server ~]$ sqlldr SQL*Loader: Release - Production on Wed Nov :: Copyright (c) , ...
- Oracle SQL*Loader 数据导入工具
SQL*Loader是一个向Orale大量倒数据的工具,可以从界定文件中导入数据如用 , 界定的,可以从定宽的文件导入数据,
随机推荐
- 2018焦作网络赛Mathematical Curse
题意:开始有个数k,有个数组和几个运算符.遍历数组的过程中花费一个运算符和数组当前元素运算.运算符必须按顺序花费,并且最后要花费完.问得到最大结果. 用maxv[x][y]记录到第x个元素,用完了第y ...
- 【转】Vue.js特点
作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...
- Educational Codeforces Round 47 (Rated for Div. 2)G. Allowed Letters 网络流
题意:给你一个字符串,和每个位置可能的字符(没有就可以放任意字符)要求一个排列使得每个位置的字符在可能的字符中,求字典序最小的那个 题解:很容易判断有没有解,建6个点表示从a-f,和源点连边,容量为原 ...
- 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法
1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...
- HDU1789时间贪心
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- pytorch人脸识别——自己制作数据集
这是一篇面向新手的博文:因为本人也是新手,记录一下自己在做这个项目遇到的大大小小的坑. 按照下面的例子写就好了 import torch as t from torch.utils import da ...
- python 小练习 9
还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 .............. 先 ...
- EBS R12使用接口表往已存在的供应商地址下创建新的地点
在供应商 "测试供应商A" 下已经有了两个地址,分别为 "地址A","地址B",现在由于某些原因,需要在地址A下面创建新的地点. 由于业务需 ...
- springmvc基础流程
转载:http://blog.csdn.net/zuoluoboy/article/details/19766131 注意:springmvc多个拦截器执行流程:每个拦截器的方法preHandler顺 ...
- 【css】弹性盒模型
弹性盒模型flexBox 弹性盒模型是c3的一种新的布局模式 它是指一种当页面需要适应不同屏幕大小以及设备类型时,确保元素有恰当行为的布局方式. 引入弹性盒模型布局的目的是提供一种更有效的方法来对一个 ...