HBase数据大批量导入方式总结和对比

HBase数据导入

1. 背景

  1. 在实际生产中,海量数据一般都不是直接存储在HBase中,这时候就需要一个数据导入到HBase的步骤
  2. 上一篇博客讲述了可以通过java api的方式或者shell 客户端方式导入或者创建数据,但这对于实际生产中海量数据导入来说,速度和效率都太慢了,所以我们需要使用其他方式来解决海量输入导入到HBase的问题
  3. 利用HBase底层文件是HFile形式存储再HDFS中,所以如果能够直接生成HFile的话,这时候再让HBase从HFile中读取数据,就会快很多。

2. 批量数据导入方式

  1. shell 脚本命令,使用工具将HFile直接导入到HBase中
  2. 编写mapreduce程序,生成Hfile。然后再使用上shell方式,将HFile文件导入到HBase中
  3. 编写mapreduce程序,直接将文件中数据写入到Hbase中
  4. 将数据从HBase中一个地方(namespace、table)导入到HBase另外一个地方(namespace、table)

3.数据导入步骤

3.1 shell 脚本命令,使用工具将HFile直接导入到HBase中

3.1.1 将csv文件转为HFile
  1. 数据准备(数据形式需要是csv格式的数据)
    在这里插入图片描述
    在windows或者linux节点服务器上准备好,然后通过hdfs dfs -put指令上传到hdfs文件系统中。这里选择在linux系统上创建,可以省去在windows上创建后还要再从windows上传到linux节点服务器的步骤
    文件名这里是:bulkload.csv
1,lenovo,black,3000,intel
2,lenovo,black,43000,intel
3,xiaomi,black,3500,amd
4,lenovo,black,3000,amd
5,huawei,black,3000,amd
6,xiaomi,black,3000,arm
7,xiaomi,black,3000,arm
8,lenovo,black,6000,arm
9,huawei,black,5000,intel
10,huawei,black,3000,intel
11,huawei,black,7000,intel
12,huawei,black,3000,intel
13,hp,black,3000,amd
14,dell,black,3000,amd
15,huawei,black,3000,amd
16,apple,silver,544000,arm
17,mechanic,black,3000,arm
18,mechnic,black,3000,amd
19,hasee,black,12000,amd
20,hasee,black,23000,amd
21,hp,black,3000,intel
22,acer,black,3000,intel
23,acer,black,33000,intel
24,dell,black,30040,intel
25,dell,black,3000,intel
26,huawei,white,3000,amd
27,founder,blue,30060,intel
28,huawei,pink,3000,intel
29,huawei,black,30300,intel
30,huawei,black,3000,arm
31,huawei,black,33000,arm
32,lenovo,black,30200,arm
33,huawei,black,33000,intel
34,lenovo,black,3000,intel
35,huawei,black,30500,intel
36,lenovo,black,3000,intel
  1. 在hdfs上创建输入文件的文件夹
hdfs dfs -mkdir -p /csv/input
  1. 将linux节点服务器上的csv文件上传到hdfs的输入文件文件夹中
hdfs dfs -put bulkload.csv /csv/input

-- 上传之后,输入以下shell命令查看文件
hdfs dfs -ls /csv/input

文件上传后,查看上传结果
在这里插入图片描述
4. 在hdfs集群节点服务器上执行以下shell命令

  • 指定的shell命令
hbase  org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator=, \
-Dimporttsv.columns='HBASE_ROW_KEY,cf1:brand,cf1:color,cf1:price,cf2:cpu_brand'  \
-Dimporttsv.bulk.output=/csv/output \
doit:tb_computer_info \
/csv/input

# org.apache.hadoop.hbase.mapreduce.ImportTsv这个是进行导入数据的工具类的类型,类似于javca执行一个jar包时,需要指定一个main方法的类的全类名
# Dimporttsv.separator=, 这里是csv文件的分割符号,csv文件按照百度百科标准,一般都是以逗号进行分割,但实际可以使用其他分隔符号
#  Dimporttsv.columns='HBASE_ROW_KEY,cf1:brand,cf1:color,cf1:price,cf2:cpu_brand' 这里就是将csv文件中一行数据的每个字段对应在hbase的表中的字段进行指定,使用逗号隔开,例如第一个就是HBASE_ROW_KEY,第二个就是cf1:brand(就是列族cf1下的brand字段)
# doit:tb_computer_info这是hbase中的哪个表,如果需要指定namespace,前面加上namespace名再加上冒号。不指定就默认是default这个namespace中的表。注意这个表需在执行shell命令前建立好
# /csv/input这个是输入数据源路径
# -Dimporttsv.bulk.output=/csv/output  这个是输出数据源路径
# \ 反斜杠是因为shell命令一行太长,使用反斜杠进行分割 

  • Dimporttsv的参数说明

-Dimporttsv.skip.bad.lines=false - 若遇到无效行则失败
-Dimporttsv.separator=, - 使用特定分隔符,默认是tab也就是\t
-Dimporttsv.timestamp=currentTimeAsLong - 使用导入时的时间戳
-Dimporttsv.mapper.class=my.Mapper - 使用用户自定义Mapper类替换TsvImporterMapper
-Dmapreduce.job.name=jobName - 对导入使用特定mapreduce作业名
-Dcreate.table=no - 避免创建表,注:如设为为no,目标表必须存在于HBase中
-Dno.strict=true - 忽略HBase表列族检查。默认为false
-Dimporttsv.bulk.output=/user/yarn/output 作业的输出目录

  • 输入指令后,开始执行,按下enter键执行
    在这里插入图片描述
  • 执行过程日志,可以看出其实就是执行了一个mapreduce的程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 查看输出的文件
    注意这里按照列族数量,生成了2个文件夹,和hbase存储在hdfs中的文件规则是一致的。
    在这里插入图片描述
    注意点击进去cf1文件夹查看,可以看到有一个文件,这就是生成的hfile文件
    在这里插入图片描述
3.1.2 将HFile导入到HBase中
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /csv/output  doit:tb_computer_info
  • 输入指令后,可以看到如下日志,可以看出这时候就是HBase内部的程序,而不是mapreduce
    在这里插入图片描述
  • 查看hbase中对应表格中数据
    在这里插入图片描述

3.2 使用mapreduce方式导入hbase

3.2.1 环境准备
  1. pom文件
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
<dependencies>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-auth</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.2.5</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>3.2.1</version>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
 
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值