【问题标题】:pyspark: ship jar dependency with spark-submitpyspark:使用 spark-submit 发送 jar 依赖项
【发布时间】:2015-06-08 14:48:11
【问题描述】:

我写了一个pyspark脚本,它读取两个json文件,coGroup它们并将结果发送到一个elasticsearch集群;当我在本地运行它时,一切都按预期工作(大部分),我下载了org.elasticsearch.hadoop.mr.EsOutputFormatorg.elasticsearch.hadoop.mr.LinkedMapWritable 类的elasticsearch-hadoop jar 文件,然后使用--jars 参数使用pyspark 运行我的工作,我可以看到出现在我的 elasticsearch 集群中的文档。

但是,当我尝试在 spark 集群上运行它时,我收到了这个错误:

Traceback (most recent call last):
  File "/root/spark/spark_test.py", line 141, in <module>
    conf=es_write_conf
  File "/root/spark/python/pyspark/rdd.py", line 1302, in saveAsNewAPIHadoopFile
    keyConverter, valueConverter, jconf)
  File "/root/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__
  File "/root/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.saveAsNewAPIHadoopFile.
: java.lang.ClassNotFoundException: org.elasticsearch.hadoop.mr.LinkedMapWritable
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:157)
    at org.apache.spark.api.python.PythonRDD$$anonfun$getKeyValueTypes$1$$anonfun$apply$9.apply(PythonRDD.scala:611)
    at org.apache.spark.api.python.PythonRDD$$anonfun$getKeyValueTypes$1$$anonfun$apply$9.apply(PythonRDD.scala:610)
    at scala.Option.map(Option.scala:145)
    at org.apache.spark.api.python.PythonRDD$$anonfun$getKeyValueTypes$1.apply(PythonRDD.scala:610)
    at org.apache.spark.api.python.PythonRDD$$anonfun$getKeyValueTypes$1.apply(PythonRDD.scala:609)
    at scala.Option.flatMap(Option.scala:170)
    at org.apache.spark.api.python.PythonRDD$.getKeyValueTypes(PythonRDD.scala:609)
    at org.apache.spark.api.python.PythonRDD$.saveAsNewAPIHadoopFile(PythonRDD.scala:701)
    at org.apache.spark.api.python.PythonRDD.saveAsNewAPIHadoopFile(PythonRDD.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
    at py4j.Gateway.invoke(Gateway.java:259)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:207)
    at java.lang.Thread.run(Thread.java:745)

这对我来说似乎很清楚:elasticsearch-hadoop jar 不适用于工人;所以问题是:我如何将它与我的应用程序一起发送?我可以将sc.addPyFile 用于python 依赖项,但它不适用于jar,并且使用spark-submit--jars 参数也无济于事。

【问题讨论】:

    标签: python elasticsearch apache-spark pyspark


    【解决方案1】:

    --jars 可以正常工作;问题是我首先如何运行spark-submit 作业;正确的执行方式是:

    ./bin/spark-submit <options> scriptname
    

    因此--jars 选项必须放在脚本之前:

    ./bin/spark-submit --jars /path/to/my.jar myscript.py
    

    如果您认为这是将参数传递给脚本本身的唯一方法,这很明显,因为脚本名称之后的所有内容都将用作脚本的输入参数:

    ./bin/spark-submit --jars /path/to/my.jar myscript.py --do-magic=true
    

    【讨论】:

    • 如果不想使用 spark-submit 而是想要一个更具交互性的会话,例如 IDE 或笔记本中的交互式 shell,如何包含 jar?
    • 嗨@trianta2 pyspark 命令也支持--jars,并且会为你打开一个交互式shell,所以./bin/pyspark --jars elasticsearch-hadoop-2.1.0.Beta3.jar 可以正常工作
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2020-05-08
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2020-06-10
    相关资源
    最近更新 更多