在 Mesos 上运行 Spark
- 安全
- 工作原理
- 安装 Mesos
- 将 Spark 连接到 Mesos
- Mesos 运行模式
- Mesos Docker 支持
- 与 Hadoop 一起运行
- 使用 Mesos 进行动态资源分配
- 配置
- 问题排查和调试
注意: 从 Apache Spark 3.2.0 开始,Apache Mesos 支持已被弃用。它将在未来的版本中删除。
Spark 可以在由 Apache Mesos 管理的硬件集群上运行。
使用 Mesos 部署 Spark 的优势包括
- Spark 和其他 框架 之间的动态分区
- 多个 Spark 实例之间的可扩展分区
安全
默认情况下,安全功能(如身份验证)未启用。在部署开放给互联网或不受信任网络的集群时,务必保护对集群的访问,以防止未经授权的应用程序在集群上运行。在运行 Spark 之前,请参阅Spark 安全和本文档中的特定安全部分。
工作原理
在独立集群部署中,下图中的集群管理器是一个 Spark master 实例。使用 Mesos 时,Mesos master 将取代 Spark master 作为集群管理器。
现在,当驱动程序创建一个作业并开始发布任务以进行调度时,Mesos 会确定哪些机器处理哪些任务。因为它在调度这些许多短生存期任务时考虑了其他框架,所以多个框架可以在同一集群上共存,而无需诉诸资源的静态分区。
要开始使用,请按照以下步骤安装 Mesos 并通过 Mesos 部署 Spark 作业。
安装 Mesos
Spark 3.5.5 旨在与 Mesos 1.0.0 或更高版本一起使用,并且不需要任何特殊的 Mesos 补丁。基于文件和环境变量的密钥支持需要 Mesos 1.3.0 或更高版本。
如果已经运行了一个 Mesos 集群,则可以跳过此 Mesos 安装步骤。
否则,为 Spark 安装 Mesos 与为其他框架安装 Mesos 没什么不同。您可以从源代码或使用预构建的软件包安装 Mesos。
从源码安装
要从源代码安装 Apache Mesos,请按照以下步骤操作
注意: 如果您想在不将其安装到系统上的默认路径中的情况下运行 Mesos(例如,如果您缺少安装它的管理权限),请将 --prefix
选项传递给 configure
,以告诉它安装到哪里。例如,传递 --prefix=/home/me/mesos
。默认情况下,前缀是 /usr/local
。
第三方软件包
Apache Mesos 项目仅发布源代码版本,不发布二进制包。但是其他第三方项目发布二进制版本,这可能有助于设置 Mesos。
其中之一是 Mesosphere。要使用 Mesosphere 提供的二进制版本安装 Mesos
- 从 下载页面 下载 Mesos 安装包
- 按照他们的说明进行安装和配置
Mesosphere 安装文档建议设置 ZooKeeper 以处理 Mesos master 故障转移,但是 Mesos 也可以在没有 ZooKeeper 的情况下使用单个 master 运行。
验证
要验证 Mesos 集群是否已准备好用于 Spark,请导航至端口 :5050
处的 Mesos master webui。确认所有预期的机器都存在于代理选项卡中。
将 Spark 连接到 Mesos
要从 Spark 使用 Mesos,您需要一个 Spark 二进制包,该包位于 Mesos 可以访问的位置,并且需要配置一个 Spark 驱动程序程序以连接到 Mesos。
或者,您也可以在所有 Mesos 代理中的相同位置安装 Spark,并将 spark.mesos.executor.home
(默认为 SPARK_HOME)配置为指向该位置。
向 Mesos 验证身份
当启用 Mesos 框架身份验证时,必须提供一个 principal 和 secret,Spark 才能通过它们向 Mesos 验证身份。 每个 Spark 作业都将注册为 Mesos 的一个单独的框架。
根据您的部署环境,您可能希望创建一组在所有用户之间共享的框架凭据,或者为每个用户创建框架凭据。 创建和管理框架凭据应遵循 Mesos 身份验证文档。
可以根据您的部署环境和安全要求,以多种方式指定框架凭据。 最简单的方法是直接在 Spark 配置中指定 spark.mesos.principal
和 spark.mesos.secret
值。 或者,您可以通过指定 spark.mesos.principal.file
和 spark.mesos.secret.file
来间接指定这些值,这些设置指向包含 principal 和 secret 的文件。 这些文件必须是 UTF-8 编码的纯文本文件。 结合适当的文件所有权和模式/ACL,这提供了一种更安全的方式来指定这些凭据。
此外,如果您喜欢使用环境变量,则可以通过环境变量指定以上所有内容,环境变量名称只是配置设置大写,并将 .
替换为 _
,例如 SPARK_MESOS_PRINCIPAL
。
凭据规范优先级
请注意,如果您指定多种获取凭据的方式,则以下优先级适用。 Spark 将使用找到的第一个有效值,并忽略任何后续值
spark.mesos.principal
配置设置SPARK_MESOS_PRINCIPAL
环境变量spark.mesos.principal.file
配置设置SPARK_MESOS_PRINCIPAL_FILE
环境变量
secret 应用了等效的顺序。 从本质上讲,我们更希望直接指定配置,而不是通过文件间接指定配置,并且我们更喜欢使用配置设置而不是环境变量。
部署到在安全套接字上运行的 Mesos
如果要将 Spark 应用程序部署到以安全模式运行的 Mesos 集群中,则需要设置一些环境变量。
LIBPROCESS_SSL_ENABLED=true
启用 SSL 通信LIBPROCESS_SSL_VERIFY_CERT=false
验证 ssl 证书LIBPROCESS_SSL_KEY_FILE=pathToKeyFile.key
密钥的路径LIBPROCESS_SSL_CERT_FILE=pathToCRTFile.crt
要使用的证书文件
所有选项都可以在 http://mesos.apache.org/documentation/latest/ssl/ 找到
然后按照下面客户端模式或集群模式中的描述进行提交
上传 Spark 包
当 Mesos 首次在 Mesos 代理上运行任务时,该代理必须具有 Spark 二进制包才能运行 Spark Mesos executor 后端。 Spark 包可以托管在任何 Hadoop 可访问的 URI 上,包括通过 http://
的 HTTP,通过 s3n://
的 Amazon Simple Storage Service 或通过 hdfs://
的 HDFS。
要使用预编译的软件包
- 从 Spark 下载页面 下载 Spark 二进制包
- 上传到 hdfs/http/s3
要在 HDFS 上托管,请使用 Hadoop fs put 命令:hadoop fs -put spark-3.5.5.tar.gz /path/to/spark-3.5.5.tar.gz
或者,如果您使用的是自定义编译版本的 Spark,则需要使用 Spark 源代码 tarball/checkout 中包含的 dev/make-distribution.sh
脚本创建一个包。
- 使用 此处 的说明下载并构建 Spark
- 使用
./dev/make-distribution.sh --tgz
创建一个二进制包。 - 将存档上传到 http/s3/hdfs
使用 Mesos Master URL
Mesos 的 Master URL 的格式为 mesos://host:5050
,用于单 master Mesos 集群,或 mesos://zk://host1:2181,host2:2181,host3:2181/mesos
,用于使用 ZooKeeper 的多 master Mesos 集群。
客户端模式
在客户端模式下,Spark Mesos 框架直接在客户端机器上启动,并等待驱动程序的输出。
驱动程序需要在 spark-env.sh
中进行一些配置才能与 Mesos 正确交互
- 在
spark-env.sh
中设置一些环境变量export MESOS_NATIVE_JAVA_LIBRARY=<libmesos.so 的路径>
。此路径通常为<prefix>/lib/libmesos.so
,其中 prefix 默认为/usr/local
。 请参见上面的 Mesos 安装说明。在 Mac OS X 上,该库名为libmesos.dylib
,而不是libmesos.so
。
.export SPARK_EXECUTOR_URI=<上面上传的 spark-3.5.5.tar.gz 的 URL>
- 同时设置
spark.executor.uri
为<spark-3.5.5.tar.gz 的 URL>
。
现在,在针对集群启动 Spark 应用程序时,在创建 SparkContext
时,传递一个 mesos://
URL 作为 master。例如:
val conf = new SparkConf()
.setMaster("mesos://HOST:5050")
.setAppName("My app")
.set("spark.executor.uri", "<path to spark-3.5.5.tar.gz uploaded above>")
val sc = new SparkContext(conf)
(您也可以使用 spark-submit
并在 conf/spark-defaults.conf 文件中配置 spark.executor.uri
。)
在运行 shell 时,spark.executor.uri
参数继承自 SPARK_EXECUTOR_URI
,因此无需冗余地作为系统属性传递。
./bin/spark-shell --master mesos://host:5050
集群模式
Mesos 上的 Spark 还支持集群模式,其中驱动程序在集群中启动,客户端可以从 Mesos Web UI 中找到驱动程序的结果。
要使用集群模式,您必须通过 sbin/start-mesos-dispatcher.sh
脚本在您的集群中启动 MesosClusterDispatcher
,并传入 Mesos master URL (例如:mesos://host:5050)。这会将 MesosClusterDispatcher
作为守护程序运行在主机上。请注意,MesosClusterDispatcher
不支持身份验证。您应确保对其的所有网络访问都受到保护(默认端口为 7077)。
通过设置 Mesos 代理配置属性(需要 mesos 版本 >= 1.4),在启动调度程序时,使用 --conf spark.mesos.proxy.baseURL=http://localhost:5050
,每个驱动程序的 mesos sandbox URI 将添加到 mesos 调度程序 UI。
如果希望使用 Marathon 运行 MesosClusterDispatcher
,则需要在前台运行 MesosClusterDispatcher
(例如: ./bin/spark-class org.apache.spark.deploy.mesos.MesosClusterDispatcher
)。请注意,MesosClusterDispatcher
尚未支持用于 HA 的多个实例。
MesosClusterDispatcher
还支持将恢复状态写入 Zookeeper。这将使 MesosClusterDispatcher
能够在重新启动时恢复所有已提交和正在运行的容器。 为了启用此恢复模式,您可以通过配置 spark.deploy.recoveryMode
和相关的 spark.deploy.zookeeper.* 配置在 spark-env 中设置 SPARK_DAEMON_JAVA_OPTS。有关这些配置的更多信息,请参阅 doc 中的配置。
您还可以通过在 spark-env 中设置环境变量 SPARK_DAEMON_CLASSPATH 来指定 MesosClusterDispatcher
所需的任何其他 jar 文件。
从客户端,您可以通过运行 spark-submit
并将 master URL 指定为 MesosClusterDispatcher
的 URL (例如:mesos://dispatcher:7077) 来将作业提交到 Mesos 集群。您可以在 Spark 集群 Web UI 上查看驱动程序状态。
例如:
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
http://path/to/examples.jar \
1000
请注意,传递给 spark-submit 的 jar 文件或 python 文件应该是 Mesos agent 可访问的 URI,因为 Spark 驱动程序不会自动上传本地 jar 文件。
Mesos 运行模式
Spark 可以在 Mesos 上以两种模式运行:“粗粒度”(默认)和“细粒度”(已弃用)。
粗粒度
在“粗粒度”模式下,每个 Spark executor 都作为单个 Mesos 任务运行。 Spark executor 的大小根据以下配置变量进行调整:
- Executor 内存:
spark.executor.memory
- Executor 核心数:
spark.executor.cores
- Executor 数量:
spark.cores.max
/spark.executor.cores
请参阅 Spark 配置 页面,了解详细信息和默认值。
executor 在应用程序启动时会被迅速启动,直到达到 spark.cores.max
。如果您不设置 spark.cores.max
,Spark 应用程序将消耗 Mesos 提供给它的所有资源,因此我们强烈建议您在任何类型的多租户集群中设置此变量,包括运行多个并发 Spark 应用程序的集群。
调度程序将以循环方式在 Mesos 提供的 offers 上启动 executor,但没有 spread 保证,因为 Mesos 不提供 offer 流上的此类保证。
在这种模式下,如果用户提供了端口分配,Spark executor 将遵循该端口分配。 具体来说,如果用户在 Spark 配置中定义了 spark.blockManager.port
,则 mesos 调度程序将检查可用的 offers 是否包含包含端口号的有效端口范围。 如果没有这样的范围可用,它将不会启动任何任务。 如果用户没有对端口号施加任何限制,则像往常一样使用临时端口。 如果用户定义了一个端口,则此端口遵循实现意味着每个主机一个任务。 将来,网络隔离将受到支持。
粗粒度模式的好处是启动开销低得多,但代价是为应用程序的整个持续时间保留 Mesos 资源。要配置您的作业以动态适应其资源需求,请查看 使用 Mesos 进行动态分配。
细粒度 (已弃用)
注意: 从 Spark 2.0.0 开始,细粒度模式已被弃用。考虑使用 动态分配 来获得一些好处。 有关完整说明,请参见 SPARK-11857
在“细粒度”模式下,Spark executor 中的每个 Spark 任务都作为单独的 Mesos 任务运行。 这允许 Spark(和其他框架)的多个实例以非常精细的粒度共享核心,每个应用程序在启动和关闭时获得或多或少的核心,但这会增加启动每个任务的额外开销。 这种模式可能不适用于低延迟要求,例如交互式查询或服务 Web 请求。
请注意,虽然细粒度中的 Spark 任务在终止时会放弃核心,但它们不会放弃内存,因为 JVM 不会将内存返回给操作系统。 Executor 也不会在空闲时终止。
要在细粒度模式下运行,请在您的 SparkConf 中将 spark.mesos.coarse
属性设置为 false。
conf.set("spark.mesos.coarse", "false")
您还可以利用 spark.mesos.constraints
对 Mesos 资源 offers 设置基于属性的约束。 默认情况下,将接受所有资源 offers。
conf.set("spark.mesos.constraints", "os:centos7;us-east-1:false")
例如,假设 spark.mesos.constraints
设置为 os:centos7;us-east-1:false
,那么将检查资源 offers 以查看它们是否满足这两个约束,并且只有这样才会接受它们以启动新的 executor。
要约束驱动程序任务的运行位置,请使用 spark.mesos.driver.constraints
Mesos Docker 支持
Spark 可以通过在您的 SparkConf 中设置属性 spark.mesos.executor.docker.image
来利用 Mesos Docker containerizer。
使用的 Docker 镜像必须具有已包含在该镜像中的适当版本的 Spark,或者您可以让 Mesos 通过常用方法下载 Spark。
需要 Mesos 版本 0.20.1 或更高版本。
请注意,默认情况下,如果 Mesos agent 上已存在该镜像,则不会拉取该镜像。 如果您使用可变的镜像标签,则可以将 spark.mesos.executor.docker.forcePullImage
设置为 true
,以强制 agent 在运行 executor 之前始终拉取该镜像。 强制拉取镜像仅在 Mesos 版本 0.22 及更高版本中可用。
与 Hadoop 一起运行
您可以通过简单地将 Spark 和 Mesos 作为机器上的单独服务启动,来与您现有的 Hadoop 集群一起运行它们。 要从 Spark 访问 Hadoop 数据,需要完整的 hdfs://
URL (通常为 hdfs://<namenode>:9000/path
,但您可以在 Hadoop Namenode Web UI 上找到正确的 URL)。
此外,还可以通过 Mesos 运行 Hadoop MapReduce,以便更好地隔离资源并在两者之间共享资源。 在这种情况下,Mesos 将充当统一的调度程序,将核心分配给 Hadoop 或 Spark,而不是让它们通过每个节点上的 Linux 调度程序共享资源。 请参阅 Mesos 上的 Hadoop。
在任何一种情况下,HDFS 都在 Hadoop MapReduce 之外运行,而无需通过 Mesos 进行调度。
使用 Mesos 进行动态资源分配
Mesos 仅通过粗粒度模式支持动态分配,它可以根据应用程序的统计信息调整 executor 的数量。 有关常规信息,请参见 动态资源分配。
要使用的外部 Shuffle 服务是 Mesos Shuffle 服务。 它在 Shuffle 服务之上提供 shuffle 数据清理功能,因为 Mesos 尚不支持通知另一个框架的终止。 要启动它,请在所有 agent 节点上运行 $SPARK_HOME/sbin/start-mesos-shuffle-service.sh
,并将 spark.shuffle.service.enabled
设置为 true
。
也可以通过 Marathon 使用唯一的主机约束来实现此目的,并使用以下命令:./bin/spark-class org.apache.spark.deploy.mesos.MesosExternalShuffleService
。
配置
有关 Spark 配置的信息,请参见配置页面。以下配置特定于 Mesos 上的 Spark。
Spark 属性
属性名称 | 默认值 | 含义 | 起始版本 |
---|---|---|---|
spark.mesos.coarse |
true | 如果设置为 true ,则在 Mesos 集群上以“粗粒度”共享模式运行,其中 Spark 在每台机器上获取一个长期存在的 Mesos 任务。 如果设置为 false ,则在 Mesos 集群上以“细粒度”共享模式运行,其中每个 Spark 任务创建一个 Mesos 任务。 有关详细信息,请参见 'Mesos 运行模式'。 |
0.6.0 |
spark.mesos.extra.cores |
0 |
设置 executor 要发布的额外核心数。 这不会导致分配更多核心。 相反,这意味着 executor 将“假装”它拥有更多核心,以便驱动程序将向其发送更多任务。 使用此选项可以增加并行性。 此设置仅用于 Mesos 粗粒度模式。 | 0.6.0 |
spark.mesos.mesosExecutor.cores |
1.0 |
(仅限于细粒度模式)分配给每个 Mesos 执行器的内核数量。 这不包括运行 Spark 任务使用的内核。 换句话说,即使没有 Spark 任务正在运行,每个 Mesos 执行器也会占用此处配置的内核数量。 该值可以是浮点数。 | 1.4.0 |
spark.mesos.executor.docker.image |
(无) | 设置 Spark 执行器将在其中运行的 Docker 镜像的名称。 选择的镜像必须安装 Spark 以及兼容版本的 Mesos 库。 镜像中 Spark 的安装路径可以使用 spark.mesos.executor.home 指定; Mesos 库的安装路径可以使用 spark.executorEnv.MESOS_NATIVE_JAVA_LIBRARY 指定。 |
1.4.0 |
spark.mesos.executor.docker.forcePullImage |
false | 强制 Mesos 代理拉取 spark.mesos.executor.docker.image 中指定的镜像。 默认情况下,Mesos 代理不会拉取它们已经缓存的镜像。 |
2.1.0 |
spark.mesos.executor.docker.parameters |
(无) | 设置自定义参数列表,这些参数将在使用 Docker 容器化器在 Mesos 上启动 Spark 执行器时传递到 docker run 命令中。 此属性的格式是以逗号分隔的键/值对列表。 例子:key1=val1,key2=val2,key3=val3 |
2.2.0 |
spark.mesos.executor.docker.volumes |
(无) | 设置将要挂载到 Docker 镜像中的卷列表,该镜像使用 spark.mesos.executor.docker.image 设置。 此属性的格式是以逗号分隔的映射列表,其形式与传递给 docker run -v 的形式相同。 也就是说,它们采用以下形式:[host_path:]container_path[:ro|:rw] |
1.4.0 |
spark.mesos.task.labels |
(无) | 设置要添加到每个任务的 Mesos 标签。 标签是自由格式的键值对。 键值对应该用冒号分隔,多个键值对用逗号分隔。 如果您的标签包含冒号或逗号,可以使用反斜杠对其进行转义。 例如:key:value,key2:a\:b。 | 2.2.0 |
spark.mesos.executor.home |
驱动程序端的 SPARK_HOME |
设置在 Mesos 中执行器上安装 Spark 的目录。 默认情况下,执行器将只使用驱动程序的 Spark 主目录,这对于它们来说可能不可见。 请注意,只有在没有通过 spark.executor.uri 指定 Spark 二进制包时,这才是相关的。 |
1.1.1 |
spark.mesos.executor.memoryOverhead |
执行器内存 * 0.10,最小值 384 | 每个执行器要分配的额外内存量,以 MiB 为单位指定。 默认情况下,开销将是 384 或 spark.executor.memory 的 10%,取两者中的较大值。 如果设置,最终开销将为此值。 |
1.1.1 |
spark.mesos.driver.memoryOverhead |
驱动程序内存 * 0.10,最小值 384 | 要分配给驱动程序的额外内存量,以 MB 为单位指定。 默认情况下,开销将是 384 或 spark.driver.memory 的 10%,取两者中的较大值。 仅适用于集群模式。 |
|
spark.mesos.uris |
(无) | 以逗号分隔的 URI 列表,在 Mesos 启动驱动程序或执行器时,将下载到沙箱中。 这适用于粗粒度和细粒度模式。 | 1.5.0 |
spark.mesos.principal |
(无) | 设置 Spark 框架用于向 Mesos 验证身份的主体。 您还可以通过环境变量 `SPARK_MESOS_PRINCIPAL` 指定此项。 | 1.5.0 |
spark.mesos.principal.file |
(无) | 设置包含 Spark 框架用于向 Mesos 验证身份的主体的文件。 允许在更注重安全性的部署中间接指定主体。 该文件必须可由启动作业的用户读取,并且是 UTF-8 编码的纯文本。 您还可以通过环境变量 `SPARK_MESOS_PRINCIPAL_FILE` 指定此项。 | 2.4.0 |
spark.mesos.secret |
(无) | 设置 Spark 框架用于向 Mesos 验证身份的密钥。 例如,在向注册表验证身份时使用。 您还可以通过环境变量 `SPARK_MESOS_SECRET` 指定此项。 | 1.5.0 |
spark.mesos.secret.file |
(无) | 设置包含 Spark 框架用于向 Mesos 验证身份的密钥的文件。 例如,在向注册表验证身份时使用。 允许在更注重安全性的部署中间接指定密钥。 该文件必须可由启动作业的用户读取,并且是 UTF-8 编码的纯文本。 您还可以通过环境变量 `SPARK_MESOS_SECRET_FILE` 指定此项。 | 2.4.0 |
spark.mesos.role |
* |
设置此 Spark 框架在 Mesos 中的角色。 角色在 Mesos 中用于预留和资源权重共享。 | 1.5.0 |
spark.mesos.constraints |
(无) | 基于属性的对 Mesos 资源提供的约束。 默认情况下,将接受所有资源提供。 此设置仅适用于执行器。 有关属性的更多信息,请参阅 Mesos 属性和资源。
|
1.5.0 |
spark.mesos.driver.constraints |
(无) | 与 spark.mesos.constraints 相同,但应用于通过调度器启动的驱动程序。 默认情况下,将接受所有具有足够资源的提供。 |
2.2.1 |
spark.mesos.containerizer |
docker |
这仅影响 Docker 容器,并且必须是“docker”或“mesos”之一。 Mesos 支持两种类型的 Docker 容器化器:“docker”容器化器和首选的“mesos”容器化器。 在此处阅读更多信息:http://mesos.apache.org/documentation/latest/container-image/ | 2.1.0 |
spark.mesos.driver.webui.url |
(无) |
设置用于与框架交互的 Spark Mesos 驱动程序 webui_url。 如果未设置,它将指向 Spark 的内部 Web UI。 | 2.0.0 |
spark.mesos.driver.labels |
(无) |
要添加到驱动程序的 Mesos 标签。 有关格式化信息,请参阅 spark.mesos.task.labels 。 |
2.3.0 |
spark.mesos.driver.secret.values , spark.mesos.driver.secret.names , spark.mesos.executor.secret.values , spark.mesos.executor.secret.names , |
(无) |
密钥由其内容和目标指定。 这些属性指定密钥的内容。 要指定密钥的目标,请参阅下面的单元格。 您可以按(1)值或(2)引用指定密钥的内容。 (1)要按值指定密钥,请设置 spark.mesos.driver.secret.values=guessme (2)要指定已通过引用放置在密钥存储中的密钥,请通过设置 spark.mesos.driver.secret.names=password 注意:要使用密钥存储,请确保已通过自定义 SecretResolver 模块将其与 Mesos 集成。 要指定多个密钥,请提供一个逗号分隔的列表 spark.mesos.driver.secret.values=guessme,passwd123或者 spark.mesos.driver.secret.names=password1,password2 |
2.3.0 |
spark.mesos.driver.secret.envkeys , spark.mesos.driver.secret.filenames , spark.mesos.executor.secret.envkeys , spark.mesos.executor.secret.filenames , |
(无) |
密钥由其内容和目标指定。 这些属性指定密钥的目标。 要指定密钥的内容,请参阅上面的单元格。 您可以在驱动程序或执行器中将密钥的目标指定为(1)环境变量或(2)文件。 (1)要创建基于环境变量的密钥,请设置 spark.mesos.driver.secret.envkeys=PASSWORD (2)要创建基于文件的密钥,请设置 spark.mesos.driver.secret.filenames=pwdfile 路径相对于容器的工作目录。 绝对路径必须已经存在。 注意:基于文件的密钥需要自定义 SecretResolver 模块。 要指定与多个密钥对应的环境变量或文件名,请提供一个逗号分隔的列表 spark.mesos.driver.secret.envkeys=PASSWORD1,PASSWORD2或者 spark.mesos.driver.secret.filenames=pwdfile1,pwdfile2 |
2.3.0 |
spark.mesos.driverEnv.[EnvironmentVariableName] |
(无) |
这仅影响在集群模式下提交的驱动程序。 将 EnvironmentVariableName 指定的环境变量添加到驱动程序进程。 用户可以指定多个这些变量来设置多个环境变量。 | 2.1.0 |
spark.mesos.dispatcher.webui.url |
(无) |
设置用于与框架交互的 Spark Mesos 调度器 webui_url。 如果未设置,它将指向 Spark 的内部 Web UI。 | 2.0.0 |
spark.mesos.dispatcher.driverDefault.[PropertyName] |
(无) |
为通过调度器提交的驱动程序设置默认属性。 例如,spark.mesos.dispatcher.driverProperty.spark.executor.memory=32g 导致在集群模式下提交的所有驱动程序的执行器都在 32g 容器中运行。 | 2.1.0 |
spark.mesos.dispatcher.historyServer.url |
(无) |
设置 历史服务器 的 URL。 然后,调度器会将每个驱动程序链接到其在历史服务器中的条目。 | 2.1.0 |
spark.mesos.dispatcher.queue |
(无) |
设置应用程序提交到的调度器队列的名称。 必须使用 spark.mesos.dispatcher.queue.[QueueName] 将指定的队列添加到调度器。 如果未指定队列,则会将应用程序提交到优先级为 0.0 的“default”队列。 |
3.1.0 |
spark.mesos.dispatcher.queue.[QueueName] |
0.0 |
添加一个具有指定优先级的新队列,用于提交的驱动程序。 数字越高表示优先级越高。 用户可以指定多个队列,以定义调度器中排队驱动程序的工作负载管理策略。 然后可以使用 spark.mesos.dispatcher.queue 将驱动程序提交到特定队列。 默认情况下,调度器具有一个优先级为 0.0 的队列(无法覆盖)。 通过将优先级队列映射到加权 Mesos 角色,并在提交应用程序时指定 spark.mesos.role 以及 spark.mesos.dispatcher.queue ,可以实现驱动程序整个生命周期内的一致且整体的工作负载管理策略。 例如,使用 URGENT Mesos 角色spark.mesos.dispatcher.queue.URGENT=1.0 spark.mesos.dispatcher.queue=URGENT spark.mesos.role=URGENT |
3.1.0 |
spark.mesos.gpus.max |
0 |
设置要为此作业获取的最大 GPU 资源数。 请注意,即使找不到 GPU 资源,执行器仍会启动,因为此配置只是一个上限,而不是保证的数量。 | 2.1.0 |
spark.mesos.network.name |
(无) |
将容器附加到给定的命名网络。 如果此作业在集群模式下启动,则也在给定的命名网络中启动驱动程序。 有关更多详细信息,请参阅 Mesos CNI 文档。 | 2.1.0 |
spark.mesos.network.labels |
(无) |
将网络标签传递给 CNI 插件。 这是一个以逗号分隔的键值对列表,其中每个键值对的格式为 key:value。 例子:key1:val1,key2:val2有关更多详细信息,请参阅 Mesos CNI 文档。 |
2.3.0 |
spark.mesos.fetcherCache.enable |
false |
如果设置为 `true`,则所有 URI(例如:`spark.executor.uri`、`spark.mesos.uris`)都将由 Mesos Fetcher Cache 缓存。 | 2.1.0 |
spark.mesos.driver.failoverTimeout |
0.0 |
在临时断开连接后,master 将等待驱动程序重新连接的时间(以秒为单位),然后它会通过杀死其所有执行器来拆除驱动程序框架。 默认值为零,表示没有超时:如果驱动程序断开连接,master 会立即拆除框架。 | 2.3.0 |
spark.mesos.rejectOfferDuration |
120 秒 |
考虑拒绝未使用资源的时间,用作 `spark.mesos.rejectOfferDurationForUnmetConstraints`、`spark.mesos.rejectOfferDurationForReachedMaxCores` 的后备方案 | 2.2.0 |
spark.mesos.rejectOfferDurationForUnmetConstraints |
spark.mesos.rejectOfferDuration |
考虑拒绝具有未满足约束的未使用资源的时间 | 1.6.0 |
spark.mesos.rejectOfferDurationForReachedMaxCores |
spark.mesos.rejectOfferDuration |
达到最大核心数 `spark.cores.max` 时,考虑拒绝未使用资源的时间 | 2.0.0 |
spark.mesos.appJar.local.resolution.mode |
host |
提供对 `local:///` 方案的支持,以便在集群模式下引用 app jar 资源。 如果用户使用本地资源 (`local:///path/to/jar`) 并且未使用配置选项,则默认为 `host`,例如,mesos fetcher 尝试从主机的文件系统中获取资源。 如果值未知,则会在调度器日志中打印警告消息,并默认为 `host`。 如果值为 `container`,则容器中的 spark submit 将使用容器路径中的 jar:`/path/to/jar`。 | 2.4.0 |
问题排查和调试
调试期间可以查看的一些地方
- Mesos master,端口
:5050
- Agent 应该出现在 agents 选项卡中
- Spark 应用程序应该出现在 frameworks 选项卡中
- 任务应该出现在 framework 的详细信息中
- 检查失败任务的沙箱 (sandbox) 的 stdout 和 stderr
- Mesos 日志
- 默认情况下,Master 和 Agent 的日志都在
/var/log/mesos
中
- 默认情况下,Master 和 Agent 的日志都在
以及常见的陷阱
- Spark 程序集不可达/无法访问
- Agent 必须能够从您提供的
http://
、hdfs://
或s3n://
URL 下载 Spark 二进制包
- Agent 必须能够从您提供的
- 防火墙阻止通信
- 检查关于连接失败的消息
- 临时禁用防火墙进行调试,然后打开适当的端口