1.简介

  将数据插入HBase表中的方法很多,我们可以通过TableOutputFormat以Mapreduce on HBase的方式将数据插入,也可以单纯的使用客户端API将数据插入。但是以上方法效率并不高。

而使用BulkLoad特性能够利用MR计算框架将源数据直接生成内部的hfile格式,然后可以在不重启HBase集群的场景下数据load到对应表中。

  BulkLoad方法能够将数据快速的load到HBase中,打一个“生动”的比方:

使用API就好比将饭一口一口喂给HBase,而使用BulkLoad就相当于切开HBase的肚子直接将食物放到胃中。(重口味的比方)

2.限制

  1. Bulkload方式由于并不是通过API来插入数据而是直接生成HFile文件所以并不会记录WAL日志。如果集群直接是通过Replication机制来备份的话(Replication机制是通过读取WAL日志来备份数据的),那么另外一个集群上就不会有Bulkload的数据。

3.前准备

  1. 在HBase客户端建立一张目标表:

hbase(main)::> create 'bulkload_text','f'
row(s) in 0.5230 seconds

  2. 准备数据源,在hdfs上建立一个文本文件,假设取名为bulkload_reouse_file.txt内容如下:

rowKey1|a_1|b_1
rowKey2|a_2|b_2
rowKey3|a_3|b_3
rowKey4|a_4|b_4
rowKey5|a_5|b_5

  并将其保存在hdfs上,作为bulkload的数据源:

[hadoop@xufeng-3 bulkload]$ hadoop fs -ls /testdata/bulkload
16/07/30 16:33:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 1 hadoop supergroup 80 2016-07-30 16:33 /testdata/bulkload/bulkload_reouse_file.txt 

4. 实现步骤

  使用Bulkload需要经过两个大步骤。

  1.通过MR计算框架进行HFile文件的生成。

  2.加载HFile文件到集群(表)

1.通过MR计算框架进行HFile文件的生成

命令格式:

HADOOP_CLASSPATH=`$HBASE_HOME/bin/hbase classpath` hadoop jar $HBASE_HOME/lib/hbase-server-version.jar importtsv -Dimporttsv.bulk.output=<输出文件夹路径> -Dimporttsv.separator=<分割符> -Dimporttsv.columns=<key和列映射> <目标表> <数据源路径>

如本例中结合自身接群可以写成:

HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar /opt/hadoop/hbase/lib/hbase-server-1.0.0-cdh5.4.2.jar importtsv -Dimporttsv.bulk.output=hdfs://ns1/testdata/bulkload/result -Dimporttsv.separator='|' -Dimporttsv.columns=HBASE_ROW_KEY,f:a,f:b bulkload_text hdfs://ns1/testdata/bulkload/bulkload_reouse_file.txt

  其中  -Dimporttsv.columns=HBASE_ROW_KEY,f:a,f:b的意思是通过'|'分隔符号分割的第一个元素作为rowkey,第二个元素作为f:a列值,第三个元素作为f:b值。

结果:

  在目标路径文件夹下生成了f列的hife文件:

[hadoop@xufeng-3 bulkload]$ hadoop fs -ls /testdata/bulkload/result
16/07/30 16:56:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2016-07-30 16:46 /testdata/bulkload/result/_SUCCESS
drwxr-xr-x - hadoop supergroup 0 2016-07-30 16:53 /testdata/bulkload/result/f

2.加载HFile文件到集群(表)

  生成的HFile必须尽快的去load到表中,在第一个步骤中HFile生成的规则是一个region一个文件,如果不尽快加载一旦线上的region发生分裂就会造成加载的性能下降。

命令格式:

HADOOP_CLASSPATH=`$HBASE_HOME/bin/hbase classpath` hadoop jar $HBASE_HOME/lib/hbase-server-version.jar completebulkload <生成的HFile路径> <目标表名称> 

如本例中结合自身接群可以写成:

HADOOP_CLASSPATH=`/opt/hadoop/hbase/bin/hbase classpath` hadoop jar /opt/hadoop/hbase/lib/hbase-server-1.0.0-cdh5.4.2.jar completebulkload hdfs://ns1/testdata/bulkload/result bulkload_text

结果: 

  文件中信息按照key和列的映射关系load到了表中

hbase(main):002:0> scan 'bulkload_text'
ROW COLUMN+CELL
rowKey1 column=f:a, timestamp=1469911544908, value=a_1
rowKey1 column=f:b, timestamp=1469911544908, value=b_1
rowKey2 column=f:a, timestamp=1469911544908, value=a_2
rowKey2 column=f:b, timestamp=1469911544908, value=b_2
rowKey3 column=f:a, timestamp=1469911544908, value=a_3
rowKey3 column=f:b, timestamp=1469911544908, value=b_3
rowKey4 column=f:a, timestamp=1469911544908, value=a_4
rowKey4 column=f:b, timestamp=1469911544908, value=b_4
rowKey5 column=f:a, timestamp=1469911544908, value=a_5
rowKey5 column=f:b, timestamp=1469911544908, value=b_5
5 row(s) in 0.3520 seconds

5. 源码中bulkload注释信息:

Usage: importtsv -Dimporttsv.columns=a,b,c <tablename> <inputdir>

Imports the given input directory of TSV data into the specified table.

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. You must specify exactly one column
to be the row key, and you must specify a column name for every column that exists in the
input data. Another special column HBASE_TS_KEY designates that this column should be
used as timestamp for each record. Unlike HBASE_ROW_KEY, HBASE_TS_KEY is optional.
You must specify atmost one column as timestamp key for each imported record.
Record with invalid timestamps (blank, non-numeric) will be treated as bad record.
Note: if you use this option, then 'importtsv.timestamp' option will be ignored. By default importtsv will load data directly into HBase. To instead generate
HFiles of data to prepare for a bulk data load, pass the option:
-Dimporttsv.bulk.output=/path/for/output
Note: if you do not use this option, then the target table must already exist in HBase Other options that may be specified with -D include:
-Dimporttsv.skip.bad.lines=false - fail if encountering an invalid line
'-Dimporttsv.separator=|' - eg separate on pipes instead of tabs
-Dimporttsv.timestamp=currentTimeAsLong - use the specified timestamp for the import
-Dimporttsv.mapper.class=my.Mapper - A user-defined Mapper to use instead of TsvImporterMapper
For performance consider the following options:
-Dmapred.map.tasks.speculative.execution=false
-Dmapred.reduce.tasks.speculative.execution=false

6. 总结

  bulkload提供一种快速的数据加载方法,使得外部数据以资源最小化的方式加载的HBase中。

  当你在加载数据的时候遇到如下情况,那么使用bulkload或许是一个不错的选择:

  • You needed to tweak your MemStores to use most of the memory.
  • You needed to either use bigger WALs or bypass them .
  • Your compaction and flush queues are in the hundreds.
  • Your GC is out of control because your inserts range in the MBs.
  • Your latency goes out of your SLA when you import data.

7. 参考

  http://blog.cloudera.com/blog/2013/09/how-to-use-hbase-bulk-loading-and-why/

  https://hbase.apache.org/book.html#arch.bulk.load

[How to] HBase的bulkload使用方法的更多相关文章

  1. [How to]HBase集群备份方法

    1.简介 当HBase数据库中存在非常重要的业务数据的时候为了保护数据的可以对数据进行备份处理.对于HBase来说从备份操作来看可分为离线备份和在线备份. 2. 前准备 在测试环境上准备有哦两套HBa ...

  2. Hbase常见错误解决方法

    Hbase常见错误解决方法 原文转载至:https://www.jianshu.com/p/5fd74812c56c   我是通过maven管理的依赖,直接修改maven依赖中hbase的版本就可以了 ...

  3. [How to]HBase集群备份方法--Replication机制

    1.简介 HBase备份的方法在[How to]HBase集群备份方法文章中已经有些介绍,但是这些方法都不是HBase本身的特性在支持,都是通过MR计算框架结合HBase客户端的方式,或者直接拷贝HB ...

  4. HBase的bulkLoad

    HBase的BulkLoad有两种方式: thinrow的机制是flatmap把cell的信息进行flatmap:适合少于1万列的数据集:thinrow的涵义就是少行多列: bulkload的机制则是 ...

  5. 大数据学习笔记——HBase使用bulkload导入数据

    HBase使用bulkload批量导入数据 HBase可使用put命令向一张已经建好了的表中插入数据,然而,当遇到数据量非常大的情况,一条一条的进行插入效率将会大大降低,因此本篇博客将会整理提高批量导 ...

  6. Hbase操作table常见方法示例

    首先上我的输出类: /** * 功能:电池历史数据数据结构 * Created by liuhuichao on 2016/12/5. */ public class ResBatteryDataHi ...

  7. 一种HBase表数据迁移方法的优化

    1.背景调研: 目前存在的hbase数据迁移主要分如下几类: 根据上图,可以看出: 其实主要分为两种方式:(1)hadoop层:因为hbase底层是基于hdfs存储的,所以可以通过把hdfs上的数据拷 ...

  8. 通过BulkLoad快速将海量数据导入到Hbase

    在第一次建立Hbase表的时候,我们可能需要往里面一次性导入大量的初始化数据.我们很自然地想到将数据一条条插入到Hbase中,或者通过MR方式等. 但是这些方式不是慢就是在导入的过程的占用Region ...

  9. 在Spark上通过BulkLoad快速将海量数据导入到Hbase

    我们在<通过BulkLoad快速将海量数据导入到Hbase[Hadoop篇]>文中介绍了一种快速将海量数据导入Hbase的一种方法,而本文将介绍如何在Spark上使用Scala编写快速导入 ...

随机推荐

  1. VS中碰到的问题

    1.调试的时候,语句已经注释掉了,但是在执行的时候还是运行了(或者某些变量值改变后,程序依然用的之前数据). 右键解决方案-->清理,然后重新生成.

  2. 关于setInterval()定时

    最近项目中,遇到个需求就是获取停车场剩余车位数量,想是通过ajax定时抓取接口数据来实现(本想通过SignalR),但是项目本身直供少数人使用,感觉定时ajax可以满足 下面上代码 var handl ...

  3. DjangoORM基本增删改查

    1. 下载并且安装navicat premium,连接到db.sqlite3数据库. 2.先在urls.py中增加一条对应关系,专门用来做测试. 3.此时models.py中的代码如下: 4. 对于O ...

  4. BZOJ4033:[HAOI2015]树上染色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4033 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将 ...

  5. 第三周——构建一个简单的Linux系统MenuOS

    [洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 第三周  构建一个 ...

  6. POJ.2251 Dungeon Master (三维BFS)

    POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...

  7. 第一个python程序(2)

    输入和输出 输出 用print加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' pr ...

  8. 驱动之DMA的介绍与应用20170210

    本文主要介绍的是DMA相关的知识,首先: 1)在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题.即DMA传输前,CPU要把 总线控制权交给DMA控制器,而在结束DM ...

  9. JSTL与EL与OGNL

    springMVC使用JSTL与EL表达式: spring MV默认的jsp页面的标签就是JSTL,而struts2默认的是OGNL标签. struts2 使用OGNL与EL表达式:OGNL用stru ...

  10. cmd编译java程序出现:找不到或无法加载主类的原因以及解决办法 以及 给java的main方法传递args参数

    原因: 1.java源程序中没有主类main方法. 2.java源程序中包含有eclipse等IDE工具生成的package包. 解决办法(对应以上的原因): 1.运行含有main的类 2.将java ...