配置 Spark - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 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

每个执行程序进程要使用的内存量。例如,1g2g

此设置由集群中的核心实例和任务实例类型决定。

spark.executor.cores

要对每个执行程序使用的内核的数量。

此设置由集群中的核心实例和任务实例类型决定。

spark.dynamicAllocation.enabled

如果为 true,则使用动态资源分配,以基于工作负载增大和减小注册到应用程序的执行程序的数目。

true(使用亚马逊 EMR 4.4.0 及更高版本)

注意

Spark shuffle 服务由亚马逊EMR自动配置。

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

如果为 true,则启用高级分区谓词下推到 Hive 元数据仓。

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

startsWithcontainsendsWith 筛选条件向下推送到 Hive 元数据仓中。

注意

Glue 不支持 startsWithcontainsendsWith 谓词下推。如果您使用的是 Glue 元数据仓,并且由于这些函数的谓词向下推而遇到错误,请将此配置设置为 false

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.defaultJavaOptionsspark.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 执行程序数。

基于集群中的核心和任务实例类型配置设置。除非同时将 spark.dynamicAllocation.enabled 显式设置为 true,否则将设置。

配置节点停用行为

在 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 节点停用设置
设置 描述 默认值

spark.blacklist.decommissioning.enabled

设置为时true,Spark 拒绝会列出decommissioning处于状态的节点YARN。Spark 不在于该节点上运行的执行程序上安排新任务。允许已经在运行的任务完成。

true

spark.blacklist.decommissioning.timeout

处于 decommissioning 状态的节点被加入拒绝名单的时间量。默认情况下,此值设置成一小时,这也是 yarn.resourcemanager.decommissioning.timeout 的默认值。要确保节点在其整个退役周期内都处于拒绝名单中,请将此值设置为等于或大于 yarn.resourcemanager.decommissioning.timeout。停用超时到期后,节点将转换为decommissioned状态,Amazon EMR 可以终止该节点的EC2实例。如果超时过期后有任何任务仍在运行,这些任务会丢失或被终止并在于其他节点上运行的其他执行程序上重新安排。

1h

spark.decommissioning.timeout.threshold

在亚马逊 5.11.0 或更高EMR版本中可用。以秒为单位指定。当节点过渡到停用状态时,如果主机将在等于或小于该值的时间段内停用,Amazon EMR 不仅会列出该节点,而且还会在不等待节点过渡到已停用状态的情况下清理主机状态(如所指定spark.resourceManager.cleanupExpiredHost)。这使 Spark 能够更好地处理竞价型实例终止,因为无论 yarn.resourcemager.decommissioning.timeout 的值如何,Spot 实例都会在 20 秒的超时时间后停用,因此可能没有足够的时间提供其他节点来随机读取文件。

20s

spark.resourceManager.cleanupExpiredHost

当设置为 true 时,Spark 会注销处于 decommissioned 状态的节点上的执行程序存储的所有已缓存数据和随机数据块。这会加速恢复过程。

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

当设置为 true 时,有助于防止 Spark 进入失败阶段并因为从退役节点获取失败次数过多而导致任务失败。从处于 decommissioned 状态的节点获取随机数据块失败的次数不会计入连续获取失败的最大数量。

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 的集群
  1. 导航到新的 Amazon EMR 控制台,然后从侧面导航栏中选择 “切换到旧主机”。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 依次选择 Create cluster (创建集群)Go to advanced options (转到高级选项)

  3. 选择 Spark

  4. Edit software settings (编辑软件设置) 下,将 Enter configuration (输入配置) 保留选中状态并输入以下配置:

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. 选择其他选项,选择 ,然后选择 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 Spark 版本 3.2.x 及更早版本使用旧版 Apache Log4j 1.x 和 log4j.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 迁移指南》和 Spark Log4j 2 模板

注意

对于亚马逊EMR,Apache Spark 使用的是log4j2.properties文件,而不是 A pache Log 4j 迁移指南中描述的.xml 文件。此外,我们不建议使用 Log4j 1.x 桥接方法转换为 Log4j 2.x。