千家信息网

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

发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,今天就跟大家聊聊有关hadoop作业引用第三方jar文件的原理解析是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在eclipse中写m
千家信息网最后更新 2024年10月02日hadoop作业引用第三方jar文件的原理解析是怎样的

今天就跟大家聊聊有关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脚本比较完整的分析可参见.

有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"); // 对应参数项-fileslibjars = job.get("tmpjars"); // 对应-libjarsarchives = 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工作就不展开了, 详见).

三. 总结

要想让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文件的原理解析是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

文件 作业 第三方 程序 参数 命令 配置 脚本 内容 函数 分布式 情况 机器 缓存 资源 路径 原理 插件 方式 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 海康平台服务器端口号 软件开发与项目管理方向 天津免费客户管理软件开发 券商服务器崩溃造成的损失 眉县服务器 课程设计数据库网吧计时管理 服务器安全日志里面的问题 关闭服务器出现一个锁 网络安全信息安全数据安全 用什么软件打开数据库文件 文明城市网络安全宣传 阿里巴巴在上饶市建数据库 计算机网络技术论文致谢文案 服务器上挂起的安全会话过多 苹果mac系统软件开发 数据库实体文件上有一把锁 数据库id的随机生成 三维力控中心数据库 阿里云服务器还需要买实例吗 上海市同森网络技术有限公司 未来科技城互联网公司有哪些 易语言往服务器传文件 帝国神话有多少个服务器 镇海ios软件开发 红楼梦视频软件开发 网络安全实训报告1500字通用 注册jsp代码涉及数据库 安信网络安全供应商 网络安全培训班结业讲话 山东公安网络安全招聘
0