HBase和Mapreduce

  HBase和Mapreduce整合的代码网上有很多可以参考,在部署jar程序时遇到一个工程问题,值得注意,联系到之前在做spark时遇到过的一个类似的问题,这里详细介绍一下问题和解决方式
  任务本身是读取hdfs上的数据,提取所需要的字段然后写入到hbase中,是一个常见的HBase和MapReduce结合的应用程序,在完成代码编写打包提交之后,运行代码时任务正常提交到了集群,并且Map任务顺利执行,没有出现异常,但是当任务运行到reduce阶段的时候出现了HBase的jar包中的一个类classnofound 的报错,一开始以为是没有将jar添加到classpath中,仔细检查运行脚本,发现所需要的jar已经添加了classpath路径中了,并且在之前的任务重有使用相同的类,不存在是特殊的类未加入到classpath中,再仔细分析发现自己疏忽了一个点造成了找不到类的错误
  先介绍一点mapreduce运行时的原理,当我们向集群提交job的时候,yarn接受job并为任务分配资源,并将我们提交的jar包分发到节点上,节点上执行我们提交的代码也就是我们提交的jar,但是这里有一个问题,yarn只会分发我们提交的jar包,我们应用程序所依赖的jar不会自动发送,当我们的任务依赖外部jar时,需要我们为每个节点都提供外部jar,一种做法是将HBase的lib的路径添加到hadoop的classpath路径下,如果需要引入外部包则将外部包拷贝到hadoop中每个节点下的lib文件下,另一种做法是打包时将所依赖的jar包一并打包。这两种方式都不是很好的解决方法,第二种会导致我的任务jar包异常的大,一个简单的任务都会占用很大的空间,第一种虽然不需要占用很大的空间,但是将jar直接放入hadoop中的lib容易造成jar的冲突问题,而且jar不方便管理,曾经在spark项目中由于直接导入hbase的jar到lib文件中导致spark异常无法正常启动。
  这里介绍一种hadoop本身提供的缓存机制来很方便的解决这样的问题,mapreduce提供了分布式缓存的方法来讲jar缓存到hdfs上,在运行时将jar添加到classpath中,所有的节点都去读取hdfs上的jar文件,只需要将需要的jar上传一次即可,解决引入第三方jar文件不方便的问题

  操作方法:

  在hdfs上创建文件夹 hdfs dfs -mkdir /usr/jar_classpath

     将第三方jar文件上传到文件夹下 hdfs dfs -put *.jar /usr/jar_classpath

  下面是一个工具方法,可以将文件夹下的所有jar添加到classpath中:

 1 public static void addJarToClassPath(Configuration conf) throws Exception{
 2     FileSystem fs = FileSystem.get(conf);
 3     Path jobClassPath = new Path(conf.get("job.class.path",
 4             "/spdbccc/job_classpath"));
 5     logger.info("job.class.path =" +jobClassPath);
 6     if (!fs.exists(jobClassPath)) {
 7         throw new Exception(jobClassPath + " not exists!");
 8     }
 9     FileStatus[] jars = fs.listStatus(jobClassPath);
10     if (jars == null || jars.length == 0) {
11         return;
12     }
13     for (FileStatus fileStatus : jars) {
14         DistributedCache.addFileToClassPath(fileStatus.getPath(), conf, fs);
15     }
16     DistributedCache.createSymlink(conf);
17 }

addJarToClassPath

时间: 2024-12-30 02:32:03

HBase和Mapreduce的相关文章

HBase结合MapReduce批量导入(HDFS中的数据导入到HBase)

HBase结合MapReduce批量导入 1 package hbase; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.hbase.client.Put; 8 import org.apache.hadoop.hbase.mapreduce.TableOutput

HBase概念学习(七)HBase与Mapreduce集成

这篇文章是看了HBase权威指南之后,根据上面的讲解搬下来的例子,但是稍微有些不一样. HBase与mapreduce的集成无非就是mapreduce作业以HBase表作为输入,或者作为输出,也或者作为mapreduce作业之间共享数据的介质. 这篇文章将讲解两个例子: 1.读取存储在hdfs上的txt文本数据,简单地以json字符串的形式存储到HBase表中. 2.将第一步存储的HBase表中的json字符串读取出来,解析存储到新的HBase表中,可以进行查询. 本文详细给出了源码以及如何运行

Hadoop之——HBASE结合MapReduce批量导入数据

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46463889 废话不多说.直接上代码,你懂得 package hbase; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.Put; import

Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbase调用MapReduce函数使用理解 第三部分:Hbase调用Java API使用理解 第四部分:Hbase Shell操作 第五部分:Hbase建表.读写操作方式性能优化总结 第一部分:Hbase框架原理理解 概述 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google

hbase 结合MapReduce 批量导入

hbase结合Mapreduce的批量导入: 直接给出代码讲述:(具体操作结合代码中的注释) package hbase; import java.io.IOException; import java.net.URISyntaxException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.had

HBase结合MapReduce批量导入

2016年5月14日13:17:05 作者:数据分析玩家 Hbase是Hadoop生态体系配置的数据库,我们可以通过HTable api中的put方法向Hbase数据库中插入数据,但是由于put效率太低,不能批量插入大量的数据,文本将详细介绍如何通过MapReduce运算框架向Hbase数据库中导入数据. 开篇先介绍业务场景:将电信手机上网日志中的数据导入到Hbase数据库中,将部分数据以及相应字段描述列出: 图片格式描述: 先介绍一个日期格式的转换: public class TestDate

HBase with MapReduce (MultiTable Read)

hbase当中没有两表联查的操作,要实现两表联查或者在查询一个表的同时也需要访问另外一张表的时候,可以通过mapreduce的方式来实现,实现方式如下:由于查询是map过程,因此这个过程不需要设计reduce过程. (1)map的实现 package com.datacenter.HbaseMapReduce.MultiReadTable; import java.io.IOException; import java.util.NavigableMap; import java.util.Ma

HBase with MapReduce (Read and Write)

上面一篇文章仅仅是介绍如何通过mapReduce来对HBase进行读的过程,下面将要介绍的是利用mapreduce进行读写的过程,前面我们已经知道map实际上是读过程,reduce是写的过程,然而map也可以实现写入的过程,因此可以通过map实现读写的过程.具体实现如下所示: (1)map的实现 package com.datacenter.HbaseMapReduce.ReadWrite; import java.io.IOException; import org.apache.hadoop

HBase with MapReduce (Summary)

我们知道,hbase没有像关系型的数据库拥有强大的查询功能和统计功能,本文实现了如何利用mapreduce来统计hbase中单元值出现的个数,并将结果携带目标的表中, (1)mapper的实现 package com.datacenter.HbaseMapReduce.Summary; import java.io.IOException; import java.util.NavigableMap; import java.util.Map.Entry; import org.apache.h