Spark笔记之简介
Spark笔记之简介
1. 背景
- 作为目前大数据处理领域主流处理引擎的spark,从2016年开始在国内快速进入企业生产实践,到现在2020年已经有四年。版本也更新到了现在的3.0.1。实际企业使用为了稳定性,旧的项目一般都还在2.x版本,特别是2.4.x版本。
- http://spark.apache.org/
- 下载https://archive.apache.org/dist/spark/
2. Spark简介
2.1 Spark是什么
- spark是一个 大数据分析引擎,快速上手,通用性解决方案
- spark是2009年诞生于美国加州大学伯克利分校AMPLab实验室,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。
- 2014年5月发布1.0版本,2016年7月发布2.0版本,2020年6月发布3.0版本。
- 注意,目前技术业界使用第三方库的版本一般都是采用语义化版本。如1.2.3,
- 第一个数字1代表是大版本迭代,表明有重大功能或者特性更新,很多时候大版本之间的更新并不会保证接口兼容性,所以升级大版本之前需要做很谨慎的考虑,如果作为框架的开发者,也需要注意版本的语义。同时,如果一个框架一致都没有大版本,则说明本身还不够成熟稳定,最好不要在企业开发中使用,如0.4.5这种版本,最好不要采用
- 第二个数字2代表小版本迭代,一般是在大版本更新基础上做功能性迭代。
- 第三个数字,一般都是bug修复性版本,所以企业开发时,一般都不会采用类似4.0.0这种版本,而是会尽量采用4.0.1或者4.1.1这种版本,这样的版本会相对成熟,而且推出一段时间后,需要修复的bug基本都修复地差不多了。
2.2 Spark特点
信息参考自官网和网络资料
2.2.1
- 其实从spark地出生日期可以知道,在hadoop地mapreduce之后出现。spark本身并没有脱离hadoop生态,而是对mapreduce计算引擎的一种升级后分布式数据分析处理的替代方案。
- 从上述截图可以看出,spark对比mapreduce这个分布式处理引擎要快接近100倍
- mapreduce是21世纪初设计出来的分布式处理引擎,当时硬件不管是CPU还是内存,都相对宝贵,为了可以处理分析海量数据,mapreduce会把中间数据落地到HDFS中,这样就需要频繁读写HDFS。而HDFS的读写是受限于网络IO和磁盘IO的。所以mapreduce的性能瓶颈之一就是磁盘和网络IO
- Spark吸取了mapreduce 的思想,但spark的中间结果可以选择写入到磁盘或者缓存到内存中,这样就可以节省大量的磁盘和网络IO消耗的实践。
- Spark采取DAG任务调度思想,将多个计算逻辑构建为一个有向无环图,将DAG优化后,再乘胜物理执行计划。–这一点可以对比Hive(将sql转换为mapreduce程序,注意hive也支持spark)
- spark还支持数据缓存在内存中的计算
2.2.2
- 从上述可以看出,Spark支持的开发语言非常多,其中还有很多高级语言如支持函数式开发的python、scala,也支持生态非常广泛的java语言
- spark本身是使用scala和java混合编写的(scala和java本身就能混合编程)。所以Spark也吸取了scala语言的特点,类似scala集合一样,Spark提供了80多个高级算子。同时还针对scala、python、R语言提供了shell客户端,可以在里面很便捷地做代码编写
2.2.3
- 从上述Spark的功能划分可以看出,Spark作为一个大数据分布式处理引擎,其实还是有很大野心的。
- Spark SQL、Streaming、MLib、Graph,写sql来处理结构化海量数据(和hive一样),处理流式数据,机器需欸,图计算。这四个功能基本涵盖了大数据90%以上场景,甚至更多。
- 众所周知,整套解决方案对于企业开发具备无与伦比的吸引力,因为开发者只需要在同一套解决方案中学习,研究,使用即可。学习和维护成本会极大降低,而且整套方案的出错几率也会小很多。
- 配合上述说的,Spark还支持java、python、scala、R等编程语言做开发,这样一来,不管是庞大的java程序员、python程序员都能很好加入到Spark这个技术体系中来。????
2.2.4
- Spark本身只是一个分布式处理引擎,所以它需要有一个运行平台来给它做资源调度和任务管理。
- Spark本身自带了一套资源调度和任务管理工具,当我们以Stand alone模式运行时,就是使用的Spark自带的任务管理工具
- Spark还支持运行在Hadoop的Yarn资源调度平台,这也是国内使用最多的一种搭配方式。啤酒配花生,绝配!!!
- Spark还可以运行在Kubernates,俗称的K8s上,也就是容器化docker中。不过国内采用这种方案较少,主流还是搭配Yarn使用。
- 其他资源调度平台如Mesos上,也可以运行Spark。
注意国内的技术方案选择其实和国外技术方案选择倾向会有较大差异,但考虑到国内庞大的业务和技术市场,一般都参考阿里、美团、腾讯等大厂的技术 方案选型标准 - 这里还可以看出,Spark基本可以访问大多数主流的数据存储来源,本地文件、HDFS、HBase、Hive、Alluxio(Tachyon,内存数据存储)、Cassandra、其他hadoop兼容数据存储平台。如果使用阿里的dataX数据迁移工具,则基本所有数据源都可以通吃
2.3 Spark和MapReduce对比
- mapreduce其实出现时间较早,2006年单独分离出来。而Spark是2009年才出现的。天下文章一大抄,spark在很多地方借鉴了mapreduce的实现思路,而mapreduce本身是来源于谷歌开放出来的一篇论文–mapreduce
- mapreduce历史比spark久远,编程API相对死板一些,速度慢,只能做离线计算
- spark的接口设计通用性更强,api简洁,上手快。处理数据速度快,可以做实时计算(准实时,对比flink来说,spark可以做到秒级别,flink可以做到毫秒级别)。
- spark可以适用于大数据场景下90%以上场景,适用性比mapreduce高很多很多。既可以做离线计算,也可以做实时计算。
- mapreduce和spark的本质区别,mapreduce只能做离线计算。复杂计算如果一个MR无法搞定,需要先后多个MR程序处理。同时在一个MR程序处理过程中,会涉及到大量的磁盘、网络IO,shuffle过程则是本地磁盘IO,会极大限制mapreduce的性能
- spark则可以做离线,也可以做实时计算。提供的抽象数据集(RDD、DataSet、DataFrame、DStream)高度封装,使用起来和scala集合的函数差不多。本身使用更先进DAG有向无环图进行任务调度,可以将数据缓存到cache中复用。
- spark和mapreduce都有shuffle阶段,都会把数据落地到磁盘中。
2.4 Spark 3.0新特性
- https://spark.apache.org/releases/spark-release-3-0-0.html
- 动态合并shuffle partitions
- 动态调整join策略
- 动态优化倾斜的join
- 动态分区裁剪
- ANSI SQL兼容性
- Join hints
== 从上可以看出,Spark是一个准事实的大数据处理引擎,也就是现在企业开发处理大数据的主流技术框架。自带任务管理和资源调度,也可以运行在其他资源调度平台上。功能丰富,上手快,学会了,月薪过万不成问题==