Spark 1.5.0 发布

Spark 1.5.0 是 1.x 系列的第六个版本。此版本包含来自 230 多个贡献者和 80 多个机构的 1400 多个补丁。要下载 Spark 1.5.0,请访问下载页面。

您可以查阅 JIRA 以获取详细变更。我们在此处整理了高层级变更列表。

API: RDD、DataFrame 和 SQL

  • 列名的一致解析(参见行为变更部分)
  • SPARK-3947: 新的实验性用户定义聚合函数 (UDAF) 接口
  • SPARK-8300: 用于广播连接的 DataFrame 提示
  • SPARK-8668: 用于将 SQL 表达式转换为 DataFrame 列的 expr 函数
  • SPARK-9076: 改进了对 NaN 值的支持
    • NaN 函数:isnan, nanvl
    • dropna/fillna 除 NULL 值外,也填充/删除 NaN 值
    • NaN = NaN 的相等性测试返回 true
    • NaN 大于所有其他值
    • 在聚合中,NaN 值归为一组
  • SPARK-8828: 当所有输入值为 null 时,Sum 函数返回 null
  • 数据类型
    • SPARK-8943: 用于时间间隔的 CalendarIntervalType
    • SPARK-7937: 支持 StructType 上的排序
    • SPARK-8866: TimestampType 的精度降至 1 微秒 (1us)
  • SPARK-8159: 新增约 100 个函数,包括日期/时间字符串数学
  • SPARK-8947: 改进了计划分析阶段的类型强制转换和错误报告(即,大多数错误应在分析时而不是执行时报告)
  • SPARK-1855: 仅支持内存和本地磁盘检查点

后端执行:DataFrame 和 SQL

  • 几乎所有 DataFrame/SQL 函数的代码生成默认开启
  • DataFrame/SQL 中改进的聚合执行
    • 缓存友好的内存哈希映射布局
    • 内存耗尽时回退到基于外部排序的聚合
    • 聚合的代码生成默认开启
  • DataFrame/SQL 中改进的连接执行
    • 在 shuffle join 中(对于左/右外连接和内连接),优先使用(外部)排序合并连接而非哈希连接,即,连接数据大小现在受磁盘而非内存限制
    • 支持对左/右外连接使用(外部)排序合并连接方法
    • 支持广播外连接
  • DataFrame/SQL 中改进的排序执行
    • 用于排序的缓存友好内存布局
    • 当数据超出内存大小时回退到外部排序
    • 用于快速比较的代码生成比较器
  • 原生内存管理和表示
    • 紧凑的二进制内存数据表示,内存使用量更低
    • 显式计算执行内存,不依赖 JVM GC,从而减少 GC 并实现更稳健的内存管理
  • SPARK-8638: 改进了窗口函数的性能和内存使用
  • 指标度量、报告和可视化
    • SPARK-8856: DataFrame/SQL 的计划可视化
    • SPARK-8735: 在 Web UI 中公开运行时内存使用指标
    • SPARK-4598: Web UI 中具有大量任务的作业分页

集成:数据源、Hive、Hadoop、Mesos 和集群管理

  • Mesos
    • SPARK-6284: 支持框架认证和 Mesos 角色
    • SPARK-6287: Mesos 粗粒度模式下的动态分配
    • SPARK-6707: 用户在 Mesos slave 属性上指定约束
  • YARN
    • SPARK-4352: YARN 中的动态分配与首选位置协同工作
  • 独立集群管理器
  • SPARK-6906: 改进的 Hive 和元存储支持
    • SPARK-8131: 改进的 Hive 数据库支持
    • Hive 依赖升级到 Hive 1.2
    • 支持连接到 Hive 0.13、0.14、1.0/0.14.1、1.1、1.2 元存储
    • 支持将分区修剪下推到元存储(默认关闭;配置标志 spark.sql.hive.metastorePartitionPruning)
    • 支持以 Hive 兼容格式在元存储中持久化数据
  • SPARK-9381: 支持 JSON 数据源的数据分区
  • SPARK-5463: Parquet 改进
    • 升级到 Parquet 1.7
    • 加快元数据发现和模式合并
    • 谓词下推默认开启
    • SPARK-6774: 通过完全实现 parquet-format 规范中定义的所有向后兼容性规则,支持读取由各种库/系统生成的非标准旧版 Parquet 文件
    • SPARK-4176: 支持写入精度大于 18 的 decimal 值
  • ORC 改进(各种错误修复)
  • SPARK-8890: 更快、更稳健的动态分区插入
  • SPARK-9486: 用于外部数据源指定短名称的 DataSourceRegister 接口

R 语言

  • SPARK-6797: 支持 R 中的 YARN 集群模式
  • SPARK-6805: 带 R formula 的 GLM、二项式/高斯族和弹性网正则化
  • SPARK-8742: 改进了 R 的错误消息
  • SPARK-9315: 使 DataFrame 函数更像 R 的别名

机器学习和高级分析

Spark Streaming

  • SPARK-7398: 背压:Spark Streaming 中的自动动态速率控制,用于处理突发输入流。这允许流式管道动态适应摄取速率和计算负载的变化。这适用于接收器以及 Direct Kafka 方法。
  • 用于流式数据源的 Python API
  • SPARK-3258: 用于流式机器学习算法的 Python API:K-Means、线性回归和逻辑回归
  • SPARK-9215: 改进了 Kinesis 流的可靠性:无需启用预写日志即可在驱动程序故障后保存和恢复接收到的数据
  • Direct Kafka API 已毕业:不再是实验性功能。
  • SPARK-8701: UI 中的输入元数据:Kafka 偏移量和输入文件在批处理详细信息 UI 中可见
  • SPARK-8882: 改进了接收器在集群中的负载均衡和调度
  • SPARK-4072: 在 web UI 中包含流式存储

弃用、移除、配置和行为变更

Spark Core

  • DAGScheduler 的本地任务执行模式已被移除
  • 默认驱动程序和执行器内存从 512m 增加到 1g
  • JVM 的 MaxPermSize 默认设置从 128m 增加到 256m
  • spark-shell 的默认日志级别从 INFO 更改为 WARN
  • 基于 NIO 的 ConnectionManager 已弃用,并将在 1.6 中移除

Spark SQL & DataFrames

  • 使用手动管理内存 (Tungsten) 优化的执行现在默认启用,同时表达式评估的代码生成也默认启用。这些功能都可以通过将 spark.sql.tungsten.enabled 设置为 false 来禁用。
  • Parquet 模式合并不再默认启用。可以通过将 spark.sql.parquet.mergeSchema 设置为 true 来重新启用。
  • Python 中将字符串解析为列现在支持使用点 (.) 来限定列或访问嵌套值。例如 df['table.column.nestedField']。但是,这意味着如果您的列名包含任何点,则现在必须使用反引号进行转义(例如,table.`column.with.dots`.nested)。
  • 内存中列式存储分区修剪默认开启。可以通过将 spark.sql.inMemoryColumnarStorage.partitionPruning 设置为 false 来禁用。
  • 不再支持无限精度十进制列,Spark SQL 强制最大精度为 38。从 BigDecimal 对象推断模式时,现在使用精度 (38, 18)。如果在 DDL 中未指定精度,则默认值仍为 Decimal(10, 0)。
  • 时间戳现在以 1us 的精度处理,而不是 100ns。
  • 当所有输入值为 null 时(1.4 版本前为 null,1.4 版本为 0),Sum 函数返回 null。
  • 在 SQL 方言中,浮点数现在解析为 decimal。HiveQL 解析保持不变。
  • SQL/DataFrame 函数的规范名称现在为小写(例如 sum 与 SUM)。
  • 已确定在启用推测执行时使用 DirectOutputCommitter 是不安全的,因此当启用推测执行时,Parquet 将不使用此输出提交器,无论配置如何。
  • JSON 数据源不会自动加载由其他应用程序创建的新文件(即,未通过 Spark SQL 插入到数据集中的文件)。对于 JSON 持久表(即,表的元数据存储在 Hive Metastore 中),用户可以使用 REFRESH TABLE SQL 命令或 HiveContext 的 refreshTable 方法将这些新文件包含到表中。对于表示 JSON 数据集的 DataFrame,用户需要重新创建 DataFrame,并且新 DataFrame 将包含新文件。

Spark Streaming

  • 新的实验性背压功能可以通过将配置 spark.streaming.backpressure.enabled 设置为 true 来启用。
  • Kinesis 流无需启用预写日志。更新后的 Kinesis 接收器跟踪每个批次中接收到的 Kinesis 序列号,并使用该信息在从故障中恢复时重新读取必要的数据。
  • 接收器在失败时重新启动的次数不受最大 Spark 任务尝试次数的限制。系统将始终尝试在失败后重新启动接收器,直到 StreamingContext 停止。
  • 改进了接收器在执行器之间的负载均衡,即使在重新启动后也是如此。
  • 在使用 queueStream 时启用检查点会抛出异常,因为 queueStream 无法进行检查点。但是,我们发现这会破坏某些现有应用程序。因此,此更改将在 Spark 1.5.1 中恢复。

MLlib

在 spark.mllib 包中,没有破坏性 API 更改,但有一些行为更改

  • SPARK-9005: RegressionMetrics.explainedVariance 返回平均回归平方和。
  • SPARK-8600: NaiveBayesModel.labels 变为有序。
  • SPARK-3382: GradientDescent 的默认收敛容差为 1e-3,因此迭代可能比 1.4 更早结束。

在实验性 spark.ml 包中,存在一项破坏性 API 更改和一项行为更改

  • SPARK-9268: 由于 Scala 编译器错误,Java 的可变参数支持已从 Params.setDefault 中移除。
  • SPARK-10097: 添加了 Evaluator.isLargerBetter 以指示指标排序。RMSE 等指标不再像 1.4 中那样翻转符号。

已知问题

以下问题在 1.5.0 中已知,并将在 1.5.1 版本中修复。

SQL/DataFrame

  • SPARK-10301: 读取具有不同模式(模式合并)的嵌套结构 parquet 文件可能会返回错误的结果
  • SPARK-10466: 在基于排序的 shuffle 过程中(带数据溢出)溢出数据时发生 AssertionError
  • SPARK-10441: Timestamp 数据类型无法写入 JSON
  • SPARK-10495: 保存到 JSON 的 Date 值以字符串形式存储,表示自纪元 (1970-01-01 00:00:00 UTC) 以来的天数,而不是“yyyy-mm-dd”格式的字符串。
  • SPARK-10403: Tungsten 模式不适用于 tungsten-sort shuffle 管理器(默认关闭)
  • SPARK-10422: 内存中带字典编码的字符串类型缓存已损坏
  • SPARK-10434: Spark 1.5.0 写入的包含 null 元素数组的 Parquet 文件无法被早期版本的 Spark 读取

Streaming

  • SPARK-10224: 优雅停止 StreamingContext 时有很小的数据丢失几率

致谢

我们感谢以下组织使用其工作负载测试了发布候选版本:Mesosphere, Typesafe, Tencent, Palantir, Cloudera, Hortonworks, Huawei, Shopify, Netflix, Intel, Yahoo, Kixer, UC Berkeley and Databricks。

最后但同样重要的是,没有以下贡献者,此版本是不可能实现的:Aaron Davidson, Adam Roberts, Ai He, Akshat Aranya, Alex Shkurenko, Alex Slusarenko, Alexander Ulanov, Alok Singh, Amey Chaugule, Andrew Or, Andrew Ray, Animesh Baranawal, Ankur Chauhan, Ankur Dave, Ben Fradet, Bert Greevenbosch, Bimal Tandel, Brennan Ashton, Brennon York, Brian Lockwood, Bryan Cutler, Burak Yavuz, Calvin Jia, Carl Anders Duvel, Carson Wang, Chen Xu, Cheng Hao, Cheng Lian, Cheolsoo Park, Chris Freeman, Christian Kadner, Cody Koeninger, Damian Guy, Daniel Darabos, Daniel Emaasit, Daoyuan Wang, Dariusz Kobylarz, David Arroyo Cazorla, Davies Liu, DB Tsai, Dennis Huo, Deron Eriksson, Devaraj K, Dibyendu Bhattacharya, Dong Wang, Emiliano Leporati, Eric Liang, Favio Vazquez, Felix Cheung, Feynman Liang, Forest Fang, Francois Garillot, Gen Tang, George Dittmar, Guo Wei, GuoQiang Li, Han JU, Hao Zhu, Hari Shreedharan, Herman Van Hovell, Holden Karau, Hossein Falaki, Huang Zhaowei, Hyukjin Kwon, Ilya Ganelin, Imran Rashid, Iulian Dragos, Jacek Lewandowski, Jacky Li, Jan Prach, Jean Lyn, Jeff Zhang, Jiajin Zhang, Jie Huang, Jihong MA, Jonathan Alter, Jose Cambronero, Joseph Batchik, Joseph Gonzalez, Joseph K. Bradley, Josh Rosen, Judy Nash, Juhong Park, Kai Sasaki, Kai Zeng, KaiXinXiaoLei, Kan Zhang, Kashif Rasul, Kay Ousterhout, Keiji Yoshida, Kenichi Maehashi, Keuntae Park, Kevin Conor, Konstantin Shaposhnikov, Kousuke Saruta, Kun Xu, Lars Francke, Leah McGuire, lee19, Liang-Chi Hsieh, Lianhui Wang, Luca Martinetti, Luciano Resende, Manoj Kumar, Marcelo Vanzin, Mark Smith, Martin Zapletal, Matei Zaharia, Mateusz Buskiewicz, Matt Massie, Matthew Brandyberry, Meethu Mathew, Meihua Wu, Michael Allman, Michael Armbrust, Michael Davies, Michael Sannella, Michael Vogiatzis, Michel Lemay, Mike Dusenberry, Min Zhou, Mingfei Shi, mosessky, Moussa Taifi, Mridul Muralidharan, NamelessAnalyst, Namit Katariya, Nan Zhu, Nathan Howell, Navis Ryu, Neelesh Srinivas Salian, Nicholas Chammas, Nicholas Hwang, Nilanjan Raychaudhuri, Niranjan Padmanabhan, Nishkam Ravi, Nishkam Ravi, Noel Smith, Oleksiy Dyagilev, Oleksiy Dyagilev, Paavo Parkkinen, Patrick Baier, Patrick Wendell, Pawel Kozikowski, Pedro Rodriguez, Perinkulam I. Ganesh, Piotr Migdal, Prabeesh K, Pradeep Chhetri, Prayag Chandran, Punya Biswal, Qian Huang, Radek Ostrowski, Rahul Palamuttam, Ram Sriharsha, Rekha Joshi, Rekha Joshi, Rene Treffer, Reynold Xin, Roger Menezes, Rohit Agarwal, Rosstin Murphy, Rowan Chattaway, Ryan Williams, Saisai Shao, Sameer Abhyankar, Sandy Ryza, Santiago M. Mola, Scott Taylor, Sean Owen, Sephiroth Lin, Seth Hendrickson, Sheng Li, Shilei Qian, Shivaram Venkataraman, Shixiong Zhu, Shuo Bai, Shuo Xiang, Simon Hafner, Spiro Michaylov, Stan Zhai, Stefano Parmesan, Steve Lindemann, Steve Loughran, Steven She, Su Yan, Sudhakar Thota, Sun Rui, Takeshi YAMAMURO, Takuya Ueshin, Tao Li, Tarek Auel, Tathagata Das, Ted Blackman, Ted Yu, Thomas Omans, Thomas Szymanski, Tien-Dung Le, Tijo Thomas, Tim Ellison, Timothy Chen, Tom Graves, Tom White, Tomohiko K., Vincent D. Warmerdam, Vinod K C, Vinod KC, Vladimir Vladimirov, Vyacheslav Baranov, Wang Tao, Wang Wei, Weizhong Lin, Wenchen Fan, Wisely Chen, Xiangrui Meng, Xu Tingjun, Xusen Yin, Yadong Qi, Yanbo Liang, Yash Datta, Yijie Shen, Yin Huai, Yong Tang, Yu ISHIKAWA, Yuhao Yang, Yuming Wang, Yuri Saito, Yuu ISHIKAWA, Zc He, Zhang, Liye, Zhichao Li, Zhongshuai Pei, Zoltan Zvara, 以及一些未知贡献者(请在您的 git 提交中注明您的电子邮件和姓名,以便在此处显示)。


Spark 新闻存档

最新新闻

存档