0


【pyspark学习从入门到精通2】理解pyspark_2

Catalyst 优化器

Spark SQL 是 Apache Spark 技术含量最高的组件之一,因为它为 SQL 查询和 DataFrame API 提供动力。Spark SQL 核心是 Catalyst 优化器。这个优化器基于函数式编程构造,设计时考虑了两个目的:一是简化向 Spark SQL 添加新的优化技术和特性,二是允许外部开发者扩展优化器(例如,添加特定数据源的规则、对新数据类型的支持等):

Project Tungsten

Tungsten 是 Apache Spark 执行引擎的总称项目代号。该项目专注于改进 Spark 算法,使其更有效地使用内存和 CPU,将现代硬件的性能推向极限。
这个项目的努力重点包括:

  • 显式管理内存,以消除 JVM 对象模型和垃圾回收的开销
  • 设计利用内存层次结构的算法和数据结构
  • 运行时生成代码,使应用程序能够利用现代编译器优化 CPU
  • 消除虚拟函数分派,减少多个 CPU 调用
  • 利用低级编程(例如,将数据直接加载到 CPU 寄存器)加速内存访问,并优化 Spark 的引擎,以高效编译和执行简单循环

Spark 2.0 架构

Apache Spark 2.0 的引入是 Apache Spark 项目的最新重大版本,基于过去两年平台开发的关键学习成果:
Apache Spark 2.0 版本的三个主要主题围绕着性能增强(通过 Tungsten 第二阶段)、引入结构化流,以及统一 Datasets 和 DataFrames。即使目前 Datasets 仅在 Scala 和 Java 中可用,我们也将描述 Datasets,因为它们是 Spark 2.0 的一部分。

统一 Datasets 和 DataFrames

在上一节中,我们提到 Datasets(在撰写本书时)仅在 Scala 或 Java 中可用。然而,我们提供了以下背景,以更好地理解 Spark 2.0 的发展方向。
Datasets 在 2015 年作为 Apache Spark 1.6 版本的一部分引入。Datasets 的目标是提供类型安全的编程接口。这允许开发者使用编译时类型安全(即,在运行之前可以检查生产应用程序的错误)与半结构化数据(如 JSON 或键值对)一起工作。Python 没有实现 Dataset API 的部分原因是 Python 不是一种类型安全的语言。
同样重要的是,Datasets API 包含高级特定领域语言操作,如 sum()、avg()、join() 和 group()。这一特性意味着你拥有传统 Spark RDDs 的灵活性,但代码也更容易表达、阅读和编写。与 DataFrames 类似,Datasets 可以通过向查询计划器公开表达式和数据字段,并利用 Tungsten 的快速内存编码,来利用 Spark 的 Catalyst 优化器。

Spark API 的历史在以下图表中表示,注明了从 RDD 到 DataFrame 再到 Dataset 的发展进程:

DataFrame 和 Dataset API 的统一有可能造成向后兼容性的破坏性变化。这也是 Apache Spark 2.0 是一个主要版本发布(而不是 1.x 的次要版本,后者会尽量减少任何破坏性变化)的主要原因之一。正如你从下图中看到的,DataFrame 和 Dataset 都属于作为 Apache Spark 2.0 一部分引入的新 Dataset API:

如前所述,Dataset API 提供了一个类型安全、面向对象的编程接口。Datasets 可以通过向查询计划器公开表达式和数据字段,并利用 Project Tungsten 的快速内存编码,来利用 Catalyst 优化器。但是随着 DataFrame 和 Dataset 现在作为 Apache Spark 2.0 的一部分统一,DataFrame 现在是 Dataset 非类型化 API 的别名。更具体地说:
DataFrame = Dataset[Row]

引入 SparkSession

在过去,你可能需要分别使用 SparkConf、SparkContext、SQLContext 和 HiveContext 来执行你的各种 Spark 查询,分别用于配置、Spark 上下文、SQL 上下文和 Hive 上下文。SparkSession 本质上是这些上下文的组合,包括 StreamingContext。

例如,而不是这样写:

df = sqlContext.read \
 .format('json').load('py/test/sql/people.json')

现在你可以这样写:

df = spark.read.format('json').load('py/test/sql/people.json')

或者:

df = spark.read.json('py/test/sql/people.json')

SparkSession 现在是读取数据、处理元数据、配置会话和管理集群资源的入口点。

Tungsten 第二阶段

当项目开始时,对计算机硬件景观的基本观察是,尽管 RAM 内存、磁盘以及(在一定程度上)网络接口的性能价格比有所提高,但 CPU 的性能价格比提升并不相同。尽管硬件制造商可以在每个插槽中放置更多的核心(即通过并行化提高性能),但核心速度并没有显著提高。
Project Tungsten 于 2015 年推出,目的是对 Spark 引擎进行重大改变,重点提高性能。这些改进的第一阶段集中在以下方面:

  • 内存管理和二进制处理:利用应用程序语义显式管理内存,消除 JVM 对象模型和垃圾回收的开销
  • 缓存感知计算:利用内存层次结构的算法和数据结构
  • 代码生成:使用代码生成来利用现代编译器和 CPU

下图是更新后的 Catalyst 引擎,表示包括 Datasets 在内。正如你在图的右侧(成本模型的右侧)所看到的,代码生成被用于对选定的物理计划生成底层 RDDs:

作为 Tungsten 第二阶段的一部分,有向全阶段代码生成的推进。也就是说,Spark 引擎现在将在编译时为整个 Spark 阶段生成字节码,而不仅仅是针对特定的作业或任务。这些改进的主要方面包括:

  • 无虚拟函数分派:这减少了可以对性能产生深远影响的多个 CPU 调用,当分派数十亿次时
  • 中间数据在内存与 CPU 寄存器中:Tungsten 第二阶段将中间数据放入 CPU 寄存器中。这是从 CPU 寄存器而不是从内存中获取数据所需的周期数量减少了一个数量级
  • 循环展开和 SIMD:优化 Apache Spark 的执行引擎,以利用现代编译器和 CPU 高效编译和执行简单循环的能力(与复杂的函数调用图相对)

本文转载自: https://blog.csdn.net/qq_32146369/article/details/140246422
版权归原作者 水木流年追梦 所有, 如有侵权,请联系我们删除。

“【pyspark学习从入门到精通2】理解pyspark_2”的评论:

还没有评论