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

本文介绍在Hadoop MapReduce程序中遇到的JAR包版本冲突问题及解决方案。具体问题为使用commons-net-3.2.jar时,由于Hadoop自带的commons-net-1.4.1.jar导致版本冲突,最终通过调整类路径加载优先级解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写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


程序执行成功。


转载于:https://my.oschina.net/u/2408078/blog/532660

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值