

# 发布版本
<a name="notebooks-spark-release-versions"></a>

适用于 Apache Spark 的 Amazon Athena 提供以下发行版本：

## PySpark 引擎版本 3
<a name="notebooks-spark-release-versions-pyspark-3"></a>

PySpark 版本 3 包含 Apache Spark 版本 3.2.1。使用此版本，您可以在 Athena 控制台内笔记本中执行 Spark 代码。

## Apache Spark 版本 3.5
<a name="notebooks-spark-release-versions-spark-35"></a>

Apache Spark 版本 3.5 基于 Amazon EMR 7.12，并打包了 Apache Spark 版本 3.5.6。使用此版本，您可以从 Amazon SageMaker AI 融通式合作开发工作室笔记本或您首选的兼容 Spark 客户端运行 Spark 代码。此版本添加了关键功能，旨在改善交互式工作负载的体验：
+ **安全 Spark Connect**：将 Spark Connect 添加为经过身份验证和授权的 AWS 端点。
+ **会话级成本归属**：用户可以在 AWS Cost Explorer 或成本和使用情况报告中跟踪每个交互式会话的成本。有关更多信息，请参阅 [会话级成本归属](notebooks-spark-cost-attribution.md)。
+ **高级调试功能**：添加实时 Spark UI 和 Spark History Server 支持，用于调试来自 API 和笔记本的工作负载。有关更多信息，请参阅 [访问 Spark UI](notebooks-spark-ui-access.md#notebooks-spark-ui-access-methods)。
+ **未筛选访问支持**：访问您拥有完整表权限的、受保护的 AWS Glue Data Catalog 表。有关更多信息，请参阅 [将 Lake Formation 与 Athena Spark 工作组搭配使用](notebooks-spark-lakeformation.md)。

### Spark 默认属性
<a name="notebooks-spark-release-versions-spark-35-default-properties"></a>

下表列出适用于 Athena SparkConnect 会话的 Spark 属性及其默认值。


| Key | 默认 值 | 说明 | 
| --- | --- | --- | 
|  `spark.app.id`  |  `<Athena SessionId>`  |  此项不可修改。  | 
|  `spark.app.name`  |  `default`  |    | 
|  `spark.driver.cores`  |  `4`  |  驱动程序使用的核心数。此项在初次启动期间不可修改。  | 
|  `spark.driver.memory`  |  `10g`  |  每个驱动程序使用的内存量。此项在初次启动期间不可修改。  | 
|  `spark.driver.memoryOverhead`  |  `6g`  |  分配给在驱动程序上运行的 Python 工作负载和其他进程的内存开销量。此项在初次启动期间不可修改。  | 
|  `spark.cortex.driver.disk`  |  `64g`  |  Spark 驱动程序磁盘。此项在初次启动期间不可修改。  | 
|  `spark.executor.cores`  |  `4`  |  每个执行程序使用的核心数。此项在初次启动期间不可修改。  | 
|  `spark.executor.memory`  |  `10g`  |  每个驱动程序使用的内存量。  | 
|  `spark.executor.memoryOverhead`  |  `6g`  |  分配给在执行程序上运行的 Python 工作负载和其他进程的内存开销量。此项在初次启动期间不可修改。  | 
|  `spark.cortex.executor.disk`  |  `64g`  |  Spark 执行程序磁盘。此项在初次启动期间不可修改。  | 
|  `spark.cortex.executor.architecture`  |  `AARCH_64`  |  执行程序的架构。  | 
|  `spark.driver.extraJavaOptions`  |  `-Djava.net.preferIPv6Addresses=false -XX:+IgnoreUnrecognizedVMOptions --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED -Djdk.reflect.useDirectMethodHandle=false`  |  Spark 驱动程序的额外 Java 选项。此项在初次启动期间不可修改。  | 
|  `spark.executor.extraJavaOptions`  |  `-Djava.net.preferIPv6Addresses=false -XX:+IgnoreUnrecognizedVMOptions --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED -Djdk.reflect.useDirectMethodHandle=false`  |  Spark 执行程序的额外 Java 选项。此项在初次启动期间不可修改。  | 
|  `spark.executor.instances`  |  `1`  |  要分配的 Spark 执行程序容器的数量。  | 
|  `spark.dynamicAllocation.enabled`  |  `TRUE`  |  开启动态资源分配的选项。此选项可根据工作负载扩展或缩减在应用程序中注册的执行程序数量。  | 
|  `spark.dynamicAllocation.minExecutors`  |  `0`  |  如果开启动态分配，则表示执行程序数量的下限。  | 
|  `spark.dynamicAllocation.maxExecutors`  |  `59`  |  如果开启动态分配，则表示执行程序数量的上限。  | 
|  `spark.dynamicAllocation.initialExecutors`  |  `1`  |  开启动态分配时要运行的初始执行程序数量。  | 
|  `spark.dynamicAllocation.executorIdleTimeout`  |  `60s`  |  在 Spark 将其删除之前，执行程序可保持空闲状态的时间长度。这仅适用于开启动态分配的情况。  | 
|  `spark.dynamicAllocation.shuffleTracking.enabled`  |  `TRUE`  |  启用 DRA 需要启用随机排序跟踪。  | 
|  `spark.dynamicAllocation.sustainedSchedulerBacklogTimeout`  |  `1s`  |  超时：定义 Spark 调度器在触发向集群管理器发出启动新执行程序请求之前，必须观察持续积压待处理任务的时长。  | 
|  `spark.sql.catalogImplementation`  |  `hive`  |    | 
|  `spark.hadoop.hive.metastore.client.factory.class`  |  `com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory`  |  AWS Glue 元存储实现类。  | 
|  `spark.hadoop.hive.metastore.glue.catalogid`  |  `<accountId>`  |  AWS Glue 目录账户 ID。  | 
|  `spark.sql.hive.metastore.sharedPrefixes`  |  `software.amazon.awssdk.services.dynamodb`  |  属性指定一个以逗号分隔的包前缀列表，用于应通过 Application ClassLoader（而不是为 Hive Metastore 客户端代码创建的隔离 ClassLoader）加载的类。  | 
|  `spark.hadoop.fs.s3.impl`  |  `org.apache.hadoop.fs.s3a.S3AFileSystem`  |  定义使用 S3A 的 S3 客户端实现。  | 
|  `spark.hadoop.fs.s3a.impl`  |  `org.apache.hadoop.fs.s3a.S3AFileSystem`  |  定义 S3A 客户端（S3A）的实现。  | 
|  `spark.hadoop.fs.s3n.impl`  |  `org.apache.hadoop.fs.s3a.S3AFileSystem`  |  定义使用 S3A 的本机 S3 客户端（S3N）实现。  | 
|  `spark.hadoop.fs.AbstractFileSystem.s3.impl`  |  `org.apache.hadoop.fs.s3a.S3A`  |    | 
|  `spark.hadoop.fs.s3a.aws.credentials.provider`  |  `software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider`  |    | 
|  `spark.hadoop.fs.s3.customAWSCredentialsProvider`  |  `com.amazonaws.auth.DefaultAWSCredentialsProviderChain`  |    | 
|  `spark.hadoop.mapreduce.output.fs.optimized.committer.enabled`  |  `TRUE`  |  向 Amazon S3 写入数据时，此属性可为 Spark 任务启用优化的提交协议。设置为 true 时，其可帮助 Spark 避免代价高昂的文件重命名操作，实现比默认 Hadoop 提交者更快、更可靠的原子写入。  | 
|  `spark.hadoop.fs.s3a.endpoint.region`  |  `<REGION>`  |  此配置为通过 S3A 客户端访问的 Amazon S3 存储桶显式设置 AWS 区域。  | 
|  `spark.hadoop.fs.s3.getObject.initialSocketTimeoutMilliseconds`  |  `2000`  |  此项指定套接字连接超时（毫秒）。  | 
|  `spark.hadoop.fs.s3a.committer.magic.enabled`  |  `TRUE`  |  此项启用 S3A Magic Committer：一种高性能但专属的提交协议，依赖于底层集群管理器对特殊路径的支持。  | 
|  `spark.hadoop.fs.s3a.committer.magic.track.commits.in.memory.enabled`  |  `TRUE`  |  仅当启用 Magic Committer 时相关，其指定是否应在内存中跟踪任务提交的文件列表，而不是写入临时磁盘文件。  | 
|  `spark.hadoop.fs.s3a.committer.name`  |  `magicv2`  |  此设置显式选择要使用的特定 S3A Output Committer 算法（例如，目录、分区或魔法）。通过指定名称，您可以选择管理临时数据、处理任务失败以及对目标 Amazon S3 路径执行最终原子提交的策略。  | 
|  `spark.hadoop.fs.s3.s3AccessGrants.enabled`  |  `FALSE`  |  在通过 S3A/EMRFS 文件系统客户端访问 Amazon S3 数据时，支持 Amazon S3 访问权限管控的属性。  | 
|  `spark.hadoop.fs.s3.s3AccessGrants.fallbackToIAM`  |  `FALSE`  |  启用 Amazon S3 访问权限管控后，此属性控制访问权限管控查询失败或未提供足够的权限时，Amazon S3 客户端是否应回退到传统 IAM 凭证。  | 
|  `spark.pyspark.driver.python`  |  `/usr/bin/python3.11`  |  驱动程序的 Python 路径。  | 
|  `spark.pyspark.python`  |  `/usr/bin/python3.11`  |  执行程序的 Python 路径。  | 
|  `spark.python.use.daemon`  |  `TRUE`  |  此配置控制 Spark 是否在每个执行程序上使用 Python worker 守护进程。启用后（默认值为 true），执行程序将在任务之间保持 Python worker 处于活动状态，以避免为每个任务重复启动和初始化新 Python 解释器带来的开销，从而显著提升 Pyspark 应用程序的性能。  | 
|  `spark.sql.execution.arrow.pyspark.enabled`  |  `TRUE`  |  允许使用 Apache Arrow 来优化 PySpark 中 JVM 和 Python 进程之间的数据传输。  | 
|  `spark.sql.execution.arrow.pyspark.fallback.enabled`  |  `TRUE`  |  配置属性，控制使用 Apache Arrow 优化在 JVM 和 Python 之间传输数据发生错误时 Spark 的行为。  | 
|  `spark.sql.parquet.fs.optimized.committer.optimization-enabled`  |  `TRUE`  |  配置属性，控制 Spark 在向某些文件系统（特别是 Amazon S3 等云存储系统）写入 Parquet 文件时是否使用优化的文件提交器。  | 
|  `spark.sql.parquet.output.committer.class`  |  `com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter`  |  Spark 配置属性，指定编写 Parquet 文件时要使用的 Hadoop OutputCommitter 的完全限定类名。  | 
|  `spark.resourceManager.cleanupExpiredHost`  |  `TRUE`  |  此属性控制驱动程序是否主动清理与在已删除或已过期节点上运行的执行程序关联的 Spark 应用程序资源。  | 
|  `spark.blacklist.decommissioning.enabled`  |  `TRUE`  |  使 Spark 的逻辑能够自动将集群管理器正在停用（正常关闭）的执行程序列入黑名单的属性。此项可防止调度器向即将退出的执行程序发送新任务，从而提高资源缩减期间的作业稳定性。  | 
|  `spark.blacklist.decommissioning.timeout`  |  `1h`  |  Spark 在将任务从正在停用的执行程序成功迁出前等待的最长时间，超过此时间会将该主机列入黑名单。  | 
|  `spark.stage.attempt.ignoreOnDecommissionFetchFailure`  |  `TRUE`  |  告知 Spark 如果从正在停用的执行程序读取随机排序数据时发生提取失败应宽松处理，不要让整个阶段的尝试失效。提取失败将被可恢复，并且 Spark 将从不同的位置重新提取数据（可能需要重新计算），在正常关闭期间优先确保作业完成而非严格执行错误处理。  | 
|  `spark.decommissioning.timeout.threshold`  |  `20`  |  此属性通常在内部或特定的集群管理器设置中使用，用于定义 Spark 预计主机停用过程所花的最长总持续时间。如果实际停用时间超出此阈值，Spark 可能会采取激进措施来释放资源，例如将主机列入黑名单或请求强制终止。  | 
|  `spark.files.fetchFailure.unRegisterOutputOnHost`  |  `TRUE`  |  当任务无法从特定主机获取随机排序或 RDD 数据时，将此项设置为 true 会指示 Spark 在该主机上取消注册与失败应用程序关联的所有输出块。这样可以防止后续任务尝试从不可靠的主机获取数据，迫使 Spark 重新计算其他位置所需的区块并提升工作稳健性，以应对间歇性网络问题。  | 