写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
程序执行成功。
分享到:
相关推荐
这123个jar包可能包含了Hadoop核心、HDFS、MapReduce、YARN(Yet Another Resource Negotiator,资源调度器)、Hadoop Common以及其他相关模块如Hadoop Shuffle Service、Hadoop Metrics等的类库。这些jar包通常包含...
此外,由于此jar是预先编译并集成了所有依赖的"fat jar",因此它消除了可能的版本冲突问题,使得在多版本Hadoop环境中的部署变得更加简单。但同时,这也意味着该jar文件可能体积较大,可能会增加网络传输和存储的...
- 为了避免版本冲突,通常需要在类路径中包含Hadoop和HBase的全集JAR包,而不是仅依赖某些特定的库。 - 在执行MapReduce任务时,确保HBase集群是运行状态,并正确配置了相关连接参数。 了解以上知识后,你可以将...
总的来说,`flink-shaded-hadoop-2-uber-2.7.5-10.0.jar.zip` 提供了一个方便、兼容且冲突解决的 Flink-Hadoop 集成方案,是大数据开发者在处理涉及 Flink 和 Hadoop 的复杂场景时的重要工具。理解并熟练使用这种 ...
8. **Hadoop的版本兼容性**:不同版本的Hadoop可能存在API的变化,因此预编译的JAR包需要与特定版本的Hadoop相匹配。 9. **使用Hadoop的工具**:例如Hadoop命令行工具、Hadoop的Java API,以及像Hue这样的图形界面...
然而,不同版本的Hadoop可能包含与Flink不兼容的API或类库,因此在使用Hadoop 3.x时,直接将Flink的jar包与Hadoop的jar包一起加载可能会导致冲突。为解决这个问题,Flink社区提供了"flink-shaded-hadoop-3-uber-3.1....
### Hadoop集群遇到的问题及其解决方法 #### 异常一:DataNode无法连接到NameNode **问题描述:** 在Hadoop集群部署过程中,经常会出现DataNode无法成功连接到NameNode的情况,导致集群无法正常启动。 **原因分析...
MapReduce是一种编程模型,用于处理和生成大规模数据集,而jarjar则为这种环境提供了必要的类管理解决方案。 1. **依赖管理**:Hadoop项目通常依赖于大量的第三方库,这些库可能包含相同的类,导致冲突。jarjar通过...
在开发MapReduce程序时,将这些jar包添加到类路径(classpath)中是至关重要的,因为它们包含了运行MapReduce作业所必需的类和方法。例如,`Mapper`和`Reducer`基类定义在`hadoop-mapreduce-client-core.jar`中,而...
这里,"2.7.5" 是 Hadoop 的版本号,而 "10.0" 可能是 Flink 的版本号,意味着这个 JAR 包整合了 Flink 对 Hadoop 2.7.5 版本的兼容支持。 接下来,我们关注压缩包内的文件: 1. `org.apache.hadoop.application-...
在实际开发中,建议使用构建工具(如Maven或Gradle)来管理这些依赖,这样可以确保所有必需的jar包都被正确地引入,并且避免版本冲突。同时,注意HBase和Hadoop版本的兼容性,不同的HBase版本可能需要特定版本的...
"修复版 hadoop-0.21.0-eclipse-plugin.jar"是针对原始hadoop-0.21.0版本的Eclipse插件进行了修正后的版本,解决了直接下载时可能存在的问题,确保用户能够直接在Eclipse中顺畅地使用。 原版的hadoop-0.21.0-...
在实际操作中,可能会遇到一些问题,比如文件权限、网络配置、依赖冲突等,需要根据错误日志进行调试和解决。此外,虽然Windows 7支持Hadoop,但因为社区支持有限,推荐在Linux环境下进行大规模的Hadoop开发和生产...
12. **版本兼容性**:在选择HBase的jar包时,应确保与Hadoop和其他依赖组件的版本兼容,避免出现运行时错误。 这个"**hbase1.2最小依赖**"压缩包是简化开发环境的一种方式,确保开发者能够快速启动HBase相关的Java...
6. **Hadoop命令行工具**:理解如何使用Hadoop的命令行工具,如`hadoop fs`系列命令,用于与HDFS交互,以及`hadoop jar`用于执行MapReduce程序。 7. **单机模式与伪分布式模式**:在Windows上,你可以先在单机模式...
本文将深入探讨“flink-shaded-hadoop-2-uber-2.6.5-10.0.zip”这个压缩包,它是Flink与Hadoop 2.6.5版本的连接器,旨在帮助开发者更好地在Flink中利用Hadoop的资源。 首先,我们来了解“flink-shaded-hadoop-2-...
在这个特定的Uber JAR中,Flink团队进行了“shading”操作,即将Hadoop的类重命名,以避免与应用中的其他库发生冲突。这种做法使得Flink可以在不修改原有Hadoop环境的情况下运行,同时也确保了不同版本的Hadoop库...
3. **阴影(shaded)打包**: 在Java开发中,阴影打包是一种将第三方库的代码合并到单一JAR文件中的技术,通常用来解决依赖冲突。这个过程会重写类名以避免命名冲突,同时包含所有必要的依赖。 4. **开源文化**: 开源...
将示例代码编译为jar包,然后通过`hadoop jar`命令提交作业,观察输出结果。 8. **关闭Hadoop**:完成测试后,使用`stop-dfs.sh`和`stop-yarn.sh`停止Hadoop服务。 在配置过程中,可能会遇到各种问题,如端口冲突...
Apache Hadoop的发行版本通常会包含多种内置的Codec,如Gzip、BZip2等,它们都有各自的性能特点。Gzip压缩率较高,但速度相对较慢;而BZip2压缩率更高,但速度更慢。相比之下,LZO在压缩速度上非常快,但压缩率相对...