HBase与mapreduce集成

在公司中,大多数都是hbase和mapreduce共同进行业务操作,hbase多数都是读写操作,hbase和hadoop在内部已经封装好了,我们要做的就是调用。

常见的模式

1、从hbase读取数据

将hbase的数据作为map的输入

2、将数据写入hbase

将hbase作为reduce输出

3、从hbase读,再写入hbase

场景:数据迁移

比如有张表,有20列table01(20col),我需要将其中的10列给 table02(table01.10col)

启动环境

HBase与mapreduce集成

在HBase安装目录下找到jar包

hbase-server-1.2.1.jar

HBase与mapreduce集成

运行jar包

/opt/bigdata/hadoop-2.7.3/bin/yarn jar hbase-server-1.2.1.jar

出现问题

HBase与mapreduce集成

缺少hbase相关的jar包,因为命令是hadoop命令去运行hbase的jar包。

解决方案有两个

1、 将所有的hbase的jar包放到Hadoop运行环境变量中,

配置环境变量

HBASE_HOME、HADOOOP_HOME、HADOOP_CLASSPATH

其中HADOOP_CLASSPATH默认加载的是share/hadoop下的所有jar包的依赖,这种方式,可能会产生jar包冲突的情况

2、将Hadoop需要的hbase的jar包放到Hadoop运行环境变量中

运行bin/hbase mapredcp查看jar包,cp不是copy的意思,是classpath的意思,包含了hbase的jar包地址,需要将这些添加到classpath中。

HBase与mapreduce集成

所需要的jar包支持

HBase与mapreduce集成

声明环境变量可以在hadoop-env.sh中(需要重启),也可以永久生成到/etc/profile

我们选择/etc/profile

添加以下内容

export HBASE_HOME=/opt/bigdata/hbase-1.2.1

export

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`$HBASE_HOME/bin/hbase mapredcp`

HBase与mapreduce集成

配置生效

source /etc/profile

HBase与mapreduce集成

再执行之前的命令,就不会报错了

这里面的一些内容

CellCounter: 统计有多少cell

completebulkload: 将hfile的文件数据加载

copytable: 从一个集群中拷贝到另一个集群中

export: 将表导出到HDFS

import: Import data written by Export.

importtsv: 导入一个tsv的文件数据

rowcounter: 统计rowkey

verifyrep:比较两个不同集群中的表的数据

HBase与mapreduce集成

这是目前的表

HBase与mapreduce集成

有7行

HBase与mapreduce集成

使用下命令统计rowkey

/opt/bigdata/hadoop-2.7.3/bin/yarn jar hbase-server-1.2.1.jar rowcounter tt

HBase与mapreduce集成

运行成功

HBase与mapreduce集成

结果显示出来了

org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters

ROWS=7

HBase与mapreduce集成

我们现在设定一个需求:

将所有info列簇中的所有name这列导入到另一张表中去

首先建表,读取的表:

create 'stu_info','info','degree','work'

HBase与mapreduce集成

写入的表:

create 'stu_info_out',{NAME =>'info'}

HBase与mapreduce集成

插入准备的数据

put 'stu_info','10001','degree:xueli','benke'

put 'stu_info','10001','info:age','18'

put 'stu_info','10001','info:sex','male'

put 'stu_info','10001','info:name','tom'

put 'stu_info','10001','work:job','bigdata'

put 'stu_info','10002','degree:xueli','gaozhong'

put 'stu_info','10002','info:age','22'

put 'stu_info','10002','info:sex','female'

put 'stu_info','10002','info:name','jack'

put 'stu_info','10003','info:age','22'

put 'stu_info','10003','info:name','leo'

put 'stu_info','10004','info:age','18'

put 'stu_info','10004','info:name','peter'

put 'stu_info','10005','info:age','19'

put 'stu_info','10005','info:name','jim'

put 'stu_info','10006','info:age','20'

put 'stu_info','10006','info:name','zhangsan'

HBase与mapreduce集成

查看下数据是不是插入成功了

HBase与mapreduce集成

创建一个类

HBase与mapreduce集成

编写代码

导入的包

HBase与mapreduce集成

Map方法

HBase与mapreduce集成

Run方法

HBase与mapreduce集成

Main方法

HBase与mapreduce集成

运行代码

HBase与mapreduce集成

查看数据,已经导入了

HBase与mapreduce集成


分享到:


相關文章: