文档章节

hadoop mapreduce程序jar包版本冲突解决方法

有些服务器
 有些服务器
发布于 2015/11/19 12:28
字数 415
阅读 45
收藏 0

写MR程序时往往会使用到第三方包, 如果这些包在集群中不存在, 可以通过多种方式提交到集群供 MR 程序使用, 但如果集群中存在的jar与用户MR程序用到的JAR存在版本冲突时该如何解决?

下面是我碰到的问题及解决方式, 简单记录如下, 碰到同样问题的同学可以参考下:

昨天使用 commons-net-3.2.jar 包连接FTP采集日志,

调用方法片段:


FTPClient ftpClient = new FTPClient();

ftpClient.setConnectTimeout(1000);


// 这个方法在commons-net-3.2.jar包中有, 而在 commons-net-1.4.1.jar 中没有


一般情况下,使用hadoop jar 执行mr的时候,会首先加载$HADOOP_HOME/lib下的jar包,

由于使用的hadoop中带了commons-net-1.4.1.jar,所以会优先加载1.4.1版本,而忽略用户自己指定的3.2版本,所以报异常,


Error: org.apache.commons.net.ftp.FTPClient.setConnectTimeout(I)V

//异常提示调用setConnectTimeout 方法有问题。


/**

  */

  static List getClassPaths(JobConf conf, File workDir,

  TaskDistributedCacheManager taskDistributedCacheManager)

    throws IOException {

   // Accumulates class paths for child.

   List classPaths = new ArrayList();

   boolean userClassesTakesPrecedence = conf.userClassesTakesPrecedence();

// 这个参数项可以改变系统classpath加载的优先顺序, 默认应该是false

   if (!userClassesTakesPrecedence) {   // 默认是false, tasktrack机器的系统classpath总是优先加载

   // start with same classpath as parent process

    appendSystemClasspaths(classPaths);

 }

   // include the user specified classpath

    appendJobJarClasspaths(conf.getJar(), classPaths);

   // Distributed cache paths

    if (taskDistributedCacheManager != null)

      classPaths.addAll(taskDistributedCacheManager.getClassPaths());

    // Include the working dir too

    classPaths.add(workDir.toString());

    if (userClassesTakesPrecedence) {

      // parent process's classpath is added last

     appendSystemClasspaths(classPaths);

   }

    return classPaths;

  }


通过上面源码可以看出 参数项 -Dmapreduce.task.classpath.user.precedence 可以改变系统classpath加载的优先顺序


验证:


hadoop jar collect_log.jar com.collect.LogCollectJob -Dmapreduce.task.classpath.user.precedence=true -libjars commons-net-3.2.jar /new_log_collect/input /new_log_collect/output


程序执行成功。


© 著作权归作者所有

共有 人打赏支持
有些服务器
粉丝 4
博文 49
码字总数 86607
作品 0
南昌
私信 提问
如何分布式运行mapreduce程序

如何分布式运行mapreduce程序 一、 首先要知道此前提 若在windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序自动读取集群的地址后...

Zero零_度
2015/09/06
0
0
eclipse连hadoop2.x运行wordcount

一、新建java工程,并且导入hadoop相关jar包 4.1.2 新建java工程(需要手动导入hadoop相应jar包),具体如下图所示: 4.1.2.1 新建java工程完成后,下面添加hadoop相应jar包,hadoop2.3.0相应...

cjun1990
2015/07/07
0
0
Hadoop2.X的安装与配置(二)本地模式

在上一篇文章中,我们介绍了Hadoop2.X安装与配置前的准备阶段。 在本地模式配置前,首先完成准备阶段。 点击如下链接,进入准备阶段的配置 https://blog.csdn.net/weixin38187469/article/d...

weixin_38187469
04/16
0
0
hadoop 2.2.0 编译运行wordcount

hadoop2.2.0 编译运行wordcount,因为hadoop2.2.0不支持eclipse的插件,所以运行wordcount,需要手动编译并将wordcount打包成jar包来运行,下面记录一下编译运行的过程,希望能给大家有些帮助...

Adel
2014/09/05
0
1
Hadoop的mapreduce的简单用法

 Mapreduce初析   Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(outpu...

魔法王者安琪拉
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部