文档章节

hadoop作业引用第三方jar文件原理解析

超人学院
 超人学院
发布于 2015/03/12 16:07
字数 970
阅读 36
收藏 0
点赞 0
评论 0

在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一个对象.

© 著作权归作者所有

共有 人打赏支持
超人学院
粉丝 106
博文 335
码字总数 388917
作品 0
昌平
CTO(技术副总裁)
Hadoop作业引用第三方jar文件

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

Zero零_度
2015/10/29
0
0
ToolRunner与eclipse hadoop 插件的替代品,简化M/R程序的开发

目前开发的时候测试M/R程序有三种方式 1. 直接打成jar包,然后放到服务器中去执行。此方法步骤繁琐,每次都要打包上传。 2. 使用Hadoop的Ecilpse插件,但是对于N多的Hadoop版本总替换插件,是...

martin_li
2012/09/11
0
0
运行Hadoop作业时一处常见错误以及解决方法

1. 问题描述 当用户编写完Hadoop程序时,准备运行时,经常会抛出以下异常: [15:10:41,949][ INFO][main][org.apache.hadoop.mapred.JobClient:1330] – Task Id : attempt_201202281244_000...

混绅士
2014/12/30
0
0
一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

1:MapReduce的概述:   (1):MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.   (2):MapReduce由两个阶段组成:Map和Reduce,用户只需要...

别叫小伙
2017/09/18
0
0
MapReduce作业运行第三方配置文件的共享方法

其实MapReduce作业运行第三方配置文件的共享方法往小了说其实就是参数在MapReduce作业中的传递,往大了说其实就是DistributedCache的应用。 在MapReduce中传递参数普遍用Configuration,Con...

混绅士
2014/12/23
0
0
Apache Hadoop 2.4.1 命令参考

概述 所有的Hadoop命令都是通过bin/hadoop目录下的脚本所执行,在没有任何参数的情况下运行Hadoop脚本将打印该命令描述。 Usage:Hadoop [--config confdir] [COMMAND] [GENERIC_OPTIONS] [...

chapin
2014/09/20
0
0
将nutch源代码进行修改后,将项目和第三方jar包打成一个整体ar包的方法和感悟

打jar包的思路,参照上一篇资料《Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法》 之所以再做笔记是因为:我在打好jar包后,在Linux下运行 [root@nutch-five test]# java -...

hiqj
2014/09/01
0
0
spark-1.5.2集群安装

Spark版本:Spark1.5.2 Scala版本:2.11.7 Spark安装路径:/home/hadoop Scala安装路径:/home/hadoop 1. 解压安装包 [hadoop@hd1 ~]#tar zxvf scala-2.11.7.tgz [hadoop@hd1 ~]#tar zxvf s......

不语者
2016/11/03
14
0
hadoop 安装错误收集

[root@hadoop2 ~]# hadoop namenode -format DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. Error: Could not find or loa......

盖世英雄到来
2015/11/30
53
0
MapReduce工作的基本流程

Hadoop0.2之前版本和之后版本在Job中有很大的改进,本次采用的版本是Hadoop1.1.2版本。 现在作为作业驱动器,可以直接继承Configured以及实现Tool,这种方式可以很便捷的获取启动时候命令行中...

zhao_xiao_long
2013/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

代码生成利器:IDEA 强大的 Live Templates

代码生成利器:IDEA 强大的 Live Templates

qwfys
18分钟前
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
22分钟前
0
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
25分钟前
0
0
日常运维--rsync同步工具

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而...

chencheng-linux
29分钟前
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
41分钟前
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
0
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
0
0
rsync工具介绍/rsync通过ssh同步

rsync工具介绍 数据备份是必不可少,在Linux系统下数据备份的工具很多,其中重点介绍就是rsync工具,rsync不仅可以远程同步数据,还可以本地同步数据,且不会覆盖以前的数据在已经存在的数据...

Hi_Yolks
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部