我需要创建一个使用mahout和一堆其他库的hadoop作业jar文件。我需要能够运行该作业而无需额外的jar.files,以便所有引用的类与生成的jar文件打包在一起。怎么办呢?
答案 0 :(得分:2)
配置构建文件以将所有引用的类复制到构建目录。例如,在ant
:
<path id="classpathunjar">
<fileset dir="${lib.dir}" includes="*.jar" excludes="sqljdbc4.jar"/>
</path>
<target name="compile" depends="clean">
...
<unjar dest="${build.dir}">
<path refid="classpathunjar" />
</unjar>
...
</target>
但如果你能做到这一点,那就更好了。如果您要在hadoop集群上运行mapreduce作业,请使用libjars
功能将jar加载到所有节点中
答案 1 :(得分:2)
Hadoop能够读取jar中的jar。修改Ant脚本以将所有依赖关系jar包含在名为lib的文件夹中,并将此lib文件夹添加到输出Jar。如果你有更多的大罐子,这有时是一个更好的选择,因为它会减少你的罐子的构建时间。
有关使用带有hadoop的第三方库的许多选项,请参阅此文章
答案 2 :(得分:1)
Jar
只是一个Zip
容器。
您可以使用所需的类手动解压缩和修改Jar
文件,也可以使用jar-with-dependencies构建系统的Maven描述符。
答案 3 :(得分:1)
在一般意义上,它有时是不可能的,因为JAR文件具有必须位于特定位置的资源,并且两个冲突但必要的资源可能会阻止组合(Think META-INF / MANIFEST.MF)
然而,在许多情况下,这很容易。基本上你解压缩要添加的JAR文件(它是一个zip文件格式)并“添加”类和什么不是现有的JAR文件。
如果要创建可执行JAR文件,更好的选择是在启动MANIFEST.MF中添加ClassPath条目,并将两个JAR文件发送到与添加的ClassPath条目兼容的目录结构中。
答案 4 :(得分:1)
请注意,额外的jar必须放在lib /子目录下(是的,jar中的jar)。我使用以下maven程序集,我在其他地方找到了它。
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>job</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<outputDirectory>lib</outputDirectory>
<excludes>
<exclude>org.apache.hadoop:hadoop-core</exclude>
<exclude>${artifact.groupId}:${artifact.artifactId}</exclude>
</excludes>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<scope>system</scope>
<outputDirectory>lib</outputDirectory>
<excludes>
<exclude>${artifact.groupId}:${artifact.artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${basedir}/target/classes</directory>
<outputDirectory>/</outputDirectory>
<excludes>
<exclude>*.jar</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>