`
superlxw1234
  • 浏览: 552182 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44532
社区版块
存档分类
最新评论

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

阅读更多

写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 方法有问题。

 

查看源码TaskRunner.java

 

/**

   */

  static List<String> getClassPaths(JobConf conf, File workDir,

      TaskDistributedCacheManager taskDistributedCacheManager)

      throws IOException {

    // Accumulates class paths for child.

    List<String> classPaths = new ArrayList<String>();

   

    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

程序执行成功。

分享到:
评论

相关推荐

    hadoop框架的jar包整合

    这123个jar包可能包含了Hadoop核心、HDFS、MapReduce、YARN(Yet Another Resource Negotiator,资源调度器)、Hadoop Common以及其他相关模块如Hadoop Shuffle Service、Hadoop Metrics等的类库。这些jar包通常包含...

    spark-assembly-1.5.2-hadoop2.6.0jar包

    此外,由于此jar是预先编译并集成了所有依赖的"fat jar",因此它消除了可能的版本冲突问题,使得在多版本Hadoop环境中的部署变得更加简单。但同时,这也意味着该jar文件可能体积较大,可能会增加网络传输和存储的...

    hadoop和hbase集成所需jar包

    - 为了避免版本冲突,通常需要在类路径中包含Hadoop和HBase的全集JAR包,而不是仅依赖某些特定的库。 - 在执行MapReduce任务时,确保HBase集群是运行状态,并正确配置了相关连接参数。 了解以上知识后,你可以将...

    flink-shaded-hadoop-2-uber-2.7.5-10.0.jar.zip

    总的来说,`flink-shaded-hadoop-2-uber-2.7.5-10.0.jar.zip` 提供了一个方便、兼容且冲突解决的 Flink-Hadoop 集成方案,是大数据开发者在处理涉及 Flink 和 Hadoop 的复杂场景时的重要工具。理解并熟练使用这种 ...

    win7下编译过的hadoop jar包

    8. **Hadoop的版本兼容性**:不同版本的Hadoop可能存在API的变化,因此预编译的JAR包需要与特定版本的Hadoop相匹配。 9. **使用Hadoop的工具**:例如Hadoop命令行工具、Hadoop的Java API,以及像Hue这样的图形界面...

    flink-shaded-hadoop-3-uber-3.1.1.7.1.1.0-565-9.0.jar.tar.gz

    然而,不同版本的Hadoop可能包含与Flink不兼容的API或类库,因此在使用Hadoop 3.x时,直接将Flink的jar包与Hadoop的jar包一起加载可能会导致冲突。为解决这个问题,Flink社区提供了"flink-shaded-hadoop-3-uber-3.1....

    hadoop集群遇到的问题及其解决方法

    ### Hadoop集群遇到的问题及其解决方法 #### 异常一:DataNode无法连接到NameNode **问题描述:** 在Hadoop集群部署过程中,经常会出现DataNode无法成功连接到NameNode的情况,导致集群无法正常启动。 **原因分析...

    jarjar ---hadoop

    MapReduce是一种编程模型,用于处理和生成大规模数据集,而jarjar则为这种环境提供了必要的类管理解决方案。 1. **依赖管理**:Hadoop项目通常依赖于大量的第三方库,这些库可能包含相同的类,导致冲突。jarjar通过...

    Mapper类和Reducer类代码编写所需的全部基本jar包

    在开发MapReduce程序时,将这些jar包添加到类路径(classpath)中是至关重要的,因为它们包含了运行MapReduce作业所必需的类和方法。例如,`Mapper`和`Reducer`基类定义在`hadoop-mapreduce-client-core.jar`中,而...

    flink-shaded-hadoop-2-uber-2.7.5-10.0.jar

    这里,"2.7.5" 是 Hadoop 的版本号,而 "10.0" 可能是 Flink 的版本号,意味着这个 JAR 包整合了 Flink 对 Hadoop 2.7.5 版本的兼容支持。 接下来,我们关注压缩包内的文件: 1. `org.apache.hadoop.application-...

    java开发hbase1.2.6需要的jar包整合

    在实际开发中,建议使用构建工具(如Maven或Gradle)来管理这些依赖,这样可以确保所有必需的jar包都被正确地引入,并且避免版本冲突。同时,注意HBase和Hadoop版本的兼容性,不同的HBase版本可能需要特定版本的...

    修复版 hadoop-0.21.0-eclipse-plugin.jar

    "修复版 hadoop-0.21.0-eclipse-plugin.jar"是针对原始hadoop-0.21.0版本的Eclipse插件进行了修正后的版本,解决了直接下载时可能存在的问题,确保用户能够直接在Eclipse中顺畅地使用。 原版的hadoop-0.21.0-...

    win7下hadoop job提交

    在实际操作中,可能会遇到一些问题,比如文件权限、网络配置、依赖冲突等,需要根据错误日志进行调试和解决。此外,虽然Windows 7支持Hadoop,但因为社区支持有限,推荐在Linux环境下进行大规模的Hadoop开发和生产...

    hbase1.2+java开发最小依赖jar包合集

    12. **版本兼容性**:在选择HBase的jar包时,应确保与Hadoop和其他依赖组件的版本兼容,避免出现运行时错误。 这个"**hbase1.2最小依赖**"压缩包是简化开发环境的一种方式,确保开发者能够快速启动HBase相关的Java...

    hadoop2.8.3

    6. **Hadoop命令行工具**:理解如何使用Hadoop的命令行工具,如`hadoop fs`系列命令,用于与HDFS交互,以及`hadoop jar`用于执行MapReduce程序。 7. **单机模式与伪分布式模式**:在Windows上,你可以先在单机模式...

    flink-shaded-hadoop-2-uber-2.6.5-10.0.zip

    本文将深入探讨“flink-shaded-hadoop-2-uber-2.6.5-10.0.zip”这个压缩包,它是Flink与Hadoop 2.6.5版本的连接器,旨在帮助开发者更好地在Flink中利用Hadoop的资源。 首先,我们来了解“flink-shaded-hadoop-2-...

    flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar

    在这个特定的Uber JAR中,Flink团队进行了“shading”操作,即将Hadoop的类重命名,以避免与应用中的其他库发生冲突。这种做法使得Flink可以在不修改原有Hadoop环境的情况下运行,同时也确保了不同版本的Hadoop库...

    hadoop-cdh4-0.3.zip

    3. **阴影(shaded)打包**: 在Java开发中,阴影打包是一种将第三方库的代码合并到单一JAR文件中的技术,通常用来解决依赖冲突。这个过程会重写类名以避免命名冲突,同时包含所有必要的依赖。 4. **开源文化**: 开源...

    细细品味Hadoop(Hadoop安装及配置).rar_hadoop_细细品味Hadoop

    将示例代码编译为jar包,然后通过`hadoop jar`命令提交作业,观察输出结果。 8. **关闭Hadoop**:完成测试后,使用`stop-dfs.sh`和`stop-yarn.sh`停止Hadoop服务。 在配置过程中,可能会遇到各种问题,如端口冲突...

    Hadoop的Codec(LZO代码库)

    Apache Hadoop的发行版本通常会包含多种内置的Codec,如Gzip、BZip2等,它们都有各自的性能特点。Gzip压缩率较高,但速度相对较慢;而BZip2压缩率更高,但速度更慢。相比之下,LZO在压缩速度上非常快,但压缩率相对...

Global site tag (gtag.js) - Google Analytics