是否可以在HDInsight中运行一个JAR文件,其中包括lib文件夹下的另一个JAR文件?
JAR文件├/folder1/subfolder1/myApp/…││class文件||lib/dependency.jar//库(jar文件)
谢谢!
在HDInsight上,我们应该能够运行Java MapReduce JAR,它依赖于另一个JAR。有几种方法可以做到这一点,但通常不是通过复制头节点上lib文件夹下的第二个JAR。原因是—根据依赖项的位置,您可能需要将JAR复制到所有工作节点和头节点的lib文件夹下—这是一项繁琐的任务。此外,当节点被Azure重新映像时,此更改将被擦除,因此不支持这种方式。
现在,有两种类型的依赖关系-1. MapReduce驱动类依赖于另一个外部JAR2. Map或reduce任务依赖于另一个JAR,其中Map或reduce函数调用外部JAR上的API。
场景#1 (MapReduce驱动类依赖于另一个JAR):我们可以使用以下选项之一-。将依赖JAR复制到头节点上的本地文件夹(如windows HDI上的d:test),然后使用RDP将此路径附加到头节点上的HADOOP_CLASSPATH环境变量-这适用于dev/test直接从头节点运行作业,但不适用于远程作业提交。因此,这并不适合生产场景。
b。使用"fat或uber jar"来包含jar中的所有依赖jar -你可以使用Maven的"Shade"插件,示例如下
场景#2(映射或减少外部JAR上的函数调用API) -基本使用- libjar选项。
- 如果您想从Hadoop命令行运行mapreduce JAR -a.将Mapreduce JAR复制到本地路径(如d:test)b.将依赖JAR复制到WASB 上
使用依赖关系运行mapreduce JAR的示例-
hadoop jar D:TestBlobCount-0.0.1-SNAPSHOT.jar css.ms.BlobCount.BlobCounter -libjars wasb://mycontainername@azimwasb.blob.core.windows.net/mrdata/jars/microsoft-windowsazure-storage-sdk-0.6.0.jar -DStorageAccount=%StorageAccount% -DStorageKey=%StorageKey% -DContainer=%Container%/mcdpoc/mrinput/mcdpoc/mroutput
这个例子使用的是HDInsight窗口——你也可以在HDInsight Linux上使用类似的方法。
- 使用PowerShell或。net SDK(远程作业提交)-使用PowerShell,您可以使用-LibJars参数来引用依赖的jar。您可以查看以下文档,这些文档有使用powerShell, SSH等的各种示例。https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-mapreduce/ https://azure.microsoft.com/en-us/documentation/articles/hdinsight-use-mapreduce/
我希望它有帮助!
谢谢,Azim