在Mesos上运行Spark
- 安全性
- 工作原理
- 安装 Mesos
- 将 Spark 连接到 Mesos
- Mesos 运行模式
- Mesos Docker 支持
- 与 Hadoop 共同运行
- 与 Mesos 进行动态资源分配
- 配置
- 故障排除和调试
注意 : Apache Mesos 的支持自 Apache Spark 3.2.0 起已被弃用。它将在未来的版本中被移除。
Spark 可以在由 Apache Mesos 管理的硬件集群上运行。
使用Mesos部署Spark的优点包括:
- Spark与其他 框架 之间的动态分区
- 多个Spark实例之间的可扩展分区
安全
安全特性如身份验证默认情况下是禁用的。当部署一个对互联网或不受信任网络开放的集群时,保护对集群的访问非常重要,以防止未经授权的应用程序在集群上运行。在运行Spark之前,请查看 Spark安全性 以及本文件中的具体安全部分。
工作原理
在独立集群部署中,下面图中的集群管理器是一个Spark主实例。使用Mesos时,Mesos主替代Spark主作为集群管理器。
现在,当一个驱动程序创建一个作业并开始发出调度任务时,Mesos确定哪些机器处理哪些任务。由于在调度这些许多短期任务时考虑到了其他框架,因此多个框架可以共存于同一个集群,而不需要资源的静态划分。
要开始,请按照以下步骤安装Mesos并通过Mesos部署Spark作业。
安装Mesos
Spark 3.5.3 设计用于与 Mesos 1.0.0 或更高版本一起使用,并不需要任何特殊的 Mesos 补丁。基于文件和环境的秘密支持需要 Mesos 1.3.0 或更高版本。
如果您已经有一个正在运行的Mesos集群,可以跳过这个Mesos安装步骤。
否则,安装 Mesos 用于 Spark 与为其他框架安装 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,请导航到端口
:5050
上的Mesos主控网页UI。确认所有预期的机器在代理选项卡中均已出现。
将Spark连接到Mesos
要从Spark使用Mesos,您需要一个可由Mesos访问的Spark二进制包,以及一个配置为连接到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 Mesos 执行器后端的 Spark 二进制包。
Spark 包可以托管在任何 Hadoop 可访问的 URI 上,包括 HTTP 通过
http://
,
亚马逊简单存储服务
通过
s3n://
,或 HDFS 通过
hdfs://
。
要使用预编译的包:
- 从Spark 下载页面 下载Spark二进制包
- 上传到hdfs/http/s3
要在HDFS上托管,请使用Hadoop fs put命令:
hadoop fs -put spark-3.5.3.tar.gz
/path/to/spark-3.5.3.tar.gz
或者,如果您使用的是自定义编译版本的 Spark,您需要使用包含在 Spark 源码压缩包/检出中的
dev/make-distribution.sh
脚本创建一个包。
- 根据 这里 的说明下载并构建Spark
-
使用
./dev/make-distribution.sh --tgz创建一个二进制包。 - 将档案上传到http/s3/hdfs
使用 Mesos 主节点 URL
Mesos 的主 URL 形式为
mesos://host:5050
,用于单主节点的 Mesos 集群,或
mesos://zk://host1:2181,host2:2181,host3:2181/mesos
,用于使用 ZooKeeper 的多主节点 Mesos 集群。
客户端模式
在客户端模式下,Spark Mesos框架直接在客户端机器上启动,并等待驱动程序的输出。
驱动程序需要在
spark-env.sh
中进行一些配置,以便与 Mesos 进行正确交互:
-
在
spark-env.sh中设置一些环境变量:-
export MESOS_NATIVE_JAVA_LIBRARY=。这个路径通常是,其中前缀默认是/lib/libmesos.so /usr/local。请参阅上面的 Mesos 安装说明。在 Mac OS X 上,库被称为libmesos.dylib而不是libmesos.so。 -
export SPARK_EXECUTOR_URI=。
-
-
还要将
spark.executor.uri设置为。
现在,当在集群上启动一个Spark应用程序时,创建
SparkContext
时,将
mesos://
URL作为主节点传递。例如:
val conf = new SparkConf()
.setMaster("mesos://HOST:5050")
.setAppName("My app")
.set("spark.executor.uri", "<上传的 spark-3.5.3.tar.gz 的路径>")
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
集群模式
Spark在Mesos上也支持集群模式,其中驱动程序在集群中启动,客户端可以从Mesos Web UI中找到驱动程序的结果。
要使用集群模式,您必须通过
sbin/start-mesos-dispatcher.sh
脚本在您的集群中启动
MesosClusterDispatcher
,并传入 Mesos 主节点 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 的多个实例。
MesosClusterDispatcher
还支持将恢复状态写入 Zookeeper。这将允许
MesosClusterDispatcher
在重新启动时恢复所有提交和运行的容器。为了启用这种恢复模式,可以通过配置
spark.deploy.recoveryMode
和相关的 spark.deploy.zookeeper.* 配置来设置 spark-env 中的 SPARK_DAEMON_JAVA_OPTS。有关这些配置的更多信息,请参阅
文档
。
您还可以通过在spark-env中设置环境变量SPARK_DAEMON_CLASSPATH,指定类路径中所需的任何额外jar,这些jar由
MesosClusterDispatcher
使用。
从客户端,您可以通过运行
spark-submit
并指定主节点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代理可访问的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实例(以及其他框架)在非常细的粒度上共享核心,其中每个应用在增加和减少时获取更多或更少的核心,但这会带来启动每个任务的额外开销。对于低延迟要求,如交互查询或服务网页请求,这种模式可能不合适。
请注意,虽然Spark的细粒度任务在终止时会释放核心,但它们不会释放内存,因为JVM不会将内存归还给操作系统。执行器在空闲时也不会终止。
要以细粒度模式运行,请在您的
SparkConf
中将
spark.mesos.coarse
属性设置为 false:
conf.set("spark.mesos.coarse", "false")
您也可以使用
spark.mesos.constraints
来设置基于属性的约束条件在 Mesos 资源报价上。默认情况下,所有的资源报价将被接受。
conf.set("spark.mesos.constraints", "os:centos7;us-east-1:false")
例如,假设
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并行运行
您可以通过将Spark和Mesos作为单独的服务启动在现有的Hadoop集群上,以便与之共存。要从Spark访问Hadoop数据,需要一个完整的
hdfs://
URL
(通常是
hdfs://
,但您可以在Hadoop Namenode web UI上找到正确的URL)。
此外,还可以在Mesos上运行Hadoop MapReduce,以实现更好的资源隔离和共享。在这种情况下,Mesos将充当统一调度程序,分配核心给Hadoop或Spark,而不是通过每个节点上的Linux调度程序共享资源。请参考 Hadoop on Mesos 。
无论哪种情况,HDFS 都是独立于 Hadoop MapReduce 运行的,不通过 Mesos 进行调度。
使用 Mesos 的动态资源分配
Mesos 仅在粗粒度模式下支持动态资源分配,这可以根据应用程序的统计信息调整执行器的数量。有关一般信息,请参阅 动态资源分配 。
要使用的外部洗牌服务是Mesos洗牌服务。它在洗牌服务的基础上提供洗牌数据清理功能,因为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
|
(none) |
设置 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
|
(none) |
设置在使用 docker 容器启动 Spark 执行者时将传递给
docker run
命令的自定义参数列表。此属性的格式为
以逗号分隔的键/值对的列表。示例:
key1=val1,key2=val2,key3=val3 |
2.2.0 |
spark.mesos.executor.docker.volumes
|
(none) |
设置将挂载到使用
spark.mesos.executor.docker.image
设置的 Docker 镜像中的卷列表。此属性的格式为
以逗号分隔的格式,遵循传递给
docker run -v
的格式。即它们采用的形式为:
[host_path:]container_path[:ro|:rw] |
1.4.0 |
spark.mesos.task.labels
|
(none) | 设置要添加到每个任务的 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
|
(none) | 在 Mesos 启动驱动程序或执行者时,要下载到沙箱中的 URI 的逗号分隔列表。 这适用于 粗粒度和细粒度模式。 | 1.5.0 |
spark.mesos.principal
|
(none) | 设置 Spark 框架将用于与 Mesos 进行身份验证的主体。您还可以通过环境变量 `SPARK_MESOS_PRINCIPAL` 指定此内容。 | 1.5.0 |
spark.mesos.principal.file
|
(none) | 设置包含主体的文件,Spark 框架将用于与 Mesos 进行身份验证。允许在安全意识更强的部署中间接指定主体。该文件必须可由启动作业的用户读取,并且为 UTF-8 编码的纯文本。您还可以通过环境变量 `SPARK_MESOS_PRINCIPAL_FILE` 指定此内容。 | 2.4.0 |
spark.mesos.secret
|
(none) | 设置 Spark 框架将用于与 Mesos 进行身份验证的密钥。用于例如 与注册表进行身份验证。您还可以通过环境变量 `SPARK_MESOS_SECRET` 指定此内容。 | 1.5.0 |
spark.mesos.secret.file
|
(none) | 设置包含密钥的文件,Spark 框架将用于与 Mesos 进行身份验证。例如用于 与注册表进行身份验证。允许在安全意识更强的部署中间接指定密钥。该文件必须可由启动作业的用户读取,并且为 UTF-8 编码的纯文本。您还可以通过环境变量 `SPARK_MESOS_SECRET_FILE` 指定此内容。 | 2.4.0 |
spark.mesos.role
|
*
|
设置此 Spark 框架在 Mesos 中的角色。角色在 Mesos 中用于资源的预留 和权重共享。 | 1.5.0 |
spark.mesos.constraints
|
(none) |
基于属性的 Mesos 资源提供约束。默认情况下,所有资源提供将被接受。此设置
仅适用于执行者。有关属性的更多信息,请参阅
Mesos
属性与资源
。
|
1.5.0 |
spark.mesos.driver.constraints
|
(none) |
与
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
|
(none)
|
设置用于与框架交互的 Spark Mesos 驱动程序 webui_url。 如果未设置,则指向 Spark 的内部 Web UI。 | 2.0.0 |
spark.mesos.driver.labels
|
(none)
|
要添加到驱动程序的 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
,
|
(none)
|
密钥由其内容和目的地指定。这些属性 指定密钥的内容。要指定密钥的目的地,请参见下面的单元格。 您可以通过(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
,
|
(none)
|
密钥由其内容和目的地指定。这些属性 指定密钥的目的地。要指定密钥的内容,请参见上面的单元格。 您可以在驱动程序或 执行者中将密钥的目的地指定为(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.[环境变量名称]
|
(none)
|
这仅影响以集群模式提交的驱动程序。添加由环境变量名称指定的 环境变量到驱动程序进程。用户可以指定多个环境变量。 | 2.1.0 |
spark.mesos.dispatcher.webui.url
|
(none)
|
设置用于与框架交互的 Spark Mesos 调度程序 webui_url。 如果未设置,则指向 Spark 的内部 Web UI。 | 2.0.0 |
spark.mesos.dispatcher.driverDefault.[属性名称]
|
(none)
|
为通过调度程序提交的驱动程序设置默认属性。例如, spark.mesos.dispatcher.driverProperty.spark.executor.memory=32g 将导致以集群模式提交的所有驱动程序的执行者在 32g 容器中运行。 | 2.1.0 |
spark.mesos.dispatcher.historyServer.url
|
(none)
|
设置 历史 服务器 的 URL。然后调度程序将每个驱动程序链接到其在历史服务器中的条目。 | 2.1.0 |
spark.mesos.dispatcher.queue
|
(none)
|
设置应用程序提交的调度程序队列名称。
指定的队列必须通过
spark.mesos.dispatcher.queue.[队列名称]
添加到调度程序。
如果未指定队列,则应用程序将以 0.0 优先级提交到 "默认" 队列。
|
3.1.0 |
spark.mesos.dispatcher.queue.[队列名称]
|
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
|
(none)
|
将容器附加到给定名称的网络。如果该作业在集群模式下启动,还将在给定名称的 网络中启动驱动程序。请参见 Mesos CNI 文档 获取更多信息。 | 2.1.0 |
spark.mesos.network.labels
|
(none)
|
将网络标签传递给 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
|
主控将等待的时间(以秒为单位),以便在短暂断开连接后 驱动程序重新连接,以便在杀死所有执行者之前拆除驱动程序框架。默认值为零,表示没有超时:如果驱动程序断开连接,主控会立即拆除框架。 | 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 master 在端口
:5050- 代理应该出现在代理标签中
- Spark 应用程序应该出现在框架标签中
- 任务应该出现在框架的详细信息中
- 检查失败任务的沙箱的 stdout 和 stderr
-
Mesos 日志
-
主节点和代理日志默认都在
/var/log/mesos中
-
主节点和代理日志默认都在
常见的陷阱:
-
Spark 组装不可达/无法访问
-
代理必须能够从您提供的
http://,hdfs://或s3n://URL 下载 Spark 二进制包
-
代理必须能够从您提供的
-
防火墙阻止通信
- 检查有关连接失败的消息
- 暂时禁用防火墙进行调试,然后打开适当的端口