spark-submit和pyspark有什么区别?

时间:2014-11-04 02:30:15

标签: python apache-spark pyspark

如果我启动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

my_script:

...
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中并导入脚本。

4 个答案:

答案 0 :(得分:13)

  1. 如果您构建了一个spark应用程序,则需要使用 spark-submit 来运行该应用程序

    • 代码可以用python / scala

    • 编写
    • 模式可以是local / cluster

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

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

答案 1 :(得分:1)

pyspark-submit将您的代码发送给集群中的工作人员执行。

检查:http://spark.apache.org/docs/latest/submitting-applications.html

答案 2 :(得分:0)

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

org.apache.spark.deploy.SparkSubmit 

另一方面, pyspark spark-shell 是REPL( read-eval-print loop )实用程序,它使开发人员可以在编写代码时运行/执行其火花代码,并且可以即时进行评估。

最终,他们两个都在后台运行作业,如果使用以下命令,则大多数选项都相同

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

答案 3 :(得分:0)

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

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