在 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 主机实例。使用 Mesos 时,Mesos 主机将取代 Spark 主机作为集群管理器。
现在,当驱动程序创建作业并开始发出任务以进行调度时,Mesos 会确定哪些机器处理哪些任务。由于它在调度这些许多短暂的任务时会考虑其他框架,因此多个框架可以共存于同一个集群,而无需诉诸于资源的静态分区。
要开始使用,请按照以下步骤安装 Mesos 并通过 Mesos 部署 Spark 作业。
安装 Mesos
Spark 3.5.1 旨在与 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 主机故障转移,但 Mesos 也可以在没有 ZooKeeper 的情况下运行,使用单个主机。
验证
要验证 Mesos 集群是否已准备好用于 Spark,请导航到 Mesos 主机 webui,端口为 :5050
,确认代理选项卡中存在所有预期的机器。
将 Spark 连接到 Mesos
要从 Spark 使用 Mesos,您需要一个 Spark 二进制包,该包位于 Mesos 可访问的位置,以及配置为连接到 Mesos 的 Spark 驱动程序程序。
或者,您也可以在所有 Mesos 代理中将 Spark 安装在相同的位置,并将 spark.mesos.executor.home
(默认为 SPARK_HOME)配置为指向该位置。
对 Mesos 进行身份验证
当 Mesos 框架身份验证启用时,需要提供一个主体和机密,通过该主体和机密对 Spark 进行身份验证到 Mesos。每个 Spark 作业都将作为单独的框架向 Mesos 注册。
根据您的部署环境,您可能希望创建一个在所有用户之间共享的框架凭据集,或者为每个用户创建框架凭据。创建和管理框架凭据应按照 Mesos 身份验证文档 进行。
框架凭据可以通过多种方式指定,具体取决于您的部署环境和安全要求。最简单的方法是在 Spark 配置中直接指定 spark.mesos.principal
和 spark.mesos.secret
值。或者,您可以通过指定 spark.mesos.principal.file
和 spark.mesos.secret.file
来间接指定这些值,这些设置指向包含主体和机密的 文件。这些文件必须是 UTF-8 编码的纯文本文件。结合适当的文件所有权和模式/ACL,这提供了一种更安全的方式来指定这些凭据。
此外,如果您更喜欢使用环境变量,则可以通过环境变量来指定上述所有内容,环境变量名称只是将配置设置大写,并将 .
替换为 _
,例如 SPARK_MESOS_PRINCIPAL
。
凭据规范优先级顺序
请注意,如果您指定了多种获取凭据的方式,则将应用以下优先级顺序。Spark 将使用找到的第一个有效值,任何后续值都将被忽略
spark.mesos.principal
配置设置SPARK_MESOS_PRINCIPAL
环境变量spark.mesos.principal.file
配置设置SPARK_MESOS_PRINCIPAL_FILE
环境变量
机密也应用了等效的顺序。本质上,我们更喜欢直接指定配置,而不是通过文件间接指定,并且我们更喜欢使用配置设置而不是环境变量。
部署到在安全套接字上运行的 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 执行器后端。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.1.tar.gz /path/to/spark-3.5.1.tar.gz
或者,如果您使用的是自定义编译版本的 Spark,则需要使用 Spark 源代码包/检出中包含的 dev/make-distribution.sh
脚本创建软件包。
- 使用 此处 的说明下载并构建 Spark
- 使用
./dev/make-distribution.sh --tgz
创建二进制包。 - 将存档上传到 http/s3/hdfs
使用 Mesos 主机 URL
Mesos 的主机 URL 采用以下形式:对于单主机 Mesos 集群,为 mesos://host:5050
;对于使用 ZooKeeper 的多主机 Mesos 集群,为 mesos://zk://host1:2181,host2:2181,host3:2181/mesos
。
客户端模式
在客户端模式下,Spark Mesos 框架直接在客户端机器上启动,并等待驱动程序输出。
驱动程序需要在 spark-env.sh
中进行一些配置才能与 Mesos 正确交互
- 在
spark-env.sh
中设置一些环境变量export MESOS_NATIVE_JAVA_LIBRARY=<path to libmesos.so>
。此路径通常为<prefix>/lib/libmesos.so
,其中前缀默认情况下为/usr/local
。请参阅上面的 Mesos 安装说明。在 Mac OS X 上,库名为libmesos.dylib
而不是libmesos.so
。export SPARK_EXECUTOR_URI=<URL of spark-3.5.1.tar.gz uploaded above>
.
- 还要将
spark.executor.uri
设置为<spark-3.5.1.tar.gz 的 URL>
。
现在,在针对集群启动 Spark 应用程序时,在创建 SparkContext
时,将 mesos://
URL 作为 master 传递。例如
(您也可以使用 spark-submit
并在 conf/spark-defaults.conf 文件中配置 spark.executor.uri
)。
在运行 shell 时,spark.executor.uri
参数从 SPARK_EXECUTOR_URI
继承,因此无需将其作为系统属性冗余传递。
集群模式
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 沙箱 URI 将被添加到 mesos 调度程序 UI 中。
如果您想使用 Marathon 运行 MesosClusterDispatcher
,则需要在前台运行 MesosClusterDispatcher
(即:./bin/spark-class org.apache.spark.deploy.mesos.MesosClusterDispatcher
)。请注意,MesosClusterDispatcher
尚未支持用于 HA 的多个实例。
The MesosClusterDispatcher
也支持将恢复状态写入 Zookeeper。这将允许 MesosClusterDispatcher
能够在重新启动时恢复所有提交和正在运行的容器。为了启用此恢复模式,您可以通过配置 spark.deploy.recoveryMode
和相关的 spark.deploy.zookeeper.* 配置,在 spark-env 中设置 SPARK_DAEMON_JAVA_OPTS。有关这些配置的更多信息,请参阅配置 文档。
您也可以通过在 spark-env 中设置环境变量 SPARK_DAEMON_CLASSPATH,在类路径中指定 MesosClusterDispatcher
所需的任何其他 jar。
从客户端,您可以通过运行 spark-submit
并将 master URL 指定为 MesosClusterDispatcher
的 URL(例如:mesos://dispatcher:7077)来向 Mesos 集群提交作业。您可以在 Spark 集群 Web UI 上查看驱动程序状态。
例如
请注意,传递给 spark-submit 的 jar 或 python 文件应该是 Mesos 代理可以访问的 URI,因为 Spark 驱动程序不会自动上传本地 jar。
Mesos 运行模式
Spark 可以通过两种模式在 Mesos 上运行:“粗粒度”(默认)和“细粒度”(已弃用)。
粗粒度
在“粗粒度”模式下,每个 Spark 执行器都作为单个 Mesos 任务运行。Spark 执行器的规模根据以下配置变量确定
- 执行器内存:
spark.executor.memory
- 执行器核心:
spark.executor.cores
- 执行器数量:
spark.cores.max
/spark.executor.cores
有关详细信息和默认值,请参阅 Spark 配置 页面。
在应用程序启动时,执行器会积极地启动,直到达到 spark.cores.max
。如果您没有设置 spark.cores.max
,Spark 应用程序将消耗 Mesos 提供给它的所有资源,因此,我们当然敦促您在任何类型的多租户集群中设置此变量,包括运行多个并发 Spark 应用程序的集群。
调度程序将在 Mesos 提供给它的报价上以循环方式启动执行器,但没有传播保证,因为 Mesos 不会在报价流上提供此类保证。
在此模式下,Spark 执行器将尊重端口分配(如果用户提供)。具体来说,如果用户在 Spark 配置中定义了 spark.blockManager.port
,mesos 调度程序将检查可用报价以查找包含端口号的有效端口范围。如果没有找到此类范围,则不会启动任何任务。如果用户没有对端口号施加限制,则会像往常一样使用临时端口。此端口尊重实现意味着如果用户定义了端口,则每个主机一个任务。在未来的网络中,将支持网络隔离。
粗粒度模式的优点是启动开销低得多,但代价是为应用程序的整个持续时间保留 Mesos 资源。要配置您的作业以动态调整其资源需求,请查看 动态分配。
细粒度(已弃用)
注意:从 Spark 2.0.0 开始,细粒度模式已弃用。考虑使用 动态分配 来获得一些好处。有关完整说明,请参阅 SPARK-11857
在“细粒度”模式下,Spark 执行器中的每个 Spark 任务都作为单独的 Mesos 任务运行。这允许 Spark(和其他框架)的多个实例以非常细粒度的级别共享核心,其中每个应用程序在启动和关闭时获得更多或更少的核心,但它会带来启动每个任务的额外开销。此模式可能不适合低延迟要求,例如交互式查询或提供 Web 请求。
请注意,虽然细粒度的 Spark 任务在终止时会释放核心,但它们不会释放内存,因为 JVM 不会将内存返回给操作系统。执行器在空闲时也不会终止。
要以细粒度模式运行,请在您的 SparkConf 中将 spark.mesos.coarse
属性设置为 false。
您也可以使用 spark.mesos.constraints
对 Mesos 资源报价设置基于属性的约束。默认情况下,将接受所有资源报价。
例如,假设 spark.mesos.constraints
设置为 os:centos7;us-east-1:false
,那么将检查资源报价以查看它们是否满足这两个约束,只有在满足的情况下才会被接受以启动新的执行器。
要约束驱动程序任务运行的位置,请使用 spark.mesos.driver.constraints
Mesos Docker 支持
Spark 可以通过在您的 SparkConf 中设置属性 spark.mesos.executor.docker.image
来使用 Mesos Docker 容器化程序。
使用的 Docker 映像必须包含适当版本的 Spark,或者您可以让 Mesos 通过通常的方法下载 Spark。
需要 Mesos 版本 0.20.1 或更高版本。
请注意,默认情况下,如果代理上已经存在映像,Mesos 代理不会拉取映像。如果您使用可变映像标签,则可以将 spark.mesos.executor.docker.forcePullImage
设置为 true
,以强制代理在运行执行器之前始终拉取映像。强制拉取映像仅在 Mesos 版本 0.22 及更高版本中可用。
与 Hadoop 一起运行
您可以通过将它们作为单独的服务在机器上启动,在现有的 Hadoop 集群旁边运行 Spark 和 Mesos。要从 Spark 访问 Hadoop 数据,需要完整的 hdfs://
URL(通常为 hdfs://<namenode>:9000/path
,但您可以在 Hadoop Namenode Web UI 上找到正确的 URL)。
此外,还可以将 Hadoop MapReduce 运行在 Mesos 上,以实现更好的资源隔离和两种框架之间的共享。在这种情况下,Mesos 将充当统一的调度程序,将核心分配给 Hadoop 或 Spark,而不是让它们通过每个节点上的 Linux 调度程序共享资源。请参阅 Mesos 上的 Hadoop。
在这两种情况下,HDFS 都独立于 Hadoop MapReduce 运行,不会通过 Mesos 进行调度。
使用 Mesos 进行动态资源分配
Mesos 仅支持使用粗粒度模式的动态分配,该模式可以根据应用程序的统计信息调整执行器数量。有关一般信息,请参阅 动态资源分配。
要使用的外部 Shuffle 服务是 Mesos Shuffle 服务。它在 Shuffle 服务之上提供了 shuffle 数据清理功能,因为 Mesos 尚未支持通知另一个框架的终止。要启动它,请在所有代理节点上运行 $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 |
设置要为执行器宣传的额外核心数量。这不会导致分配更多核心。相反,这意味着执行器将“假装”它有更多核心,以便驱动程序向它发送更多任务。使用此方法来提高并行度。此设置仅用于 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` | 设置 Spark 在 Mesos 执行器上安装的目录。默认情况下,执行器将简单地使用驱动程序的 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 列表,这些 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|executor].secret.values` 属性,以使密钥在驱动程序或执行器中可用。例如,要使密钥密码“guessme”对驱动程序进程可用,请设置 spark.mesos.driver.secret.values=guessme (2) 要指定已通过引用放置在密钥存储中的密钥,请通过设置 `spark.mesos.[driver|executor].secret.names` 属性在密钥存储中指定其名称。例如,要使密钥存储中名为“password”的密钥密码对驱动程序进程可用,请设置 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|executor].secret.envkeys` 属性。密钥将作为具有给定名称的环境变量出现在驱动程序或执行器中。例如,要使密钥密码作为 $PASSWORD 对驱动程序进程可用,请设置 spark.mesos.driver.secret.envkeys=PASSWORD (2) 要创建基于文件的密钥,请设置 `spark.mesos.[driver|executor].secret.filenames` 属性。密钥将出现在驱动程序或执行器中具有给定文件名的文件的内容中。例如,要使密钥密码在驱动程序进程中名为“pwdfile”的文件中可用,请设置 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 缓存 缓存。 | 2.1.0 |
spark.mesos.driver.failoverTimeout |
0.0 |
主节点在驱动程序暂时断开连接后等待驱动程序重新连接的时间(以秒为单位),如果在该时间段内驱动程序未重新连接,则主节点将通过杀死所有执行器来拆除驱动程序框架。默认值为零,表示没有超时:如果驱动程序断开连接,主节点会立即拆除框架。 | 2.3.0 |
spark.mesos.rejectOfferDuration |
120s |
将未使用的资源视为拒绝的时间,作为 `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:///` 方案提供对应用程序 jar 资源的引用支持。如果用户使用本地资源 (`local:///path/to/jar`) 并且未使用配置选项,则默认值为 `host`,例如 Mesos Fetcher 尝试从主机的文件系统获取资源。如果值未知,则会在调度程序日志中打印警告消息,并默认使用 `host`。如果值为 `container`,则容器中的 Spark 提交将在容器的路径中使用 jar:`/path/to/jar`。 | 2.4.0 |
故障排除和调试
调试期间的一些查找位置
- Mesos 主节点在端口
:5050
上- 代理应该出现在代理选项卡中
- Spark 应用程序应该出现在框架选项卡中
- 任务应该出现在框架的详细信息中
- 检查失败任务的沙箱的标准输出和标准错误
- Mesos 日志
- 主节点和代理日志默认都在
/var/log/mesos
中
- 主节点和代理日志默认都在
以及常见问题
- Spark 程序集无法访问
- 代理必须能够从您提供的
http://
、hdfs://
或s3n://
URL 下载 Spark 二进制包
- 代理必须能够从您提供的
- 防火墙阻止通信
- 检查有关连接失败的消息
- 暂时禁用防火墙以进行调试,然后打开相应的端口