整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

5.5.1 打包作业

hadoop 小红牛 7℃ 0评论

本地作业运行器使用单JVM运行一个作业,只要作业需要的所有类都在类路径(classpath)上,那么作业就可以正常执行。

在分布式的环境中,情况稍微复杂一些。开始的时候作业的类必须打包进作业的JAR文件中并发送给集群。Hadoop通过搜索驱动程序的类路径自动找到作业的JAR文件,该类路径包含了]obConf]ob上的set]arByClass方法中设置的类。另一种方法,如果你想通过文件路径设置一个指定的JAR文件,可以使用setJar〇方法。

通过使用像AntMaven的工具可以方便地创建作业的JAR文件。例如下面的Maven命令将在包含所有已编译的类的工程目录中创建一个名为hadoop-examples.jar3AR文件:

%mvn package -DskipTests

如果每个JAR文件都有一个作业,可以在JAR文件的manifest中指定要运行的main类。如果main类不在manifest中,则必须在命令行指定(见下 文)》任何非独立的JAR文件应该打包到JAR文件的子目录中。当然也有其他的方法将依赖包含进来,这我们稍后会讨论。类似地,资源文件也可以打包进类的子目录。这与Javaarc/j/_veWAR文件类似,只不过JAR文件是放在fT£5-/A^//沁子目录下WAR文件中的。

1.客户端的类路径

hgdoop jar <jar>设置的用户客户端类路径包括以下几个组成部分:

•作业的JAR文件

•作业JAR文件的//fc目录中的所有JAR文件以及类目录(如果定义)

HADOOP_CLASSPH定义的类路径(如果已经设置)

顺便说一下,这解释了如果你在没有作业〗AR(hadoopCLASSNAME)情况下使用本地作业运行器时,为什么你必须设置HADOOP_CLASSPATH来指明依赖类和库。

 

2.任务的类路径

在集群上(包括伪分布式模式),mapreduce任务在各自的JVM上运行,它们的类路径不受HADOOP_CLASSPATH控制。HADOOP_CLASSPATH是一项

客户端设置,并只针对驱动程序的JVM的类路径进行设置。

反之,用户任务的类路径有以下几个部分组成:

•作业的JAR文件

作业JAR文件的/A目录中包含的所有JAR文件以及类目录(如果

定义)

•使用-libjars选项(参阅表5-1)Distr^butedCacheaddFileToClassPath()方法(老版本的API)hb(新版本沾API)添加到分布式缓存的所有

文件

3.打包依赖

给定这些不同的方法来控制客户端和类路径上的内容,也有相应的操作处理作业的库依赖:

•将库解包和重新打包到作业的JAR•对作业的JAR的目录中的库打包

•保持库与作业的JAR分开,并且通过HADOOPJILASSPATH将它们添加到客户端的类路径,通过-libjars将它们添加到任务的类路径

从创建的角度来看,最后使用分布式缓存的选项是最简单的,因为依赖不需要在作业的JAR中重新创建。同时,分布式缓存意味着在集群上更少的JAR文件转移,因为文件可能缓存在任务间的一个节点上了。详情可参见8.4.2节。

4.任务类路径的优先权

用户的JAR文件被添加到客户端类路径和任务类路径的最后,如果Hadoop使用的库版本和你的代码使用的不同或不相容,在某些情况下可能会引发和Hadoop内置库的依赖冲突。有时需要控制任务类路径的次序,这样你的类能够被先提取出来。在客户端,可以通过设置环境变量HADOOPUSER_CLASSPATH_FIRSTtrue强制使Hadoop将用户的类路径优先放到捜索顺序对于任务的类路径,你可以将mapreduce.task.classpath.first设为true。注意,设置这些选项就改变了针对Hadoop框架依赖的类(但仅仅对你的作业而

 

),这可能会引起作业的提交失败或者任务失败,因此请谨慎使用这些选项。

转载请注明:全栈大数据 » 5.5.1 打包作业

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址