Spark特点:
高效(比MapReduce快10~100倍)
内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销
DAG引擎,减少多次计算之间中间结果写到HDFS的开销
使用多线程池模型来减少task启动开销,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
易用
提供了丰富的API,支持Java,Scala,Python和R种语言
代码量比MapReduce少2~5倍
与Hadoop集成
读写HDFS/Hbase
与YARN集成
DAG是有向无环图(Directed Acyclic Graph)的简称。在大数据处理中,DAG计算常常指的是将计算任务在内部分解成为若干个子任务,将这些子任务之间的逻辑关系或顺序构建成DAG(有向无环图)结构。
DAG计算的三层结构:
最上层是应用表达层,即是通过一定手段将计算任务分解成由若干子任务形成的DAG结构,其核心是表达的便捷性,主要是方便应用开发者快速描述或构建应用。
中间层是DAG执行引擎层,主要目的是将上层以特殊方式表达的DAG计算任务通过转换和映射,将其部署到下层的物理机集群中运行,这层是DAG计算的核心部件,计算任务的调度,底层硬件的容错,数据与管理信息的传递,整个系统的管理与正常运转等都需要由这层来完成。
最下层是物理机集群,即由大量物理机器搭建的分布式计算环境,这是计算任务最终执行的场所。
Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。 Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。如果你不知道MapReduce里Shuffle是什么,那么请看这张图:
Shuffle描述着数据从map task输出到reduce task输入的这段过程。 在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有:
参考https://blog.csdn.net/cnhk1225/article/details/50859216
Spark核心概念-RDD
RDD:Resilient Distributed Datasets,弹性分布式数据集
分布在集群中的只读对象集合(由多个Partition构成)
可以存储在磁盘或内存中(多种存储级别)
通过并行“转换”操作构造
失效后自动重构
RDD基本操作(operator)
Transformation
可通过Scala集合或者Hadoop数据集构造一个新的RDD
通过已有的RDD产生新的RDD
举例:map、filter、groupBy、reduceBy
Action
通过RDD计算得到一个或者一组值
举例:count、reduce、saveAsTextFile
Spark RDD cache/persist
Spark RDD Cache
允许将RDD缓存到内存中或磁盘上,以便于重用
Spark提供了多种缓存级别,以便于用户根据实际需求进行调整
RDD cache使用
var data = sc.textFile("hdfs://nn:8020/input")
data.cache() //实际上是data.persist(StorageLevel.MEMORY_ONLY)
//data.persist(StorageLevel.DISK_ONLY_2)
RDD Transformation 与 Action
接口定义方式不同
Transformation:RDD[X] -> RDD[Y]
Action:RDD[X] ->Z(Z不是一个RDD,可能是基本类型、数组等)
惰性执行(Lazy Execution)
Transformation只会记录RDD转化关系,并不会触发计算
Action是触发程序执行(分布式)的算子
Spark运行模式
local(本地模式)
单机运行,通常用于测试
什么是本地模式:将Spark应用以多线程方式,直接运行在本地,便于调试。
本地模式分类:
local:只启动一个executor
local[K]:启动K个executor
local[*]:启动跟cpu数目相同的executor
standalone(独立模式)
独立运行在一个集群中
YARN/mesos
运行在资源管理系统上,比如YARN或mesos
Spark On YARN存在两种模式
yarn-client:
yarn-cluster:
讨论问题:
1.Spark在任何情况下均比MapReduce高效吗?
答:并不是,当只有Map和Reduce两个阶段时,Spark和MapReduce计算效率一样,在2.0版本之前,Spark与MapReduce相比是低效的,现在由于shuffle实现的改善,Sparkd的计算效率大于等于MapReduce。
2.Spark号称“内存计算框架”,它将所有数据写到内存吗?
答:并不是,默认情况下,与MapReduce一样,将数据写到磁盘。但是可以控制写内存。写内存提高了计算效率,另外Spark有DAG计算引擎,这也是比MapReduce高效的原因,而且采用线程的模型,也是高效的原因。
3.当前存在很多DAG引擎,包括Spark、Tez、Flink,为何大家都在讨论Spark?
答:Spark社区做的好。