温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

hadoop作业引用第三方jar文件的原理解析是怎样的

发布时间:2021-12-03 17:48:25 来源:亿速云 阅读:234 作者:柒染 栏目:云计算

今天就跟大家聊聊有关hadoop作业引用第三方jar文件的原理解析是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在eclipse中写mapreduce程序, 引用第三方jar文件, 可以利用eclipse hadoop插件直接run on hadoop提交, 很方便.  不过插件版本要和eclipse匹配, 不然总是local执行, 在50070是没有job产生的.

如果希望将程序发布成jar文件, 在namenode上通过命令行方式执行, 缺少了eclipse帮忙自动配置jar文件, 会遇到java.lang.ClassNotFoundException, 这个问题可分成两种情况讨论.

一. hadoop命令式如何执行的?

其实$HADOOP_HOME/bin/hadoop是一个脚本文件.  以下wordcount命令为例

bin/hadoop jar wordcount.jar myorg.WordCount /usr/wordcount/input /usr/wordcount/output

脚本文件解析参数, 配置类路径等, 最终执行的是如下命令:

exec java -classpath $CLASSPATH org.apache.hadoop.util.RunJar $@

其中$CLASSPATH : 包含${HADOOP_CONF_DIR}, $HADOOP_HOME下的*.jar以及$HADOOP_CLASSPATH;

  • $@ :  所有脚本参数, 此处为jar后面的参数;

  • RunJar : 这个类的功能比较简单, 将jar文件解压到“hadoop.tmp.dir”目录下, 然后执行我们指定的类, 此处即为myorg.WordCount

p.s. hadoop脚本比较完整的分析可参见<Hadoop作业提交分析>.

有RunJar执行WordCount后, 就进入我们的程序了, 需要配置mapper, reducer以及输出输出路径等等, 最终通过执行job.waitForCompletion(true)向JobTracker提交这个作业.

到目前可知, 已经完成了本地执行部分, 如果这段时期发生ClassNotFoundException, 则可以在自己的脚本文件中配置$HADOOP_CLASSPATH, 包含需要的第三方jar文件, 再执行hadoop命令, 此为情况一.

二. JobTracker和TaskTracker如何获得第三方jar文件?

有时候提交job之后, 在map或者reduce函数中也会产生ClassNotFoundException. 这是因为map或reduce可能在其他机器上执行, 那些机器没有需要的jar文件, mapreduce作业交由JobTracker和TaskTracker执行, 两者如何获得第三方jar文件呢?  即为情况二.

我们首先来分析下mapreduce提交过程。

step 1.和2. 通过Job类提交作业,  获得一个作业号, 并根据conf决定作业时提交给LocalJobRunner还是JobTracker

step 3.  copy job resource

client将作业所需资源上传到hdfs上, 如job split, jar文件等.  JobClient通过configureCommandLineOptions函数处理jar文件, 该方法中通过job获得这些参数内容

files = job.get("tmpfiles"); // 对应参数项-files
libjars = job.get("tmpjars"); // 对应-libjars
archives = job.get("tmparchives"); // 对应-archives

如果jar文件有配置, 则将其加入到分布式缓存DistributedCache中, -libjars为例:

if (libjars != null) {
    FileSystem.mkdirs(fs, libjarsDir, mapredSysPerms);
    String[] libjarsArr = libjars.split(",");
    for (String tmpjars: libjarsArr) {
        Path tmp = new Path(tmpjars);
        Path newPath = copyRemoteFiles(fs, libjarsDir, tmp, job, replication);
        DistributedCache.addArchiveToClassPath(newPath, job);
    }
}

另外, 在mapreduce程序的配置中总是需要job.setJarByClass来指定运行的类,  如此hadoop就可以根据该class定位到所在的jar文件, 就是我们打包的jar, 将其上传到hdfs上. 到此jobClient完成了资源复制过程, 这些资源可供JobTracker和TaskTracker使用.

step4-10.   JobClient提交job并执行作业(JobTracker以及TaskTracker工作就不展开了, 详见<Map-Reduce过程解析>).

三.  总结

要想让mapreduce程序引用第三方jar文件, 可以采用如下方式:

  1. 通过命令行参数传递jar文件, 如-libjars等;

  2. 直接在conf中设置, 如conf.set(“tmpjars”,*.jar), jar文件用逗号隔开;

  3. 利用分布式缓存, 如DistributedCache.addArchiveToClassPath(path, job), 此处的path必须是hdfs, 即自己讲jar上传到hdfs上, 然后将路径加入到分布式缓存中;

  4. 第三方jar文件和自己的程序打包到一个jar文件中, 程序通过job.getJar()将获得整个文件并将其传至hdfs上. (很笨重)

  5. 在每台机器的$HADOOP_HOME/lib目录中加入jar文件. (不推荐)

p.s. 如果通过上面方法1.或2., 需要注意Configuration问题, 需要通过getConf()函数获得, 而不要自己new一个对象.

看完上述内容,你们对hadoop作业引用第三方jar文件的原理解析是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI