目录

  • 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):

  1. HDFS从HBase表中读数据
  2. HDFS写数据到HBase表中
  3. 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数据 mapreduce读取hbase_jar


mapreduce处理hbase数据 mapreduce读取hbase_mapreduce处理hbase数据_02

案例二:使用 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 表中

解释:

  • 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’

mapreduce处理hbase数据 mapreduce读取hbase_hbase_03

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

注:运行任务前,如果待数据导入的表不存在,则需要提前创建。导出数据的表也需要提前创建。