写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
程序执行成功。
分享到:
相关推荐
window下eclipse中运行mapreduce程序所需要的Hadoop全部jar包
Hadoop 用mapreduce实现Wordcount实例,绝对能用
hadoop-annotations-3.1.1.jar hadoop-common-3.1.1.jar hadoop-mapreduce-client-core-3.1.1.jar hadoop-yarn-api-3.1.1.jar hadoop-auth-3.1.1.jar hadoop-hdfs-3.1.1.jar hadoop-mapreduce-client-hs-3.1.1.jar ...
upon the widely used and highly successful Hadoop MapReduce v1. The recipes that will help you analyze large and complex datasets with next generation Hadoop MapReduce will provide you with the skills...
有时候在eclipse上运行项目,需要引用的Hadoop的jar包,也就是hadoop的外部依赖包,有conf,fs,io,mapreduce等等,这里列举了一部分,基本上hadoop的所有外部依赖jar包都包含在内了,如果下载了不会使用,可以看我...
在hadoop平台上,用mapreduce编程实现大数据的词频统计
hadoop-mapreduce-examples-2.7.1.jar
Java操作Hadoop Mapreduce基本实践源码.
用MapReduce实现TF-IDF,Hadoop版本是2.7.7,参考某教程亲自手写的,可以运行,有问题可以留言
使用ecplice操作hadoop所需要的各种jar包。包括hdfs,maprudce,yarn,httpfs,kms。
Hadoop MapReduce Cookbook 高清完整版PDF下载 Hadoop MapReduce Cookbook
本书对Hadoop Mapreduce进行详细讲解,切合实际应用,能够更深入地学习MapReduce,确实是一本不错的书。
完整的Hadoop jar包,解压直接用。
赠送jar包:hadoop-mapreduce-client-jobclient-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-jobclient-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-jobclient-2.6.5-sources.jar; 赠送...
hadoop eclipse mapreduce 下开发所有需要用到的 JAR 包。 hadoop eclipse 下进行mapreduce开发所有需要用到的JAR包 mapreduce
Hadoop MapReduce作业卡死问题的解决方法.docx
1、程序设计模式不容易使用,而且 Hadoop 的 Map Reduce API 太过低级,很难提高开发者的效率。 2、有运行效率问题,MapReduce 需要将中间产生的数据保存到硬盘中,因此会有读写数据延迟问题。 3、不支持实时处理...
压缩包内含有hadoop2.7.6的所有jar包,一键导入,不用自己动手搜索啦
(1)熟悉Hadoop开发包 (2)编写MepReduce程序 (3)调试和运行MepReduce程序 (4)完成上课老师演示的内容 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 二、实验内容 1.单词计数实验...
hadoop-mapreduce-examples-2.6.5.jar 官方案例源码