文章目录
绪论
Spark 则是加州大学伯克利分校AMP实验室所开源的类Hadoop MapReduce的通用并行框架, 专门用于大数据量下的迭代式计算。是为了跟 Hadoop 配合而开发出来的,不是为了取代 Hadoop, Spark 运算比 Hadoop 的 MapReduce 框架快的原因是因为 Hadoop 在一次 MapReduce 运算之后,会将数据的运算结果从内存写入到磁盘中,第二次 Mapredue 运算时在从磁盘中读取数据,所以其瓶颈在2次运算间的多余 IO 消耗. Spark 则是将数据一直缓存在内存中,直到计算得到最后的结果,再将结果写入到磁盘,所以多次运算的情况下, Spark 是比较快的. 其优化了迭代式工作负载。
具体区别如下:
Hadoop的局限 | Spark的改进 |
---|---|
抽象层次低,编码难以上手。 | 通过使用RDD的统一抽象,实现数据处理逻辑的代码非常简洁。 |
只提供Map和Reduce两个操作,欠缺表达力。 | 通过RDD提供了许多转换和动作,实现了很多基本操作,如sort、join等。 |
一个job只有map和reduce两个阶段,复杂的程序需要大量的job来完成。且job之间的依赖关系需要应用开发者自行管理。 | 一个job可以包含多个RDD的转换操作,只需要在调度时生成多个stage。一个stage中也可以包含多个map操作,只需要map操作所使用的RDD分区保持不变。 |
处理逻辑隐藏在代码细节中,缺少整体逻辑视图。 | RDD的转换支持流式API,提供处理逻辑的整体视图。 |
对迭代式数据的处理性能比较差,reduce与下一步map的中间结果只能存放在HDFS的文件系统中。 | 通过内存缓存数据,可大大提高迭代式计算的性能,内存不足时可溢写到磁盘上。 |
reduce task需要等所有的map task全部执行完毕才能开始执行。 | 分区相同的转换可以在一个task中以流水线的形式执行。只有分区不同的转换需要shuffle操作。 |
时延高,只适合批数据处理,对交互式数据处理和实时数据处理支持不够。 | 将流拆成小的batch,提供discretized stream处理流数据 |
尊重原创,本文绪论转载自:https://blog.csdn.net/databatman/article/details/53023818
1、Spark简介
1)、Spark的历史:2012年发布初始版本0.6版本,已经有6年的历史了。
2)、Spark的创始人:美国加州大学的伯克利分校的AMP实验室。
3)、Spark比MR快的原因:
①Spark是粗粒度的资源调度,资源复用。
②Spark支持基于内存迭代,MR不支持。
③Spark支持DAG有向无环图 task pipleline。
④Spark可以根据不同场景选择不同shuffle,spark shuffle 比MR性能高(sortShuffle)
4)、AMP数据分析栈:
5)、spark的运行模式:local、standalone、yarn、mesos。
6)、开发Spark的语言:scala、java、python、R。(Scala和Java兼容性和效率都是一样的)
2、RDD(弹性分布式数据集)(重点)
1)、RDD五大特性:(重点)
1. RDD是由一系列的Paratition组成的。(partition个数=split切片数 约等于 block数;Spark没有读文件的方法,依赖MR读文件的方法)
2. RDD提供的每一个算子实际上是作用在每一个Paratition上的。
3. RDD实际上是有一系列的依赖关系的,依赖于其他的RDD。(计算的容错性;体现了RDD的弹性;父RDD不一定知道子RDD是谁,子RDD一定知道父RDD是谁)
4. 可选:分区器作用在内部计算逻辑的返回值是kv格式的RDD上。
5. 可选:RDD会提供一系列的最佳计算位置。(计算找数据)
2)、算子
1. taransformation类算子
map(一对一)、flatMap(一对多)、filter(一对N(0、1))、join、leftouterJoin、rightouterJoin、fullouterJoin、sortBy、sortByKey、gorupBy、groupByKey、reduceBy、reduceByKey、sample、union、mappatition、mappatitionwithindex、zip、zipWithIndex。
2. action类算子
count、collect(将task的计算结果拉回到Driver端)、foreach(不会回收所有task计算结果,原理:将用户传入的参数推送到各个节点上去执行,只能去计算节点找结果)、saveAsTextFile(path)、reduce、foreachPatition、take、first。
(查看计算结果的方式:WEBUI、去各个节点的Worker工作目录查看)
3. 控制类算子
cache(相当于MEMOORY_ONLY)、
persist(MEMORY_ONLY、DISK_ONLY、MEMORY_AND_DISK)
控制类算子注意点:
1)、控制类算子后不能紧跟action类算子
2)、缓存单元是partition
3)、懒执行、需要action类算子触发执行。(如果application中只有一个job,没必要使用控制类算子)
3、Spark在集群中大概运行流程
1. Driver分发task到节点运行(计算找数据)。
2. task执行结果拉回到Driver(有可能发生OOM)。
Driver的作用:
1)、分发任务到计算节点运行。
2)、监控task(thread)的运行情况。
3)、如果task失败,会重新发送(有限制)。
4)、可以拉回结果到Driver进程。
结论:Driver进程会和集群频繁通信。
4、提交Application的方式
1、Client
提交方式:spark-submit --deploy-mode client --class jarPath args
特点:Driver进程在客户端节点启动
适用场景:测试环境
大概运行流程:
1)、在Client本地启动Driver进程。
2)、Driver会向Master为当前Application申请资源。
3)、Master接收到请求后,会在资源充足的节点上启动Executor进程。
4)、Driver分发task到Executor执行。
2、Cluster
提交方式:spark-submit --deploy-mode cluster --class jarPath args
特点:每次启动application,Driver进程在随机一台节点启动
适用场景:生产环境
大概运行流程:
1)、客户端执行spark-submit --deploy-mode cluster --class jarPath args命令,启动一个sparksubmit进程。
2)、为Driver向Master申请资源。Driver进程默认需要1G内存,1core。
3)、master会随机找一台Worker节点启动Driver进程。
4)、Driver进程启动成功后,spark-submit进程关闭,然后Driver会向Master为当前Application申请资源。
5)、Master接收到请求后,会在资源充足的节点上启动Executor进程。
6)、Driver分发task到Executor执行。
5、搭建及测试集群
由于Spark的执行效率要比MapReduce快的多,所以我们有必要搭建Spark集群。搭建详细过程请参考我的另一篇博客:Spark集群的搭建及测试。
6、Spark的任务调度
在Spark中一切的任务都是由Driver申请资源,然后在申请到资源的worker节点启动Executor进程。最后Driver将任务分发到这些Executor进程中执行。详情请参考我的另一篇博客:Spark的任务调度。
7、Spark的资源调度
有任务调度自然也会有资源的调度,任务的运行离不开资源。一个Application想要运行,首先要向Master为Driver申请资源,然后Driver向Master为Application申请资源。详情请参考我的另一篇博客:Spark的资源调度。
8、Spark的(任务调度+资源调度)整合
上面虽然分开介绍了任务调度与资源调度。但是资源调度和任务调度在计算机中是密不可分的,详情请参考我的另一篇博客:Spark的调度流程(任务调度+资源调度)。
9、Spark Shuffer
与MapReduce一样,在Spark中也有shuffle。Sparkshuffle包含hashShuffle和sortShuffle。详情请参考我的另一篇博客:Spark Shuffer。
10、Spark SQL
详情请参考我的另一篇博客:Spark SQL。
11、Spark案例一(Scala)
学完了Spark的理论知识,下面介绍一下在代码中如何应用Spark。由于Scala语言编写Spark程序比较简单,这里首先用Scala语言写一个Scala小案例。详情请参考我的另一篇博客:Spark日志分析案例。
12、Spark案例二(Java)
虽然Scala语言写Spark比较简单,但是我们平时大部分还是使用的Java比较多,这里也使用Java语言来写了一个小案例。详情请参考我的另一篇博客:Java操作Spark简单案例《好友推荐》。