目录
- 1 配置环境变量
- 2 运行官方的 MapReduce 任务
- 3 自定义HBase-MR
【前言】
在Hadoop中MR使用HBase,需要将HBase的jar包添加到Hadoop的类路径下,所以需要修改配置文件添加类路径。这源于
一个思想:
A要使用 B,那么A要有B的jar包。例如:在
Hive的安装中,Hive需要使用到MySQL数据库,所以将jdbc驱动包放到lib文件夹中
HBase与MapReduce交互有三种方式(MR代表HDFS):
- HDFS从HBase表中读数据
- HDFS写数据到HBase表中
- HDFS从HBase一张表中读数据再写入另一张表
1 配置环境变量
查看hbase运行MapReduce需要的jar包:
$ hbase mapredcp
/home/hadoop/apps/hbase-1.2.6/lib/netty-all-4.0.23.Final.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-server-1.2.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/guava-12.0.1.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-protocol-1.2.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-common-1.2.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/protobuf-java-2.5.0.jar:/home/hadoop/apps/hbase-1.2.6/lib/zookeeper-3.4.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/htrace-core-3.1.0-incubating.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-prefix-tree-1.2.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/metrics-core-2.2.0.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-client-1.2.6.jar:/home/hadoop/apps/hbase-1.2.6/lib/hbase-hadoop-compat-1.2.6.jar
在01打开/home/hadoop/apps/hadoop-2.7.3/etc/hadoop
,在hadoop-env.sh
中给HADOOP_CLASSPATH添加上hbase的lib下的所有jar包(只多不少):
[hadoop@hadoop01 hadoop]$ vim hadoop-env.sh
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/home/hadoop/apps/hbase-1.2.6/lib/*
然后将修改好的hadoop-env.sh
发送到所有的hadoop集群节点02~05.
[hadoop@hadoop01 hadoop]$ scp hadoop-env.sh hadoop@hadoop02:$PWD
[hadoop@hadoop01 hadoop]$ scp hadoop-env.sh hadoop@hadoop03:$PWD
[hadoop@hadoop01 hadoop]$ scp hadoop-env.sh hadoop@hadoop04:$PWD
[hadoop@hadoop01 hadoop]$ scp hadoop-env.sh hadoop@hadoop05:$PWD
-注:添加所有jar包会报一下提示(如何去掉呢多余的jar?):
hadoop01: SLF4J: Class path contains multiple SLF4J bindings.
hadoop01: SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.3/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
hadoop01: SLF4J: Found binding in [jar:file:/home/hadoop/apps/hbase-1.2.6/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
方案一:将需要的添加到export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:
即可。
方案二:将需要的放入一个文件夹中,再把路径添加到export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:
后面。
方案三:将多余的jar包删除:(我采用这个)
在01~05中:
cd /home/hadoop/apps/hbase-1.2.6/lib/
mv slf4j-log4j12-1.7.5.jar slf4j-log4j12-1.7.5.jar.111111
启动hbase
2 运行官方的 MapReduce 任务
案例一:统计 student 表中有多少行数据(HDFS从HBase表中读数据)
[hadoop@hadoop01 ~]$ yarn jar /home/hadoop/apps/hbase-1.2.6/lib/hbase-server-1.2.6.jar rowcounter student
解释:
-
yarn jar
是hadoop中的执行jar包的命令 -
/home/hadoop/apps/hbase-1.2.6/lib/hbase-server-1.2.6.jar
是jar的全路径 -
rowcounter
是类名 -
student
是hbase中的表名(没加命名空间,默认为default。指定方式:myhbase:student
)
结果:
案例二:使用 MapReduce 将本地数据导入到 HBase(HDFS写数据到HBase表中)
1)在本地创建一个 tsv 格式的文件:fruit.tsv
1001 Apple Red
1002 Pear Yellow
1003 Pineapple Yellow
2)创建 HBase 表
hbase(main):001:0> create 'fruit','info'
3)在 HDFS 根目录中创建 input_fruit
文件夹并上传 fruit.tsv 文件
[hadoop@hadoop01 ~]$ hadoop fs -mkdir /input_fruit/
[hadoop@hadoop01 ~]$ hadoop fs -put fruit.tsv /input_fruit/
4)执行 MapReduce 到 HBase 的 fruit 表中
xxxxxxxxxx
yarn jar /home/hadoop/apps/hbase-1.2.6/lib/hbase-server-1.2.6.jar importtsv -Dimporttsv.separator=' ' -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit hdfs://hadoop01:9000/input_fruit
解释:
-
yarn jar
是hadoop中的执行jar包的命令 -
/home/hadoop/apps/hbase-1.2.6/lib/hbase-server-1.2.6.jar
是jar的全路径 -
importtsv
是类名 -
-Dimporttsv.separator=' '
指定分隔符为空格 -
Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color
第一列作为rowKey,第二列是name,第三列是color -
fruit
是hbase中的表名(没加命名空间,默认为default。指定方式:myhbase:fruit
) -
hdfs://hadoop01:9000/input_fruit
是tsv文件的父文件,输入路径
5)使用 scan 命令查看导入后的结果
hbase(main):002:0> scan ‘fruit’
3 自定义HBase-MR
功能:将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中
HBaseMRReadFruitMapper类,用于读取 fruit 表中的数据
HBaseMRWriteFruitReducer类,用于将读取到的 fruit 表中的数据写入到 fruit_mr表中
HBaseMRFruit2FruitRunner用于组装运行 Job任务
打包:右窗口栏->Maven Projects->Lifecycle->package
[hadoop@hadoop01 ~]$ yarn jar Hadoop_HDFS-1.0-SNAPSHOT.jar com/shane/hbase/HBaseMRFruit2FruitRunner
注:运行任务前,如果待数据导入的表不存在,则需要提前创建。导出数据的表也需要提前创建。