java.lang.IllegalArgumentException:尝试将 ([custom-jar-with-spark-code].jar) 多次添加到分布式缓存
java.lang.IllegalArgumentException: Attempt to add ([custom-jar-with-spark-code].jar) multiple times to the distributed cache
我正尝试在 EMR 集群上使用 Oozie 运行 一个简单的 Java Spark 作业。该作业只是从输入路径获取文件,对其执行一些基本操作并将结果放在不同的输出路径中。
当我尝试使用如下所示的 spark-submit 从命令行 运行 它时,它工作正常:
spark-submit --class com.someClassName --master yarn --deploy-mode cluster /home/hadoop/some-local-path/my-jar-file.jar yarn s3n://input-path s3n://output-path
然后我在 Oozie 工作流程中设置了同样的东西。但是,当 运行 从那里开始时,作业总是失败。标准输出日志包含这一行:
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], main() threw exception, Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.
java.lang.IllegalArgumentException: Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.
我在 Whosebug 上发现了一个 KB note and another 处理类似错误的方法。但对他们来说,作业失败是由于内部 JAR 文件——而不是用户传递给 运行 的文件。尽管如此,我尝试了它的解决步骤来删除 share-lib 中 spark 和 oozie 之间常见的 jar 文件,并最终从“/user/oozie/share/lib/lib_*/spark”中删除了一些文件。不幸的是,这也没有解决问题。
关于如何调试这个问题有什么想法吗?
所以我们终于找到了问题 - 至少在我们的情况下。
使用 Hue 创建 Workflow 时,添加 Spark Action 时,默认提示 "File" 和 "Jar/py name"。我们在这些字段中分别提供了我们想要 运行 的 JAR 文件的路径和该 JAR 文件的名称,它创建了如下所示的基本操作:
它创建的最终XML如下:
<action name="spark-210e">
<spark xmlns="uri:oozie:spark-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<master>yarn</master>
<mode>cluster</mode>
<name>CleanseData</name>
<class>com.data.CleanseData</class>
<jar>JCleanseData.jar</jar>
<spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
<arg>yarn</arg>
<arg>[someArg1]</arg>
<arg>[someArg2]</arg>
<file>lib/JCleanseData.jar#JCleanseData.jar</file>
</spark>
<ok to="[nextAction]"/>
<error to="Kill"/>
</action>
其中的默认 file
标签导致了我们的问题。
因此,我们删除了它并将定义编辑为如下所示并且有效。请注意 <jar>
标签的变化。
<action name="spark-210e">
<spark xmlns="uri:oozie:spark-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<master>yarn</master>
<mode>cluster</mode>
<name>CleanseData</name>
<class>com.data.CleanseData</class>
<jar>hdfs://path/to/JCleanseData.jar</jar>
<spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
<arg>yarn</arg>
<arg>[someArg1]</arg>
<arg>[someArg1]</arg>
</spark>
<ok to="[nextAction]"/>
<error to="Kill"/>
</action>
PS:我们在 Hive 操作方面也遇到了类似的问题。我们应该通过 Hive 操作传递的 hive-site.xml
文件 - 它创建了一个 <job-xml>
标记 - 也导致了问题。所以我们删除了它并且它按预期工作。
我正尝试在 EMR 集群上使用 Oozie 运行 一个简单的 Java Spark 作业。该作业只是从输入路径获取文件,对其执行一些基本操作并将结果放在不同的输出路径中。
当我尝试使用如下所示的 spark-submit 从命令行 运行 它时,它工作正常:
spark-submit --class com.someClassName --master yarn --deploy-mode cluster /home/hadoop/some-local-path/my-jar-file.jar yarn s3n://input-path s3n://output-path
然后我在 Oozie 工作流程中设置了同样的东西。但是,当 运行 从那里开始时,作业总是失败。标准输出日志包含这一行:
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], main() threw exception, Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.
java.lang.IllegalArgumentException: Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.
我在 Whosebug 上发现了一个 KB note and another
关于如何调试这个问题有什么想法吗?
所以我们终于找到了问题 - 至少在我们的情况下。
使用 Hue 创建 Workflow 时,添加 Spark Action 时,默认提示 "File" 和 "Jar/py name"。我们在这些字段中分别提供了我们想要 运行 的 JAR 文件的路径和该 JAR 文件的名称,它创建了如下所示的基本操作:
它创建的最终XML如下:
<action name="spark-210e">
<spark xmlns="uri:oozie:spark-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<master>yarn</master>
<mode>cluster</mode>
<name>CleanseData</name>
<class>com.data.CleanseData</class>
<jar>JCleanseData.jar</jar>
<spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
<arg>yarn</arg>
<arg>[someArg1]</arg>
<arg>[someArg2]</arg>
<file>lib/JCleanseData.jar#JCleanseData.jar</file>
</spark>
<ok to="[nextAction]"/>
<error to="Kill"/>
</action>
其中的默认 file
标签导致了我们的问题。
因此,我们删除了它并将定义编辑为如下所示并且有效。请注意 <jar>
标签的变化。
<action name="spark-210e">
<spark xmlns="uri:oozie:spark-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<master>yarn</master>
<mode>cluster</mode>
<name>CleanseData</name>
<class>com.data.CleanseData</class>
<jar>hdfs://path/to/JCleanseData.jar</jar>
<spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
<arg>yarn</arg>
<arg>[someArg1]</arg>
<arg>[someArg1]</arg>
</spark>
<ok to="[nextAction]"/>
<error to="Kill"/>
</action>
PS:我们在 Hive 操作方面也遇到了类似的问题。我们应该通过 Hive 操作传递的 hive-site.xml
文件 - 它创建了一个 <job-xml>
标记 - 也导致了问题。所以我们删除了它并且它按预期工作。