本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 Spark
您可以使用配置分类在 Amazon EMR 上配置 Spark
亚马逊 Spark 的配置分类EMR包括以下内容:
-
spark
– 将maximizeResourceAllocation
属性设置为 true 或 false。如果为 true,Amazon EMR 会根据集群硬件配置自动配置spark-defaults
属性。有关更多信息,请参阅 使用 maximizeResourceAllocation。 -
spark-defaults
– 在spark-defaults.conf
文件中设置值。有关更多信息,请参阅 Spark 文档中的 Spark 配置。 -
spark-env
– 在spark-env.sh
文件中设置值。有关更多信息,请参阅 Spark 文档中的环境变量。 -
spark-hive-site
– 在hive-site.xml
中为 Spark 设置值。 -
spark-log4j
—(亚马逊EMR发布 6.7.x 及更低版本)在文件中log4j.properties
设置值。有关更多信息,请参阅 Github 上的 log4j.properties.template文件。 -
spark-log4j2
—(Amazon 6.8.0 及更高EMR版本)在文件中log4j2.properties
设置值。有关更多信息,请参阅 Github 上的 log4j2.properties.template文件。 -
spark-metrics
– 在metrics.properties
文件中设置值。有关设置和更多信息,请参阅 Github 上的 metrics.properties.template文件和 Spark 文档中的指标 。
注意
如果您要将 Spark 工作负载EMR从其他平台迁移到 Amazon,我们建议您在添加自定义配置亚马逊设置的 Spark 默认值 EMR 之前使用测试您的工作负载。大多数客户都通过我们的默认设置见证了性能有所改善
主题
亚马逊设置的 Spark 默认值 EMR
下表显示了 Amazon 如何EMR设置影响应用程序spark-defaults
的默认值。
亚马逊设置的 Spark 默认值 EMR | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
设置 | 描述 | 默认值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.executor.memory |
每个执行程序进程要使用的内存量。例如, |
此设置由集群中的核心实例和任务实例类型决定。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.executor.cores |
要对每个执行程序使用的内核的数量。 |
此设置由集群中的核心实例和任务实例类型决定。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.dynamicAllocation.enabled |
如果为 true,则使用动态资源分配,以基于工作负载增大和减小注册到应用程序的执行程序的数目。 |
注意Spark shuffle 服务由亚马逊EMR自动配置。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.sql.hive.advancedPartitionPredicatePushdown.enabled |
如果为 true,则启用高级分区谓词下推到 Hive 元数据仓。 |
true |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled |
将 注意Glue 不支持 |
true |
在亚马逊 EMR 6.1.0 上配置 Spark 垃圾收集
由于与 spark.driver.extraJavaOptions
Amazon 6.1.0 的垃圾收集配置存在冲突,因此在 Amazon 6.1 中设置自定义垃圾收集配置会导spark.executor.extraJavaOptions
致 Amazon EMR EMR 6.1 的驱动程序或执行程序启动失败。对于 Amazon EMR 6.1.0,默认的垃圾收集配置是通过spark.driver.defaultJavaOptions
和spark.executor.defaultJavaOptions
设置的。此配置仅适用于亚马逊 EMR 6.1.0。JVM仍然可以通过设置与垃圾收集无关的选项,例如用于配置日志记录的选项 (-verbose:class
) extraJavaOptions
。有关更多信息,请参阅 Spark 应用程序属性
使用 maximizeResourceAllocation
您可以使用 spark
配置分类将 maximizeResourceAllocation
设置为 true
,以将执行程序配置为使用集群中的每个节点上尽可能多的资源。特定maximizeResourceAllocation
于 Amazon EMR。启用后maximizeResourceAllocation
,Amazon EMR 会计算核心实例组中某个实例上执行者可用的最大计算和内存资源。然后,它将根据计算出的最大值设置相应的 spark-defaults
设置。
Amazon EMR 根据核心实例队列中的实例类型计算执行者可用的最大计算和内存资源。由于每个实例队列在队列中可能具有不同的实例类型和大小,因此 Amazon EMR 使用的执行程序配置可能不适合您的集群,因此我们不建议在使用最大资源分配时使用默认设置。为您的实例队列集群配置自定义设置。
注意
您不应在带有其他分布式应用程序的集群上使用该maximizeResourceAllocation
选项,例如HBase。Amazon 对分布式应用程序EMR使用自定义YARN配置,这可能会与 Spark 应用程序冲突maximizeResourceAllocation
并导致 Spark 应用程序失败。
以下是一个 maximizeResourceAllocation
设置为 true
的 Spark 分类配置。
[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
启用 spark-defaults 时在 maximizeResourceAllocation 中配置的设置 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
设置 | 描述 | 值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.default.parallelism | 转换RDDs返回的默认分区数,例如join、 reduceByKey、parallelize(未由用户设置)。 |
YARN容器可用CPU内核数量的 2 倍。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.driver.memory | 用于驱动程序进程的内存量, SparkContext 即初始化位置。 (例如,1g、2g)。 |
基于集群中的实例类型配置设置。但是,由于 Spark 驱动程序应用程序可以在主实例或其中一个核心实例上运行(例如,分别在YARN客户端和集群模式下),因此它是根据这两个实例组中较小的实例类型进行设置的。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.executor.memory | 每个执行者进程要使用的内存量。(例如,1g、2g) |
基于集群中的核心和任务实例类型配置设置。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.executor.cores | 要对每个执行程序使用的内核的数量。 | 基于集群中的核心和任务实例类型配置设置。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spark.executor.instances | 执行程序数。 |
基于集群中的核心和任务实例类型配置设置。除非同时将 |
配置节点停用行为
在 Amazon 5.9.0 及更高EMR版本中,Spark on Amazon EMR 包含了一组功能,可帮助确保 Spark 优雅地处理由于手动调整大小或自动扩展策略请求而导致的节点终止。Amazon 在 Spark 中EMR实施了一种建立在YARN停用机制之上的拒绝上架机制。此机制有助于确保不会在即将停用的节点上计划新任务,同时允许正在运行的任务完成。此外,有些功能可以在节点终止导致随机数据块丢失时帮助更快地恢复 Spark 任务。可以更快触发并优化重新计算进程,从而加快重新计算和减少阶段重试,并防止因丢失随机数据块引发的提取失败所导致的任务失败。
重要
该spark.decommissioning.timeout.threshold
设置已添加到 Amazon EMR 版本 5.11.0 中,以提高您使用竞价型实例时的 Spark 弹性。在早期发行版中,当节点使用竞价型实例且该实例因出价而终止时,Spark 可能无法正常地处理终止。任务可能失败,而且随机重新计算可能花费大量时间。为此,如果您使用竞价型实例,建议使用发行版 5.11.0 或更高版本。
Spark 节点停用设置 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
设置 | 描述 | 默认值 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
设置为时 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
处于 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
在亚马逊 5.11.0 或更高EMR版本中可用。以秒为单位指定。当节点过渡到停用状态时,如果主机将在等于或小于该值的时间段内停用,Amazon EMR 不仅会列出该节点,而且还会在不等待节点过渡到已停用状态的情况下清理主机状态(如所指定 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
当设置为 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
当设置为 |
true |
Spark ThriftServer 环境变量
Spark 将 Hive Thrift 服务器端口环境变量 HIVE_SERVER2_THRIFT_PORT
设置为 10001。
更改 Spark 默认设置
您可以使用 spark-defaults
配置分类或 spark
配置分类中的 maximizeResourceAllocation
设置更改 spark-defaults.conf
中的默认值。
以下过程说明如何使用CLI或控制台修改设置。
要创建将 spark.executor.memory 设置为 2g 的集群,请使用 CLI
-
使用以下命令创建一个安装了 Spark 且
spark.executor.memory
设为 2g 的集群,该集群引用存储在 Amazon S3 中的myConfig.json
文件。aws emr create-cluster --release-label
emr-7.2.0
--applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json注意
为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号(^)。
myConfig.json
:[ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
使用控制台创建一个 spark.executor.memory 设为 2g 的集群
导航到新的 Amazon EMR 控制台,然后从侧面导航栏中选择 “切换到旧主机”。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console。
-
依次选择 Create cluster (创建集群)、Go to advanced options (转到高级选项)。
-
选择 Spark。
-
在 Edit software settings (编辑软件设置) 下,将 Enter configuration (输入配置) 保留选中状态并输入以下配置:
classification=spark-defaults,properties=[spark.executor.memory=2G]
-
选择其他选项,选择 ,然后选择 Create cluster (创建集群)。
要设置 maximizeResourceAllocation
-
使用存储在 Amazon S3 中的文件 Amazon CLI,创建安装了 Spark 并将其
maximizeResourceAllocation
设置为 true 的集群。myConfig.json
aws emr create-cluster --release-label
emr-7.2.0
--applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json注意
为了便于读取,包含 Linux 行继续符 (\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字号 (^)。
myConfig.json
:[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
注意
在 Amazon 5.21.0 及更高EMR版本中,您可以覆盖集群配置,并为正在运行的集群中的每个实例组指定其他配置分类。您可以使用 Amazon EMR 控制台、 Amazon Command Line Interface (Amazon CLI) 或 Amazon SDK。有关更多信息,请参阅为运行的集群中的实例组提供配置。
从 Apache Log4j 1.x 迁移到 Log4j 2.x
Apache Sparklog4j.properties
文件在 Spark 进程中配置 Log4j。Apache Spark 版本 3.3.0 及更高版本使用 Apache Log4j 2.x 和 log4j2.properties
文件在 Spark 进程中配置 Log4j。
如果您使用低于 6.8.0 的亚马逊EMR版本配置 Apache Spark Log4j,则必须删除旧版spark-log4j
配置分类并迁移到spark-log4j2
配置分类和密钥格式,然后才能升级到 Amazon 6.8.0 或更高版本。EMR在 Amazon 6.8.0 及更高EMR版本中,旧spark-log4j
分类会导致集群创建失败,并ValidationException
出现错误。不会因为与 Log4j 不兼容相关的故障而向您收费,但您必须删除已失效的 spark-log4j
配置分类才能继续。
有关从 Apache Log4j 1.x 迁移到 Log4j 2.x 的更多信息,请参阅 Github 上的《Apache Log4j 迁移指南
注意
对于亚马逊EMR,Apache Spark 使用的是log4j2.properties
文件,而不是 A pache Log