【问题标题】:What is the difference between spark-submit and pyspark?spark-submit 和 pyspark 有什么区别?
【发布时间】:2014-12-30 20:23:06
【问题描述】:

如果我启动 pyspark 然后运行这个命令:

import my_script; spark = my_script.Sparker(sc); spark.collapse('./data/')

一切都还好。但是,如果我尝试通过命令行和 spark-submit 执行相同的操作,则会收到错误消息:

Command: /usr/local/spark/bin/spark-submit my_script.py collapse ./data/
  File "/usr/local/spark/python/pyspark/rdd.py", line 352, in func
    return f(iterator)
  File "/usr/local/spark/python/pyspark/rdd.py", line 1576, in combineLocally
    merger.mergeValues(iterator)
  File "/usr/local/spark/python/pyspark/shuffle.py", line 245, in mergeValues
    for k, v in iterator:
  File "/.../my_script.py", line 173, in _json_args_to_arr
    js = cls._json(line)
RuntimeError: uninitialized staticmethod object

我的脚本:

...
if __name__ == "__main__":
    args = sys.argv[1:]
    if args[0] == 'collapse':
        directory = args[1]
        from pyspark import SparkContext
        sc = SparkContext(appName="Collapse")
        spark = Sparker(sc)
        spark.collapse(directory)
        sc.stop()

为什么会这样?运行 pyspark 和运行 spark-submit 会导致这种分歧有什么区别?我怎样才能在 spark-submit 中完成这项工作?

编辑:我尝试通过 pyspark my_script.py collapse ./data/ 从 bash shell 运行它,但我得到了同样的错误。唯一一切正常的时候是我在 python shell 中并导入脚本。

【问题讨论】:

标签: python apache-spark pyspark


【解决方案1】:
  1. 如果你构建了一个spark应用,你需要使用spark-submit来运行应用

    • 代码可以用python/scala编写

    • 模式可以是本地/集群模式

  2. 如果你只是想测试/运行几个单独的命令,你可以使用 spark 提供的 shell

    • pyspark(用于 python 中的火花)
    • spark-shell(用于 scala 中的火花)

【讨论】:

  • pyspark 仅支持使用 Yarn 部署的集群模式。 Mesos 和 Standalone 不支持集群模式。
  • pyspark 文档说它也支持独立。如果我在这里遗漏了什么,请更正。
  • pyspark 支持在所谓的“本地模式”下独立运行,这意味着驱动程序在提交作业的机器上运行。不幸的是,只有 Yarn 支持 pyspark 的集群模式。
  • 哦,我明白了。干杯伙伴!
  • 老实说,Databricks 决定这种非同质的名称有点脏。他们可以命名为 spark-shell-python、spark-shell-scala 和 spark-shell-r !当我们想要配置 Jupyter 内核时,我们对 pyspark-shell 和 sparkr-shell 有同样不清楚的问题。许多开发人员在这些废话上浪费了很多时间......
【解决方案2】:

pyspark 命令是 REPL(读取-评估-打印循环),用于启动交互式 shell 以测试一些 PySpark 命令。这在开发期间使用。我们在这里讨论的是 Python。

要在集群或本地运行用 Scala 或 Python 编写的 spark 应用程序,您可以使用 spark-submit。

【讨论】:

    【解决方案3】:

    spark-submit 是一个实用程序,用于将您的 spark 程序(或作业)提交到 Spark 集群。如果您打开 spark-submit 实用程序,它最终会调用 Scala program

    org.apache.spark.deploy.SparkSubmit 
    

    另一方面,pysparkspark-shell 是 REPL(read–eval–print loop ) 实用程序,它允许开发人员在编写时运行/执行他们的 spark 代码,并且可以即时评估。

    最终,他们俩都在后台运行,如果您使用以下命令,大多数选项都是相同的

    spark-submit --help
    pyspark --help
    spark-shell --help
    

    spark-submit 有一些额外的选项可以将您的 spark 程序(scala 或 python)作为包(python 的 jar/zip)或单独的 .py 或 .class 文件。

    spark-submit --help
    Usage: spark-submit [options] <app jar | python file | R file> [app arguments]
    Usage: spark-submit --kill [submission ID] --master [spark://...]
    Usage: spark-submit --status [submission ID] --master [spark://...]
    

    他们都提供了一个 WebUI 来跟踪 Spark Job 的进度和其他指标。

    当您使用 Ctrl+c 终止您的 spark-shell(pyspark 或 spark-shell)时,您的 spark 会话被终止,WebUI 无法再显示详细信息。

    如果您查看 spark-shell,它还有一个附加选项可以使用 -I 逐行运行脚本

    Scala REPL options:
      -I <file>                   preload <file>, enforcing line-by-line interpretation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2017-04-05
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多