三-2. HBase与Mapreduce交互(待补充)

3.2 HBase与MapReduce 交互

3.2.0 前言

在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一张表中读数据再写入另一张表

3.2.1 环境准备 + 官方案例一:对表的行数进行计数

  1. 配置系统环境变量, 为了保持连贯性, 我们仍旧采用通过在/etc/profile.d/my_env.sh 或者直接 sudo vi /etc/profile中填写环境变量信息:
# HADOOP_HOME configuration
export HADOOP_HOME=/opt/module/hadoop-3.1.3

# HBASE_HOME configuration
export HBASE_HOME=/opt/module/hbase-2.3.7
  1. $HADOOP_HOME/etc/hadoop/hadoop-env.sh,在文件最后一行加上下面这一句, 完事之后需要重启集群加载,
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/module/hbase-2.3.7/lib/*
  1. 分发hadoop_env.sh到各个子节点, 然后分别重启hadoop集群和Hbase集群.

2-1. 下面介绍一种更省事的方法(代替2,3步): 直接在环境变量追加hbase的依赖目录到HADOOP_CLASSPATH中, 只需要source /etc/profile 即可, 无需启动集群, 也不需要分发hadoop_env.sh

sudo vi /etc/profile
#添加下面这句话
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/module/hbase-2.3.7/lib/*
**[验证上面配置成功的方法:]**

    - 执行 `echo $HADOOP_CLASSPATH`,  如果在末尾出现**/opt/module/hbase-2.3.7/lib/*** 则说明 hadoop能够识别到hbase的jar包了
  1. HBase安装目录下执行下面指令, 启动一个MR进程对hbase中的person表进行wordcount. 如果出现ROW=xx , 说明HADOOP 能够正常的连接到HBase中的表了.
yarn jar lib/hbase-mapreduce-2.3.7.jar rowcounter person
  • yarn 前面省略了${HADOOP_HOME}/bin, 因为环境变量中已有这个值了
  • yarn jar 代表执行一个jar file
  • rowcounter 是代指hbase-mapreduce-2.3.7.jar中的一个类名
  • person是表名, 作为rowcounter的参数

请添加图片描述


  1. 对于Exception in thread "main" java.lang.ClassNotFoundException: RowCounter的解决办法:
  • 出现这种问题一般是jar包中没有对应的类, 可能是jar名字和对应的功能不匹配导致的, 如果要执行mapreduce任务, 请首先保证上面的环境变量配置是正确的, 然后在 $HBASE_HOME/lib下查找带有hbase-mapreduce-版本号.jar 相关的类,
  1. ${HBASE_HOME}/bin/hbase mapredcp 有什么用?
  • 根据官方文档来看: 它列出了在 hbase 运行基础 mapreduce 作业所需的最小 jar 文件集合, 经笔者检验, hbase1.x 的hbase mapredcp仍旧含有较全面的jar包依赖(包括sgg 2019讲到的 hbase-server-1.3.1.jar), 然而到了 hbase 2.3.7(其他版本未验证), 已经是精简了很多, 并且全部指向的是lib目录下的client-facing-thirdpartyshaded-clients两个子目录下的jar包,

请添加图片描述

  • 所以如果你在前面如果用 hbase mapred作为参数配置给了$HADOOP_CLASSPATH, 请一定要把jar的名字跟这两个文件夹的相应名称对应上, 否则一定会出现 jar包未找到, 或Exception in thread "main" java.lang.ClassNotFoundException: RowCounter异常.

3.2.2 官方案例二: 使用MapReduce 将本地文件导入HBase

  1. 创建一个tsv格式的文件: fruit.tsv, 并把这个文件上传到HDFS上的/input文件夹
# 创建文件
>vi fruit.tsv
1001  Apple Red
1002  Pear  Yellow
1003  Pineapple Yellow
#上传文件: hdfs dfs -put 文件 目标地址
hdfs dfs ./fruit.tsv /input

请添加图片描述

  1. 在hbase shell 中创建fruit表, 列族为info
    请添加图片描述

  2. 在HBase安装目录下启动MR任务

yarn jar lib/hbase-mapreduce-2.3.7.jar importtsv \
-Dimporttsv.separator=' ' \
-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit \
hdfs://bigdata01:8020/input/fruit.tsv
  • importtsv–>前面jar包中负责导入tsv数据的类
  • `Dimporttsv.separator=’ '–>指定分隔符为空格
  • -Dimporttsv.columns=HBASE_ROW_KEY,cf:cn1,cf:cn2 表名—>指定tsv文件中的数据格式, 其中列名是可以随意起名, 列族和表名都必须符合HBase中预先定义好的表结构, 我们还可以在表名前面加上命名空间ns:table, 不加就是default命名空间.
  • hdfs://bigdata01:8020/input/fruit.tsv, hdfs上文件的路径, 单一文件的话最好能具体到文件名, 多个文件就具体到文件夹

要是不想总在HBase安装目录启动的话, 可以像hadoop一样, 把export PATH=$PATH:${HBASE_HOME}/lib添加到环境变量;

3.2.3 自定义HBase-MapReduce1(mr代码忘的差不多了, o(╥﹏╥)o, 复习去了)

3.2.3 自定义HBase-MapReduce2

猜你喜欢

转载自blog.csdn.net/nmsLLCSDN/article/details/121536536
2.
今日推荐