用spark,你仅仅只是调用spark的API肯定是很low的。
今天来讲讲spark的原理,并且会针对部分源码进行讲解,如有不同意见请联系本人交流探讨。
目前大数据生态主要部分是Hadoop软件框架和Spark内存级计算引擎。Hadoop包含四个项目:Hadoop common,HDFS,YARN和MapReduce。点击这里有Hadoop详情安装教程。 Spark并不是要成为一个大数据领域的“独裁者” , 一个人霸占大数据领域所有的 “地盘” , 而是与Hadoop进行了高度的集成, 两者可以完美的配合使用。 Hadoop的HDFS、Hive、HBase负责存储, YARN负责资源调度; Spark负责大数据计算。 实际上, Hadoop+Spark的组合, 是 一种“ double win” 的组合。
Hadoop这里我就暂时不进行讲解,后面会在分类比较中进行详细的分析。
那么就说说spark,spark是一种通用的大数据计算引擎,如传统的MapReduce,hive引擎,Storm流式实时计算引擎一样(yukang个人理解)。期望使用一个技术堆栈就完美解决大数据领域的各种计算任务。
spark对比MapReduce,hive引擎,Storm流式计算引擎优点和缺点:
1.当然如果数据超过1T了基本就不能用spark了,还是会选择MapReduce,MapReduce利用磁盘的高I/O操作实现并行计算确实在处理海量数据是无法取代的,但它在迭代计算中性能不足。(为什么数据过大我不适用spark,spark基于内存好也是内存,不好也是内存,我解释一下,如果数据过大,OOM内存溢出等等,spark的程序就无法运行了,直接就会报错挂掉了,这个很坑爹是吧,虽然MapReduce运行数据相对spark很慢,但是至少他可以慢慢的跑不是吗?再慢至少能跑完。反正我是很讨厌BUG的。【这里提到的MapReduce为什么慢后面我也会在后期的Hadoop笔记中详细解析】)
2.storm实时的流式计算的处理上也是无法取代的(Storm支持在分布式流式计算程序( Topology) 在运行过程中, 可以动态地调整并行度, 从而动态提高并发处理能力。而Spark Streaming是无法动态调整并行度的。当然Spark Streaming也有其优点是storm不具备的,首先Spark Streaming由于是基于batch进行处理的, 因此相较于Storm基于单条数据 进行处理, 具有数倍甚至数十倍的吞吐量。此外Spark Streaming由于也身处于Spark生态圈内, 因此Spark Streaming可以与Spark Core、 Spark SQL, 甚至是 Spark MLlib、 Spark GraphX进行无缝整合。【业务场景的话:通常在对实时性要求特别高, 而且实时数据量不稳定, 比如在白天有高峰期的情况下, 可以选择 使用Storm。 但是如果是对实时性要求一般, 允许1秒的准实时处理使用Spark Streaming。我在数据清洗的时候用的Storm,个人原因,其他业务场景我暂时想不起来。】)。
3.海量数据的查询,hive肯定也是不可取代的,(很多人认为Spark SQL完全能够替代Hive的查询引擎,我认为肯定是不行的,因为Hive是一种基于HDFS的数据仓库, 并且提供了基于SQL模型的, 针对 存储了大数据的数据仓库, 进行分布式交互查询的查询引擎,有少量的Hive支持的高级特性,Spark SQL暂时还不支持。当然Spark SQL相较于Hive查询引擎来说, 就是速度快,原因还是因为hive底层基于MapReduce,为什么MapReduce慢yukang再次不做解释,后期Hadoop有关笔记会进行详细解析,Spark SQL相对于hive还有另一个优势:就是支持大量不同的数据源, 包括hive、 json、 parquet、 jdbc等等。)
spark优势:
1.spark是基于内存的计算,硬盘由于物理级限制速度提升非常困难,远远跟不上CPU和内存的发展速度。近几十年来,内存的发展一直遵循摩尔定律,价格在下降,内存在增加。现在主流的服务器,几百GB或几TB的内存都很常见,内存的发展使得内存数据库得以实现,Spark正是利用这种计算资源设计的基于内存的分布式处理软件,其目标是取代MapReduce。
2.Spark可以直接对HDFS进行数据读写,支持YARN等部署模式。(可见其兼容性的强大)
3.spark计算处理数据速度快,因为它是基于内存啊,(Spark将迭代过程的中间数据缓存到内存中,根据需要多次重复使用。[在机器学习这种需要反复迭代的任务中非常有效])
4.Spark利用RDD结构提升了容错性能。(RDD是一个包含诸多元素、被划分到不同节点上进行并行处理的数据集合,可以将RDD持久化到内存中,这样就可以有效地在并行操作中复用,在节点发生错误时RDD也可以根据其Lineage自动重新计算恢复,如果Lineage很长,可以缓存RDD来提高效率。)
5.同时在磁盘和内存中保存数据。
6.运算方面通过映射,化简,链接,Cogroup等等方式。
7.Spark包含了大数据领域常见的各种计算框架, 比如:
Spark Core用于离线计算
Spark SQL用于交互式查询
Spark Streaming用于实时流式计算
Spark MLlib用于机器学习
Spark GraphX用于图计算
8.强大的社区和多语言的支持等等。
Spark工作架构:
Spark可以分为1个driver(笔记本电脑或者集群网关机器上,用户编写的Spark程序)和若干个executor(在RDD分布的各个节点上)。
通过SparkContext(简称sc)连接Spark集群、创建RDD、累加器(accumlator)、广播变量(broadcast variables),简单可以认为SparkContext是Spark程序的根本。
Driver会把计算任务分成一系列小的task,然后送到executor执行。executor之间可以通信,在每个executor完成自己的task以后,所有的信息会被传回。
本图片来源网络
1. Client客户端:我们在本地编写了spark程序,打成jar包,或python脚本,通过spark submit命令提交到Spark集群;
2. 只有Spark程序在Spark集群上运行才能拿到Spark资源,来读取数据源的数据进入到内存里;
3. 客户端就在Spark分布式内存中并行迭代地处理数据,注意每个处理过程都是在内存中并行迭代完成;注意:每一批节点上的每一批数据,实际上就是一个RDD!!!一个RDD是分布式的,所以数据都散落在一批节点上了,每个节点都存储了RDD的部分partition。
4. Spark与MapReduce最大的不同在于,迭代式计算模型:MapReduce,分为两个阶段,map和reduce,两个阶段完了,就结束了,所以我们在一个job里能做的处理很有限; Spark,计算模型,可以分为n个阶段,因为它是内存迭代式的。我们在处理完一个阶段以后,可以继续往下处理很多个阶段,而不只是两个阶段。所以,Spark相较于MapReduce来说,计算模型可以提供更强大的功能。
spark的生态系统:
Mesos和yarn 作用一样,资源调度平台,用yarn的比较多
Tachyon:(1)内存当中hdfs(内存中的分布式存储系统,加快spark在内存中读取和处理速度)
(2)在不同应用程序之间实现数据共享
spark core:spark的核心,用于离线计算