使用火花动作在 Oozie 中的 python Spark 作业
Posted
技术标签:
【中文标题】使用火花动作在 Oozie 中的 python Spark 作业【英文标题】:python Spark job in Oozie using spark action 【发布时间】:2015-09-18 08:37:46 【问题描述】:我一直在尝试在 spark(1.3.1.2.3) 中运行 python 脚本,并且我正在使用 oozie 来安排 spark 作业。我有一个使用 Ambari 2.1.1 安装的运行 HDP 2.3 的 3 节点集群。
执行作业时遇到以下错误..
>>> Invoking Main class now >>>
Fetching child yarn jobs
tag id : oozie-9d5f396daac34b4a41fed946fac0472
Child yarn jobs are found -
Spark Action Main class : org.apache.spark.deploy.SparkSubmit
Oozie Spark action configuration
=================================================================
--master
yarn-client
--deploy-mode
client
--name
boxplot outlier
--class
/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py
--executor-memory
1G
--driver-memory
1G
--executor-cores
4
--num-executors
2
--conf
spark.yarn.queue=default
--verbose
/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py
=================================================================
>>> Invoking Spark class now >>>
Traceback (most recent call last):
File "/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py", line 129, in <module>
main()
File "/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py", line 60, in main
sc = SparkContext(conf=conf)
File "/hadoop/yarn/local/filecache/1314/spark-core_2.10-1.1.0.jar/pyspark/context.py", line 107, in __init__
File "/hadoop/yarn/local/filecache/1314/spark-core_2.10-1.1.0.jar/pyspark/context.py", line 155, in _do_init
File "/hadoop/yarn/local/filecache/1314/spark-core_2.10-1.1.0.jar/pyspark/context.py", line 201, in _initialize_context
File "/hadoop/yarn/local/filecache/1314/spark-core_2.10-1.1.0.jar/py4j/java_gateway.py", line 701, in __call__
File "/hadoop/yarn/local/filecache/1314/spark-core_2.10-1.1.0.jar/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:895)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:665)
at java.lang.ClassLoader.defineClass(ClassLoader.java:758)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.jetty.servlet.ServletContextHandler.<init>(ServletContextHandler.java:136)
at org.eclipse.jetty.servlet.ServletContextHandler.<init>(ServletContextHandler.java:129)
at org.eclipse.jetty.servlet.ServletContextHandler.<init>(ServletContextHandler.java:98)
at org.apache.spark.ui.JettyUtils$.createServletHandler(JettyUtils.scala:98)
at org.apache.spark.ui.JettyUtils$.createServletHandler(JettyUtils.scala:89)
at org.apache.spark.ui.WebUI.attachPage(WebUI.scala:67)
at org.apache.spark.ui.WebUI$$anonfun$attachTab$1.apply(WebUI.scala:60)
at org.apache.spark.ui.WebUI$$anonfun$attachTab$1.apply(WebUI.scala:60)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at org.apache.spark.ui.WebUI.attachTab(WebUI.scala:60)
at org.apache.spark.ui.SparkUI.initialize(SparkUI.scala:66)
at org.apache.spark.ui.SparkUI.<init>(SparkUI.scala:60)
at org.apache.spark.ui.SparkUI.<init>(SparkUI.scala:42)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:223)
at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:53)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:234)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
at py4j.Gateway.invoke(Gateway.java:214)
at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:79)
at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:68)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Thread.java:745)
Intercepting System.exit(1)
<<< Invocation of Main class completed <<<
这是我的 workflow.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns='uri:oozie:workflow:0.4' name='sparkjob'>
<start to='spark-process' />
<action name='spark-process'>
<spark xmlns='uri:oozie:spark-action:0.1'>
<job-tracker>$jobTracker</job-tracker>
<name-node>$nameNode</name-node>
<configuration>
<property>
<name>oozie.launcher.mapred.job.queue.name</name>
<value>launcher2</value>
</property>
<property>
<name>oozie.service.SparkConfigurationService.spark.configurations</name>
<value>spark.eventLog.dir=hdfs://node1.analytics.tardis:8020/user/spark/applicationHistory,spark.yarn.historyServer.address=http://node1.analytics.tardis:18088,spark.eventLog.enabled=true</value>
</property>
</configuration>
<master>yarn-client</master>
<mode>client</mode>
<name>boxplot outlier</name>
<class>/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py</class>
<jar>/usr/hdp/current/spark-client/AnalyticsJar/boxplot_outlier.py</jar>
<spark-opts>--executor-memory 1G --driver-memory 1G --executor-cores 4 --num-executors 2 --conf spark.yarn.queue=default</spark-opts>
</spark>
<ok to='end'/>
<error to='spark-fail'/>
</action>
<kill name='spark-fail'>
<message>Spark job failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message>
</kill>
<end name='end' />
</workflow-app>
从最初的搜索来看,似乎是因为在打包包含用于运行 spark 作业的代码的 jar 文件时存在冲突的依赖关系而弹出错误。 python 脚本 boxplot_outlier.py 不会导入任何可能导致此类冲突的依赖项。
需要一些指导!任何建议将不胜感激。
编辑:我检查了 Oozie Java/Map-Reduce/Pig 动作启动器作业配置的 Classpath 元素,它包括以下两个 jars
/hadoop/yarn/local/usercache/ambari-qa/appcache/application_1441804290161_0903/container_e03_1441804290161_0903_01_000002/mr-framework/hadoop/share/hadoop/common/lib/servlet-api-2.5.jar
/hadoop/yarn/local/usercache/ambari-qa/appcache/application_1441804290161_0903/container_e03_1441804290161_0903_01_000002/javax.servlet-3.0.0.v201112011016.jar
从SPARK-1693 的讨论看来,这两个jar 可能会导致这种依赖冲突。尽管该问题已在 1.1.0 版本身中得到解决。 hadoop 2.7 的依赖项可能存在问题,或者我可能缺少一些配置。任何帮助将不胜感激
【问题讨论】:
【参考方案1】:终于解决了。结果表明,从 hdfs 中的 oozie sharelib spark 目录中删除 javax.servlet-3.0.0.v201112011016.jar 可以缓解该问题。我不确定这是否是解决问题的正确方法,以及这是否是 HDP 2.3.0 发行版的配置问题。将报告给 HDP 人员进行进一步调查。
【讨论】:
【参考方案2】:在 Cloudera CDH 5.5.2 上也看到了同样的问题。 我找不到任何关于这是一个已知问题的参考。 从 sharelib 中删除似乎是一个大技巧。
为了测试这个理论,从 sharelib 中删除 javax.servlet-3.0.0.v201112011016.jar 并执行 sharelibupdate(否则 Oozie 说文件丢失),将 javax.servlet-api-3.1.0.jar 添加到我的自己的自定义 oozie.libpath (也可以在 sharelib 中,但不想这样做)并且问题消失了。一定有别的办法。
不过也在这里分享,以防万一。
【讨论】:
以上是关于使用火花动作在 Oozie 中的 python Spark 作业的主要内容,如果未能解决你的问题,请参考以下文章