您的位置:首页 > 其它

Spark视频王家林大神第1课: 30分钟彻底理解Spark核心API发展史:RDD、DataFrame、DataSet

2018-01-24 13:09 357 查看
Spark视频王家林大神第1课: 30分钟彻底理解Spark核心API发展史:RDD、DataFrame、DataSet

本节通过Spark核心API的发展史,带领大家学习和理解Spark的内幕,在Spark的发展史上,经历了三代API:第一代是RDD、第二代是DataFrame、第三代是DataSet。RDD是Spark中绝对的核心和基础性的抽象,DataFrame是Spark 1.3.x推出的,为了处理交互型的关系数据库的数据,数据可以来源于Oracle、Mysql或者JSON,可以支撑各种格式,也可来自于RDD,或者HDFS的分布式文件系统;Spark 1.6.x的时候推出了第三代关键性的DataSet。之所以在机器学习的第一节以RDD第一代的核心API、DataFrame第二代的核心API、以及Spark1.6.x推出的实验性API并在Spark 2.x成熟的DataSet,以此为一条线贯通Spark前前后后的内容,有几个方面的原因:
1)第一点:作为开发者,无论是做机器学习的开发还是做其他方面的开发,Spark
这三代API都是绕不过去的,开发者必须首先理解这三代API。
2)第二点:我们编写代码的时候,不同的Spark版本,例如:Spark 1.3.x之前的
版本,Spark 1.3.x到Spark 1.6.x之间的版本,以及已经推出的Spark 2.0.x的版本,这三代API的编程风格虽然有一定的相似性,但是有所差异的。从第二个方面的角度考虑,我们写代码绕不开这三代API,而每一代API都带来了性能的极大提升。如果有机器学习的开发经验,体验应是非常的深刻,分布式系统性能一定是第一位的,在确保数据安全的情况下,如何加快计算速度,这是分布式系统的第一要务,也是所有分布式编程高手水平判断的更高标准。Spark机器学习对性能进行迭代,对性能的要求是毫无疑问的,每代Spark  API的推出都带来性能的极大提升,包括第一代API的RDD,当年推出RDD的时候,给业界的第一印象就是Spark太快了,后来的DataFrame、DataSet又不断长江后浪推前浪,带来性能的极大提升。
 
(一)Spark第一代API:RDD。
RDD奠定了Spark辉煌的基础,DataFrame、DataSet的底层调度都依赖于RDD,RDD是最重要的。RDD代表了一系列数据的集合,如果要通过Spark操作相关的数据,一般情况下一定会用到RDD,如数据来自于数据库、Hbase等,可通过RDD把数据封装起来。
RDD的五大核心特征:
1)       A list of partitions 一系列分区的集合。
2)       A function for computing eachsplit 各个分区的计算函数。
3)       A list of dependencies on otherRDDs  RDD的依赖关系。
4)       Optionally, a Partitioner forkey-value RDDs (e.g. to say that the RDD is hash-partitioned)   基于key-value 类型RDD的分区器。
5)       Optionally, a list of preferredlocations to compute each split on (e.g. block locations for an HDFS file)  每个分区数据计算的本地性。
 
(二) Spark第二代API: DataFrame。
DataFrame是Spark发展的里程碑,DataFrame底层有一个钨丝计划。
DataFrame的核心特征:
1)       包含了以Row为单位的每行数据的列的信息,此时DataFrame就是Table;
非常适合于关系型数据操作。
2)      Tungsten:新的执行引擎。Tungsten不是取代了以RDD为核心的调度,而是
在第一代RDD调度系统的基础之上,基于元数据信息,获取更多的内容。基于更高维度的元数据信息进行优化,包括谓词下推、列裁剪等,提供了更多丰富的算子,执行效率提升。例如:filter下推的时候在join计算之前,甚至可以下推到数据源,裁剪列名如果发现这一列的数据不需要,就可以裁剪。
3)      Catalyst:新的语法解析框架。提升计算效率,减少数据读取、底层计算优
化;
 
(三) Spark第三代API: DataSet。
DataSet在DataFrame的基础之上,最关键的一点是Encoder,如果基于Scala开
发,Scala自动提供Encoder,如果基于Java开发,需手工开发Encoder。DataSet是在Spark 1.6.x版本推出的。DataSet是在Catalyst优化引擎的基础之上,Catalyst已有的功能DataSet都可以使用,基于Encoder提供类型安全检查。
DataSet的核心价值和好处:
1)      编译时的类型安全检查,不需要在执行时期才发现类型不匹配。以前编写
RDD和DataFrame的时候没有这个功能支持,假设字段char类型本来是16位的,如超过了16位的最大范围写成了32位的长整数类型,编译时感知不到。但如果是DataSet,编译时就会进行安全类型检查。编译时期进行安全检查,无论是对于编码的效率,还是解除BUG,意义非常重大。因为不需要提交给集群中就可以发现很明显的错误,进行企业级开发的时候可节省资源。
2)      性能的极大提升。如果基于DataSet编写代码,DataSet有自己一套Encoder
的机制,直接在二进制的基础上进行很多操作,不需要物化的过程。什么是物化?就是操作一个对象序列化和反序列化的时候,基于原先DataFrame的Tungsten,需要在Object和Tungsten之间进行一些转换的工作,但如果是DataSet,从操作的层面就不需要这些转换的工作了。DataSet是基于Catalyst和Tungsten的,而RDD本身不会基于这些引擎的计算,相对基于RDD编程,基于DataSet编程会有非常大的性能提升。
3)      内存使用极大降低、减少GC。从DataSet的角度,DataSet是一个数据结构。
DataSet中的数据可以进行优化。如果把数据放在RDD,RDD不知道元数据细节,RDD是最原始的引擎,不能进行很多优化。优化后,DataSet的内存使用极大降低。
4)      极大的减少网络数据的传输。DataSet有自己的数据格式,Spark引擎基于更
多的信息对数据进行存储,内存使用降低4至5倍,从网络数据的传输,整个DataSet的体积非常小,整个网络数据的传输会极大的降低。虽然DataSet有Encoder,但还是有一个序列化和反序列化的过程,考虑Encoder本身,与原生的JAVAinputStream和outStream的序列化反序列化的方式,Google提供的序列化反序列化方式比较,DataSet提供的Encoder性能和效率远远高于Kryo ,而Kryo 又高于Java 1倍,以DataSet的方式存储数据,会降低5倍左右的空间,而且底层有Tungsten的引擎优化,在内存、数据存储、网络传输都会带来极大的好处。
5)      极大的减少采用Scala和Java编程的代码的差异性。如果在工程中用Scala和
Java,Scala和Java这两种语言都用的非常多,Scala和Java的差别性还是非常大的,但是如果使用DataSet,DataSet统一了API,统一了语言的差别。因为DataSet要进行类型检查,目前还不支持Python和R语言。
RDD、DataFrame、DataSet这三代API,DataSet和DataFrame转换还是非常容易的,DataSet是强类型的,DataFrame不是强类型,RDD与DataFrame、DataSet相比,RDD处理的类型在运行期间决定的。
l  DataSet会同时兼顾Functional和Relational programming。
l  DataSet可以统一流计算、SQL、机器学习的API编程。Spark使用一个技术
堆栈解决所有的问题,在Spark 2.x编程的时候,DataSet统一了流式编程、交互式查询编程、机器学习编程,统一了不同框架之间的编程,对于开发而言有极大的好处。
l  DataSet最最重要的是效率,包括底层的Tungsten优化,Encoder,数据在内
存和磁盘等的存储等等。从Scala的角度,Encoder还不支持第三方编码。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: