在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 环境准备 + 官方案例一:对表的行数进行计数
- 配置系统环境变量, 为了保持连贯性, 我们仍旧采用通过在/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
- $HADOOP_HOME/etc/hadoop/hadoop-env.sh,在文件最后一行加上下面这一句, 完事之后需要重启集群加载,
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/module/hbase-2.3.7/libopt/module/hbase-2.3.7/lib/*** 则说明 hadoop能够识别到hbase的jar包了
- 在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的参数
- 对于Exception in thread "main" java.lang.ClassNotFoundException: RowCounter的解决办法:
- 出现这种问题一般是jar包中没有对应的类, 可能是jar名字和对应的功能不匹配导致的, 如果要执行mapreduce任务, 请首先保证上面的环境变量配置是正确的, 然后在 $Hbase_HOME/lib下查找带有hbase-mapreduce-版本号.jar 相关的类,
- ${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-thirdparty和shaded-clients两个子目录下的jar包,
- 所以如果你在前面如果用 hbase mapred作为参数配置给了$HADOOP_CLASSPATH, 请一定要把jar的名字跟这两个文件夹的相应名称对应上, 否则一定会出现 jar包未找到, 或Exception in thread "main" java.lang.ClassNotFoundException: RowCounter异常.
- 创建一个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
-
在hbase shell 中创建fruit表, 列族为info
-
在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上文件的路径, 单一文件的话最好能具体到文件名, 多个文件就具体到文件夹
3.2.3 自定义Hbase-MapReduce1(mr代码忘的差不多了, o(╥﹏╥)o, 复习去了) 3.2.3 自定义Hbase-MapReduce2要是不想总在Hbase安装目录启动的话, 可以像hadoop一样, 把export PATH=$PATH:${Hbase_HOME}/lib添加到环境变量;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)