版权声明: https://blog.csdn.net/u013063153/article/details/53117041
Spark是基于内存计算的大数据分布式计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。
1.提供分布式计算功能,将分布式存储的数据读入,同时将任务分发到各个节点进行计算;
2.基于内存计算,将磁盘数据读入内存,将计算的中间结果保存在内存,这样可以很好的进行迭代运算;
3.支持高容错;
4.提供多计算范式;
2009年:诞生于AMPLab
2010年:开源
2013年6月:Apache孵化器项目
2014年2月:Apache顶级项目
now:contributor >450人
BDAS生态系统
-Mesos(相当于Hadoop生态系统中的YARN),资源管理、任务调度;
-HDFS
-Tachyon:分布式内存文件系统,缓存数据并进行快速的读写;
-Spark:核心计算引擎,能够将任务并行化,在集群中进行大规模并行运算;
-Spark Streaming:流式计算引擎;
-Sprak SQL:SQL on Hadoop,能够提供交互式查询和报表查询,通过JDBC等接口调用;
-GraphX:图计算引擎;
-MLlib:机器学习库。
Spark优势:
1.多计算范式支持
打造全栈多计算范式的高效数据流水线
2.处理速度
轻量级快速处理
3.易用性
易于使用,分布式RDD抽象,Spark支持多种语言
4.兼容性
与HDFS等存储层兼容
5.社区活跃度
#### Spark
ad-hoc<br>
batch query<br>
Streaming<br>
Spark core批处理、Spark Streaming实时处理、Spark MLib机器学习、Spark GraphX图计算。<br>
**Spark与其他计算框架的对比**<br>
在公司的业务中,数据大于1T基本就不用Spark。<br>
MapReduce处理海量数据,无法取代!<br>
Storm实时流式处理,无法取代!(公司业务比如数据的第一步:数据清洗)<br>
Hive查询海量数据,无法取代!<br>
Spark快的原因:基于内存、DAG优化<br>
Spark的运行模式:
- local
- standalone(master-slave)
- yarn
- mesos
RDD: Resilient Distributed DataSet<br>
通常情况下partition大小等于split(公式)<br>
Spark五大特性:
- a list of partitions
- a function for computing each split
- a list of dependencies on other RDDs
- a partitioner for key-value RDDs
- a list of preferred locations to compute each split on
Driver:main SparkContext(DAGScheduler\TaskScheduler)<br>
WorkerNode: Executors<br>
Cluster -> WorkNode -> Executors -> Threads -> Task<br>
Application(Driver(main SparkContext (DAGScheduler、TaskScheduler)) -> Job -> Stage -> Task<br>
Transformation延迟执行:RDD->RDD<br>
Action立即执行:RDD->结果<br>
缓存RDD,对反复调用的RDD进行缓存,多次使用时可以提高速度。<br>
默认的缓存策略是MEMORY_ONLY
- MEMORY_ONLY
- MEMROY_AND_DISK
- _2
- _SER
容错<br>
Lineage重新计算,如果lineage很长,可以缓存RDD来提高效率。<br>
doCheckPoint("hdfs://"),之前需要setCheckPointDir<br>
Wide Dependence and Narrow Dependence<br>
Wide Dependence:父的RDD会去多个子RDD,切分Stage<br>
Narrow Dependence: 做DAG优化,一个partition会对应一个Task,会对应一个pipeline。<br>
Wide Dependence: 做Stage的切分,Shffle父RDD里面的partition会去向子RDD里面的多个partition。<br>
Spark程序代码会被转化为DAG,有向无环图 SparkContext.runJob(rdd) <br>
DAGScheduler会根据DAG切分Stage,并封装每个Stage为TaskSet,发送给下游的TaskScheduler submitTasks(TaskSet)。<br>
TaskScheduler会跟Yarn进行沟通,把Task打散发配到真正的某一个Executor里面去计算。<br>
配到Struggling的Task,可以配置一个speculation的选项,会去发送一个同样的Task和之前的挣扎的Task竞争。<br>
Spark作业调度
- Job Action操作
- Stage shuffle操作
- Application -> Jobs -> Stages -> Task
- runJob -> DAGScheduler ->(taskSubmit) TaskScheduler -> BackEnd