SparkSQL 的基本概念

本贴最后更新于 2520 天前,其中的信息可能已经天翻地覆

SparkSQL 起源与发展

SparkSQL 从 1.0 开始成为 Spark 中的一员,主要用与处理结构化(DB,JSON)的数据.提供了两种数据访问方式:

  • SQL Query:直接使用 SQL 来进行数据的查询和操作
  • DataFrame/Dataset API:提供了比 SQL 更丰富的操作,可以作为 sql 的扩展,因为 sql 本身的表达能力是有限的。

SparkSQl=schema+RDD,原始 RDD 的缺陷在与他没有提供数据的原信息,我们很难清楚这些数据代表的是什么意思,给他加上了 schema,就可以根据原信息去操作数据,就像 sql 一样。Sparksql 在 1.6 的时候更新了 API,对 sqlContext 和 hivecontext,等接口统一为 Sparksession,并且提供了很多的优化措施。

Spark SQL 的一个主要的功能就是执行 SQL 查询语句。Spark 2.0 开始,最大的一个改变,就是支持了 SQL 2003 标准语法,还有就是支持子查询。Spark SQL 也可以用来从 Hive 中查询数据。当我们使用某种编程语言开发的 Spark 作业来执行 SQL 时,返回的结果是 Dataframe/Dataset 类型的。当然,我们也可以通过 Spark SQL 的 shell 命令行工具,或者是 JDBC/ODBC 接口来访问。

Sparksql 的组件:

  • DataSource API:多数据源接口(JSON,txt,csv,db,orc,parquet)。
  • DataFrame/Dataset API:数据操作接口,提供丰富的 DF,DS 操作算子。
  • Catalyst optimizer:查询优化器,用于优化数据操作过程提高效率,自动优化。

Spark 2.0 的一个重大的特点就是搭载了最新的第二代 tungsten 引擎。第二代 tungsten 引擎吸取了现代编译器以及并行数据库的一些重要的思想,并且应用在了 spark 的运行机制中。其中一个核心的思想,就是在运行时动态地生成代码,在这些自动动态生成的代码中,可以将所有的操作都打包到一个函数中,这样就可以避免多次 virtual function call,而且还可以通过 cpu register 来读写中间数据,而不是通过 cpu cache 来读写数据。上述技术整体被称作“whole-stage code generation”,中文也可以叫“全流程代码生成”,

另外对 Spark SQL 的 catalyst 查询优化器做了一些性能优化,来提升对一些常见查询的优化效率,比如 null 值处理等。再比如说,通过 vectarization 技术将 parquet 文件扫描的吞吐量提升了 3 倍以上.

Spark 2.0 提供了新版本的 Accumulator,提供了各种方便的方法,比如说直接通过一个方法的调用,就可以创建各种 primitive data type(原始数据类型,int、long、double)的 Accumulator。并且在 spark web ui 上也支持查看 spark application 的 accumulator,性能也得到了提升。老的 Accumulator API 还保留着,主要是为了向后兼容性

SparkSql 引入的目的:

  • 使数据操作编写更少的代码。
  • 获取必须、更少的数据,引用多种数据源,如列式存储,采用数据分区,数据过滤减少不必要的数据读取。
  • 使用优化器自动优化数据,较少开发人员的操作,提高效率,如谓词下推。

Sparksql 的编程 API:DataFrame/Dataset

⬜️ Dataset :是一个分布式的数据集。Dataset 是 Spark 1.6 开始新引入的一个接口,它结合了 RDD API 的很多优点(包括强类型,支持 lambda 表达式等),以及 Spark SQL 的优点(优化后的执行引擎)。Dataset 可以通过 JVM 对象来构造,然后通过 transformation 类算子(map,flatMap,filter 等)来进行操作。

⬜️ Dataframe :是按列组织的 Dataset。

一、API 演变过程:SchemaRDD->DataFrame->Datasets

c3d8f74b9eb14f08b4536aa079259094.png

他的演变借鉴了 Python 的数据处理库 pandas。

二、RDD,DF,DS 的优缺点

\RDD API[2011]DataFrameAPI[2013]DatasetAPI
优点 1、JVM对象组成的分布式数据集
2、不可变且具有容错能力
3、可处理结构化非结构化数据
4、可进行函数式转换
1、ROW对象组成的分布式数据集
2、不可变且具有容错能力
3、可处理结构化非结构化数据
4、自带优化器Catalyst,自动优化程序
5、多数据源的DataSourceAPI,轻易获取多种格式数据
1、扩展自DataFrameAPI
2、编译时类型检查
3、代码生成编解码器,序列化更高效
4、可以DataFrame相互转换,Dataset[row]==DataFrame
5、提供了自动识别类型的数据源API、指定类型的数据源API
缺点1、无schema
2、需要用户自己去优化程序
3、从不同的数据源获取数据困难
4、多种数据源的数据难以合并
1、运行时类型检查,会使问题在运行中暴露是程序终止
2、不能直接操作domain对象,df->rdd->df的时候会丢失数据类型
3、函数式编程风格
。。。

Tungsten 钨丝计划

⬜️ 产生原因::Spark 作为一个一体化多元化的(大)数据处理通用平台,性能一直是其根本性的追求之一,Spark 基于内存迭代(部分基于磁盘迭代)的模型极大的满足了人们对分布式系统]处理性能的渴望,但是有 Spark 事采用 Scala+Java 语言编写的所以运行在 JVM 平台,当然 JVM 是一个绝对伟大的平台,因为 JVM 让整个离散的主机融为一体(网络即 OS),但是 JVM 的死穴 GC 反过来限制了 Spark(也就是说平台限制了 Spark),所以 Tungsten 聚焦于 CPU 和 Memory 使用,以达到对分布式硬件潜能的终极压榨。

⬜️ 目的 :持续优化 CPU 和 Memory 的使用率,让性能逼近现代硬件的极限,为未来的 Spark 的发展做准备。

⬜️ 内容 :随着网络 I/O 的影响力下降,磁盘的性能提升(高带宽,SDD),磁盘 IO,同时 Spark 也做了很多 Shuffle 和 IO 模块的优化,列式存储等一系列高利用率数据源的出现都使 IO 对性能的影响力降低。因此网络 IO 已经不再是性能的瓶颈了,很多序列化和 Hash 操作都使在 CPU 上,所以平静逐渐转到了 CPU 利用率和内存使用率上。

  • 运行时代码生成:[expression code generation(1.6)->whole-stage code generation(2.0) ]
  • cache aware computation:提供 Cache 友好型的数据结构,提高 Cache 的命中率。
  • Off-heap 内存管理:不再使用自动内存管理,手申请内存块,对原生的而对象存储和集合存储方式进行修改减少一些额外的内存开销。Tungsten 的内存管理机制独立于 JVM,所以 Spark 操作数据的时候具体操作的是 Binary Data(Spark 自己的二进制格式),更加紧凑,节省内存空间,而且能更好的估计数据量大小和内存使用情况;计算直接发生在二进制格式上,省去了序列化和反序列化时间。
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 561 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
rzx
此生最怕深情被辜负,最怕兄弟成陌路。对世界充满善意,同时又充满深深的恨意,我渴望天降甘霖福泽众生,又渴望灭世洪水重创世纪。 广州