3.4 Spark 应用程序
让我们来了解 Spark Shell 和 Spark 应用程序之间的区别,以及如何创建和提交它们。
3.4.1 Spark Shell 和 Spark 应用程序
Spark 让你可以通过一个简单的、专门用于执行 Scala、Python、R 和 SQL 代码的 Spark shell 访问数据集。用户探索数据并不需要创建一个完整的应用程序。他们可以用命令开始探索数据,这些命令以后可以转换为程序。这种方式提供了更高的开发生产效率。Spark 应用程序则是使用 spark-submit 命令提交的带有 SparkContext 的完整程序。
Scala 程序通常使用 Scala IDE 或 IntelliJ IDEA 编写,并用 SBT 进行编译。Java 程序通常在 Eclipse 中编写,用 Maven 进行编译。Python 和 R 程序可以在任何文本编辑器中编写,也可以使用 Eclipse 等 IDE。一旦编写好 Scala 和 Java 程序,它们会被编译并用 spark-submit 命令执行,如下所示。由于 Python 和 R 是解释型语言,它们是使用 spark-submit 命令直接执行的。因为 Spark 2.0 是用 scala 2.11 构建的,因此,用 Scala 构建 Spark 应用程序就需要用到 scala 2.11。
3.4.2 创建 Spark 环境
任何 Spark 程序的起点都是创建一个 Spark 环境,它提供了一个到 Spark API 的入口。要设置配置属性,需要把一个 SparkConf 对象传递到 SparkContext,如下面的 Python 代码所示:
3.4.3 SparkConf
SparkConf 是 Spark 中的主要配置机制,创建新的 SparkContext 时需要一个它的实例。SparkConf 实例包含的是一些字符串的键/值对,对应了用户需要覆盖默认值的那些配置选项。SparkConf 设置可以被硬编码到应用程序代码中,从命令行传递,或从配置文件传递,如以下代码所示:
与具体应用程序相关联的那个 SparkConf 一旦传递给了 SparkContext 构造函数,它就是不可变的。这意味着所有配置的决定必须在实例化 SparkContext 之前做出。
3.4.4 SparkSubmit
spark-submit 脚本用于在具有任何集群资源管理器的集群上启动 Spark 应用程序。
SparkSubmit 允许动态设置配置,然后在应用程序启动时(当构建新的 SparkConf 时)注入到环境中。如果使用 SparkSubmit,用户的应用程序可以只构造一个“空”的 SparkConf,并将其直接传递给 SparkContext 构造函数。SparkSubmit 工具为最常见的 Spark 配置参数提供了内置标志(flag),还提供了一个通用的 --conf 标志,它可以接受任何 Spark 配置值,如下所示:
在有多个配置参数的情况下,可以将它们全部放在一个文件中,并利用 --properties-file 参数把该文件传递给应用程序:
--jars 选项里包含的应用程序依赖 JAR 包会自动发送到工作机节点。对于 Python 而言,等效的 --py-files 选项可用于将 .egg、.zip 和 .py 库分发到执行进程。注意,这些 JAR 包和库文件会被复制到执行进程节点上每个 SparkContext 的工作目录中。在创建 JAR 包时,最好把所有代码依赖都添加到一个 JAR 包里。这可以在 Maven 或 SBT 中轻松完成。
要获取 spark-submit 的完整选项列表,请使用以下命令:
3.4.5 Spark 配置项的优先顺序
Spark 配置优先顺序,从高到低,如下所示:
(1)在用户代码中用 SparkConf 对象上的 set() 函数显式声明的配置。
(2)传递给 spark-submit 或 spark-shell 的标志。
(3)在 spark-defaults.conf 属性文件中的值。
(4)Spark 的默认值。
3.4.6 重要的应用程序配置
用于提交应用程序的一些重要配置参数如下表所示: