SparkSQL的基本概念 有更新!

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自己的二进制格式),更加紧凑,节省内存空间,而且能更好的估计数据量大小和内存使用情况;计算直接发生在二进制格式上,省去了序列化和反序列化时间。

. - - —— ————THE END——— —— - - .

⚠求而不得,往往不求而得!
⚠此文章为原创作品,转载务必保留本文地址及原作者。

评论

发表评论

validate