暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅析 Apache Spark3.2.0 新特性

Just do DT 2021-12-01
2629

概述


在北京时间2021 年 10 月 13 日,Spark 官方正式发布 Spark3.2.0 。Apache Spark 3.2.0 是 Apache Spark 3.x 系列的第三个版本。在开源社区的巨大贡献下,此版本成功解决了 1700 多个 issue。
在此版本中,Spark 支持 Spark 上的 Pandas API 层。Pandas 用户可以通过一行代码更改来扩展他们在 Spark 上的应用程序。其他主要更新包括 RocksDB StateStore 支持、会话窗口支持、基于推送的 shuffle 支持、ANSI SQL INTERVAL 类型、默认启用自适应查询执行 (AQE) 和 ANSI SQL 模式 GA。
如果要下载 Apache Spark 3.2.0,请访问下载页面(https://spark.apache.org/downloads.html)。详细的改动可以看Apache Spark JIRA(https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315420&version=12349407)。我们在这里整理了一份高级更改列表,按主要模块分组。

特别重要的特性

  • 在 PySpark 上支持 Pandas API 层 (SPARK-34849)
  • 默认启用自适应查询执行(AQE)(SPARK-33679)
  • 支持push-based shuffle,提高shuffle效率 (SPARK-30602)
  • 添加 RocksDB StateStore 实现 (SPARK-34198)
  • 基于 EventTime 的会话化(会话窗口) (SPARK-10816)
  • ANSI SQL 模式 GA (SPARK-35030)
  • 支持 ANSI SQL INTERVAL 类型 (SPARK-27790)
  • 查询编译延迟减少 (SPARK-35042, SPARK-35103, SPARK-34989)
  • 支持 Scala 2.13 (SPARK-34218)

Core and Spark SQL

ANSI SQL 兼容性增强

  • 支持 ANSI SQL INTERVAL 类型 (SPARK-27790)
  • ANSI 模式下的新类型强制语法规则 (SPARK-34246)
  • 支持横向子查询 (SPARK-34382)
  • ANSI 模式:IntegralDivide 在溢出时抛出异常 (SPARK-35152)
  • ANSI 模式:检查平均溢出 (SPARK-35955)
  • Block count(table.*) 遵循 ANSI 标准和其他 SQL 引擎(SPARK-34199)
  • LEAD/LAG/NTH_VALUE/FIRST_VALUE/LAST_VALUE 支持 (IGNORERESPECT) NULL(SPARK-30789)

性能

  • 查询编译延迟
    • 支持转换/解析函数及其调用点中的遍历修剪 (SPARK-35042)
    • 提高 mapChildren 和 withNewChildren 方法的性能 (SPARK-34989)
    • 提高类型强制规则的性能 (SPARK-35103)
  • 查询优化
    • 删除优化器中的冗余聚合 (SPARK-33122)
    • 通过join的项目下限 (SPARK-34622)
    • LEFT SEMI 和 LEFT ANTI 连接的下推限制 (SPARK-36404, SPARK-34514)
    • 当分区规格为空时通过 WINDOW 下限 (SPARK-34575)
    • 在 CBO 中使用相对成本比较函数 (SPARK-34922)
    • 联合、排序和范围运算符的基数估计 (SPARK-33411)
    • 如果加入可以计划为广播加入,则仅在聚合上按下 LeftSemi/LeftAnti(SPARK-34081)
    • UnwrapCastInBinaryComparison 支持 In/InSet 谓词 (SPARK-35316)
    • 子表达式消除增强 (SPARK-35448)
    • 分区修剪后保留必要的统计信息 (SPARK-34119)
    • 分离桶过滤器修剪和桶表扫描 (SPARK-32985)
  • 查询执行
    • 默认启用自适应查询执行 (SPARK-33679)
    • 当加入开始时是广播哈希加入或没有重用的广播交换时,支持AQE中的动态分区修剪(DPP) (SPARK-34168, SPARK-35710)
    • 在合并 shuffle 分区之前优化 skew join (SPARK-35447)
    • 支持使用规则的 AQE 侧 shuffled hash join 公式 (SPARK-35282)
    • 支持 AQE 侧广播哈希加入阈值 (SPARK-35264)
    • 允许 AQE 成本评估器的自定义插件 (SPARK-35794)
    • 自适应查询执行
    • 默认启用 Zstandard 缓冲池 (SPARK-34340, SPARK-34390)
    • 为排序合并连接的所有连接类型添加代码生成 (SPARK-34705)
    • 整个计划交换和子查询重用 (SPARK-29375)
    • 广播嵌套循环连接改进 (SPARK-34706)
    • 允许并发写入器写入动态分区和桶表 (SPARK-26164)
    • 提高 Spark Thrift 服务器中处理 FETCH_PRIOR 的性能 (SPARK-33655)
Connector Enhancements
  • Parquet
    • 将 Apache Parquet 升级到 1.12.1 版本 (SPARK-36726)
    • 支持 Parquet 矢量化阅读器中的列索引 (SPARK-34289)
    • 添加新的镶木地板数据源选项以控制读取中的日期时间变基 (SPARK-34377)
    • 读取在 parquet 中存储为 int32 物理类型的 parquet 无符号类型(SPARK-34817)
    • 将存储为有符号 int64 物理类型的 Parquet unsigned int64 逻辑类型读取为 decimal(20, 0) (SPARK-34786)
    • 使用矢量化 Parquet 阅读器时处理列索引 (SPARK-34859)
    • 改进 Parquet 过滤器下推 (SPARK-32792)
  • ORC
    • 升级 Apache ORC 到 1.6.11 版本 (SPARK-36482)
    • 支持Apache ORC强制位置进化 (SPARK-32864)
    • 支持 ORC 矢量化阅读器中的嵌套列 (SPARK-34862)
    • ORC数据源支持ZSTD、LZ4压缩 (SPARK-33978, SPARK-35612)
    • 在任务配置中设置读取列的列表以减少ORC数据的读取 (SPARK-35783)
  • Avro
    • 将 Apache Avro 升级到 1.10.2 版本 (SPARK-34778)
    • 使用“avro.schema.literal”支持分区 Hive 表的 Avro 模式演变(SPARK-26836)
    • 添加新的 Avro 数据源选项以控制读取中的日期时间变基 (SPARK-34404)
    • 在 Avro 中添加对用户提供的架构 URL 的支持 (SPARK-34416)
    • 添加对位置 Catalyst-to-Avro 模式匹配的支持 (SPARK-34365)
  • JSON
    • 升级 Jackson 到 2.12.3 版本 (SPARK-35550)
    • 允许 JSON 数据源将非 ASCII 字符写入代码点(SPARK-35047)
  • CSV
    • 将 univocity-parsers 升级到 2.9.1(SPARK-33940)
  • JDBC
    • 将 JDBC SQL TIME 类型映射到 TimestampType,无论时区如何,时间部分都是固定的 (SPARK-34357)
    • 在 JDBCRelation 中计算更精确的分区步幅 (SPARK-34843)
    • 支持 JDBC 数据源中的 refreshKrb5Config 选项 (SPARK-35226)
  • Hive Metastore 支持过滤器 NOT IN (SPARK-34538)
Kubernetes 增强功能
  • 将 Kubernetes 客户端升级到 5.4.1 (SPARK-35660)
  • 支持 spark.kubernetes.executor.disableConfigMap (SPARK-34316)
  • 支持远程模板文件 (SPARK-34783)
  • 引入对挂起 POD 的限制 (SPARK-36052)
  • 支持重用PVC的shuffle数据恢复 (SPARK-35593)
  • 支持应用程序终止期间的早期驱动程序服务清理 (SPARK-35131)
  • 在执行程序启动之前添加驱动程序就绪超时配置 (SPARK-32975)
  • 支持 driver 自有按需 PVC(SPARK-35182)
  • 最长退役时间并允许排除排除(SPARK-34104)
  • 支持只用token提交到k8s (SPARK-33720)
  • 为自定义功能步骤添加开发人员 API (SPARK-33261)
Data Source V2 API
  • 聚合下推 API (SPARK-34952)
  • 功能目录API (SPARK-27658)
  • DataSourceV2 函数目录实现 (SPARK-35260)
  • 添加 API 以在写入时请求分发和排序 (SPARK-33779)
  • 添加接口以传递写入所需的排序和聚类 (SPARK-23889)
  • 支持来自 Datasource v2 扫描的指标 (SPARK-34338)
  • 在写入路径支持 metrics  (SPARK-36030)
  • 支持在所需分布上使用静态数字进行分区并在写入时排序 (SPARK-34255)
  • 支持动态过滤 (SPARK-35779)
  • 支持本地扫描 (SPARK-35535)
  • MERGE ... UPDATE/INSERT * 应该按名称解析 (SPARK-34720)
功能增强
  • 子查询改进
    • 改进相关子查询 (SPARK-35553)
    • 允许非聚合的单行相关标量子查询(SPARK-28379)
    • 聚合子查询时只允许相关等式谓词的子集 (SPARK-35080)
    • 使用外部查询计划解析子查询中的星型表达式 (SPARK-35618)
  • 新的内置函数
    • current_user (SPARK-21957)
    • product (SPARK-33678)
    • regexp_like,regexp (SPARK-33597, SPARK-34376)
    • try_cast (SPARK-34881)
    • try_add (SPARK-35162)
    • try_divide (SPARK-35162)
    • bit_get (SPARK-33245)
  • 默认使用 Apache Hadoop 3.3.1 (SPARK-29250)
  • 公开用户定义类型 (UDT) API (SPARK-7768)
  • 为 shuffle 块添加校验和 (SPARK-35275)
  • 默认启用 spark.storage.replication.proactive (SPARK-33870)
  • 添加表函数注册表 (SPARK-34678)
  • 在停止 SparkContext 期间支持回退存储清理 (SPARK-34142)
  • 支持来自 Scala Dataset API 的 Java 枚举 (SPARK-23862)
  • 添加带有常春藤坐标的 JAR 应该与 Hive 传递行为兼容 (SPARK-34506)
  • 支持 ADD ARCHIVE 和 LIST ARCHIVES 命令(SPARK-34603)
  • 支持 ADD FILE/JAR/ARCHIVE 命令的多路径(SPARK-35105)
  • 支持存档文件作为 CREATE FUNCTION USING 语法的资源 (SPARK-35236)
  • 从 ServiceLoader 加载 SparkSessionExtensions (SPARK-35380)
  • 为函数添加句子函数{scala,py} (SPARK-35418)
  • 扩展解码功能,与主流数据库保持一致 (SPARK-33527)
  • 对使用 Hive Metastore 进行分区管理的非 Hive 表应用 spark.sql.hive.metastorePartitionPruning (SPARK-36128)
  • 支持创建带有空列的表 (SPARK-36241)
  • 避免使用 CTE 内联不确定性 (SPARK-36447)
  • 支持分析特定数据库中的所有表(SPARK-33687)
  • 标准化 Spark 中的异常消息 (SPARK-33539)
其他显着变化
  • 监控
    • ExternalShuffleService 的新指标 (SPARK-35258)
    • 添加新的阶段级 REST API 和参数 (SPARK-26399)
    • 支持 REST API 中的任务和执行器指标分布 (SPARK-34488)
    • 为哈希聚合添加回退指标 (SPARK-35529, SPARK-34237)
    • 将 exec 丢失的原因传播到 Web UI (SPARK-34764)
  • 将 count_distinct 作为选项添加到 Dataset#summary (SPARK-34165)
  • 将 SQLSTATE 和 ERRORCODE 引入 SQL Exception (SPARK-34920)
  • 在 sql/core 中实现 ScriptTransform (SPARK-31936)
  • 在刷新 v1 表时保持从属缓存 (SPARK-34138)
  • 使 BlockManagerMaster 驱动程序心跳超时可配置 (SPARK-34278)
  • 由 spark.buffer.size 设置的 io.file.buffer.size 将通过意外加载 hive-site.xml 覆盖可能导致性能回归 (SPARK-34346)
  • 支持远程调度器池文件 (SPARK-35083)
  • 使 shuffle 服务名称在客户端可配置,并允许在服务器端进行基于类路径的配置覆盖 (SPARK-34828)
  • ExecutorMetricsPoller 应该在 stageTCMP 中保持 stage entry 直到发生心跳 (SPARK-34779)
  • 用 RewriteDistinctAggregates 中的过滤器子句替换 if (SPARK-34882)
  • CREATE TABLE LIKE 应该尊重保留的表属性(SPARK-34935)
  • 修复嵌套列修剪以从结构数组中提取不区分大小写的结构字段(SPARK-34963)
  • 在 YARN 集群模式下将 ivySettings 文件传送到驱动程序 (SPARK-34472)
  • 从 USING/NATURAL JOIN 中解决重复的公共列 (SPARK-34527)
  • Invoke 应该找到具有正确数量参数的方法 (SPARK-35278)
  • 不要从没有聚合函数的聚合表达式中优化出分组表达式 (SPARK-34581)
  • 支持通过/重新分区提示解析分发/集群缺少的属性 (SPARK-35331)
  • 通过推断缺少的配置来改进 s3a 魔术提交者支持 (SPARK-35383)
  • 避免目标目录不存在导致文件重命名失败 (SPARK-35106)
  • BlockManagerMasterEndpoint 在更新过程中不应忽略仅索引的 shuffle 文件 (SPARK-35589)
  • 修改 Set 命令结果中的敏感信息 (SPARK-35576)
  • 更新状态模式以能够接受长 JSON(SPARK-35602)
  • 考虑将 STRUCT 数据类型定义中的‘:’设为可选 (SPARK-35706)
  • 视图不应捕获 RelationConversions 中使用的配置 (SPARK-35792)
  • 附加新的嵌套结构字段而不是使用空填充对 unionByName 进行排序 (SPARK-35290)
  • 使用 Void 作为 NullType 的类型名 (SPARK-36224)

Structured Streaming

主要特点
  • 添加 RocksDB StateStore 实现 (SPARK-34198)
  • 基于 EventTime 的会话化(会话窗口) (SPARK-10816)
  • 将 Kafka 客户端升级到 2.8.0(SPARK-33913)
其他显着变化
  • 支持用户定义的初始状态与结构化流中的 flatMapGroupsWithState(SPARK-35896)
  • 批量模式下支持 flatMapGroupsWithState 的初始状态 (SPARK-36132)
  • 介绍Kafka数据源起始偏移时间戳不匹配偏移策略(SPARK-35611)
  • 在 Kafka 源中引入一个新的 Option 来指定每个触发器要读取的最小记录数 (SPARK-35312)
  • 在 StreamingQueryProgress 中为有状态运算符包含更细粒度的指标 (SPARK-35896)
  • 通过进度报告公开源指标并添加 Kafka 用例以报告延迟 (SPARK-34854)
  • 添加忽略 FileStreamSink 元数据目录的配置 (SPARK-35565)
  • 将最新的偏移量添加到源进度 (SPARK-33955)

PySpark

禅宗计划
  • Spark 上的 Pandas API(SPARK-34849)
    • 为 pandas-on-Spark 启用 mypy (SPARK-34941)
    • 实现 CategoricalDtype 支持 (SPARK-35997, SPARK-36185)
    • 完成Series和Index的基本操作 (SPARK-36103, SPARK-36104, SPARK-36192)
    • 将行为与熊猫 1.3 匹配 (SPARK-36367)
    • 将带有 NaN 的 Series 上的行为与 Pandas 匹配 ’(SPARK-36031, SPARK-36310)
    • 实现整数系列和索引的一元运算符“反转” (SPARK-36003)
    • 实现 CategoricalIndex.map 和 DatetimeIndex.map (SPARK-36470)
    • 实现 Index.map (SPARK-36469)
  • 对 Python 工作者的故障处理程序支持崩溃 (SPARK-36062)
  • 跨函数 API 使用 Snake 命名规则 (SPARK-34306)
  • 默认启用 spark.sql.execution.pyspark.udf.simplifiedTraceback.enabled (SPARK-35419)
  • 支持在创建 DataFrame 时将嵌套的 dict 推断为结构 (SPARK-35929)
其他显着变化
  • 默认启用固定线程模式 (SPARK-35303)
  • 为 Arrow 执行添加 NullType 支持 (SPARK-33489)
  • 向 toPandas 添加 Arrow self_destruct 支持 (SPARK-32953)
  • 为 PySpark pin 线程模式添加线程目标包装器 API (SPARK-35498)

MLlib

性能改进
  • BucketedRandomProjectionLSH 变换优化 (SPARK-34220)
  • w2v findSynonyms 优化 (SPARK-34189)
  • 通过跳过边界检查来优化稀疏 GEMM (SPARK-35707)
  • 通过 GEMV 提高 ML ALS 推荐的性能 (SPARK-33518)
模型训练改进
  • Refactor Logistic Aggregator - 支持虚拟居中 (SPARK-34797)
  • 具有截距支持中心的二元 Logistic 回归 (SPARK-34858, SPARK-34448)
  • 具有截距支持中心的多项 Logistic 回归 (SPARK-34860)
BLAS 改进
  • 将 com.github.fommil.netlib 完全替换为 dev.ludovic.netlib:2.0(SPARK-35295)
  • 添加矢量化 BLAS 实现 (SPARK-33882)
  • 使用 dev.ludovic.netlib 加速回退 BLAS (SPARK-35150)
其他显着变化
  • OVR 变换修复潜在的列冲突 (SPARK-34356)
编程指南: Machine Learning Library (MLlib) Guide.*

SparkR

  • 使用 keyserver.ubuntu.com 作为 CRAN 的密钥服务器 (SPARK-35885)
编程指南: SparkR (R on Spark).*

GraphX

  • 允许关闭静态 PageRank 实用程序应用的规范化 (SPARK-35357)
编程指南: GraphX Programming Guide.*

弃用和删除

  • 弃用 spark.launcher.childConectionTimeout (SPARK-33717)
  • 弃用 GROUP BY ... GROUPING SETS (...) 并提升 GROUP BY GROUPING SETS (...) (SPARK-34932)
  • 在 Spark 文档中弃用 Python 3.6 (SPARK-35939)
  • 弃用 ps.broadcast API(SPARK-35810)
  • 弃用 num_files 参数(SPARK-35807)
  • 弃用 DataFrame.to_spark_io (SPARK-35811)

已知的问题

  • 支持通过 i/o 加密批量获取 shuffle 块 (SPARK-34827)
  • 无法为序列文件 I/O 加载 Snappy 编解码器 (SPARK-36681)
  • 如果表是使用大写模式创建的,则无法插入到 hive 存储桶表中 (SPARK-35531)
  • 在 Spark 中读取没有显式列名的 Hive 视图失败 (SPARK-36905)
  • 由于固定线程模式,作业取消导致 Jupyter 上的 py4j 错误 (SPARK-37004)
  • 驱动程序错误地报告已删除的执行程序在 UI 中处于活动状态 (SPARK-35011)

参考


  • https://spark.apache.org/releases/spark-release-3-2-0.html

  • 大家也可以看看 Databricks 开源组技术主管,Apache Spark PMC member,Spark 社区最活跃的贡献者之一范文臣带来了主题为What's new in Spark 3.2.0


文章转载自Just do DT,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论