Spark Submit

在实际工作中,我们编写完一个 Spark 程序后,能够用 Submit 的方式提交给 Spark 执行。spark-submit 是 Spark 提供的用于提交和运行 Spark 应用程序的命令行工具。我们下面来练习这种方式。

首先我们新建一个 Python 文件,在里面把代码都写好。然后呢,我们在 Terminal 里执行spark-submit,将它提交给 Spark。Spark 就完成代码中的工作。

比如我们新建了一个文件 example.py,输入以下内容

        from pyspark.sql import SparkSession

        # 创建 SparkSession
        spark = SparkSession.builder.appName("example").getOrCreate()

        # 创建一个 DataFrame
        data = [("Alice", 1), ("Bob", 2), ("Cathy", 3)]
        df = spark.createDataFrame(data, ["Name", "Value"])

        # 显示 DataFrame
        df.show()

        # 停止 SparkSession
        spark.stop()

我们然后在 Terminal 中输入命令 spark-submit example.py。这时,屏幕上会打印出很多内容。注意观察,其中出现了下述程序运行的结果

+—–+—–+ | Name|Value| +—–+—–+ |Alice| 1| | Bob| 2| |Cathy| 3| +—–+—–+

配置和选项

Submit 时,我们可以写一些配置。例如:

–master:指定集群的 URL 或者使用 local 来在本地运行。 –deploy-mode:指定是 cluster 模式还是 client 模式。 –conf:设置额外的 Spark 配置参数。

spark-submit –master local[2] example.py

这个命令指定在本地运行,并使用 2 个核心。

Word Count 示例

我们下面再看一个单词计数的示例

from pyspark import SparkContext
from operator import add

sentence = "MapReduce Map Reduce Mapper Reducer MapReduce"
data = sentence.split()
# create a new instance of Spark pipeline
sc = SparkContext()
# Turning off info messages being displayed in spark control
sc.setLogLevel("OFF")
word_count = sc.parallelize(data, 128) \
                .map(lambda word: (word, 1)) \
                .reduceByKey(add) \
                .sortByKey(True) \
                .collect()
print(word_count)
sc.stop()

这个程序就是一个 RDD 的程序。它首先用 parallelize 读入单词列表,然后将每个单词都 Map 为一个键值对(Word,1),然后对单词做 GroupbyKey 后,再做 add (加法)的 Reduce 操作,最后用 sortByKey 对结果进行排序,最后 collect 得到输出。

我们提交了命令后,大家观察屏幕上的输出:它会提交到 Spark的集群上,然后开始调各种资源,启动各种服务,干了一堆事。因此,当我们的数据量很大的时候,它就会在成百上千台机器上开始并行地工作。这就是 Spark 的工作过程。


Index Previous Next