Apache Spark基础及架构浅谈
一、什么是Spark?
Apache Spark是一款由加州大学伯克利分校AMP实验室开发的专为大规模数据处理而设计的快速通用的开源计算引擎。Spark不仅具有Hadoop MapReduce的优点,还具有自己独特的优势,例如,Job的中间输出结果可以存在内存中,从而避免了HDFS的读写操作,使其能够在需要迭代MapReduce的场景下,如数据挖掘和机器学习等,具备更强的数据处理能力。
二、Spark的优势:
1.速度快: 基于内存数据处理,比MapReduce快100个数量级以上;基于硬盘数据处理,比MapReduce快10个数量级以上。
2.易用性: 支持Java、Scala、Python、R语言及交互式shell方便开发测试。
3.通用性: 一栈式处理:批处理、交互式查询、实时流处理、图计算及机器学习。
4.支持多种资源管理器: YARN、Mesos、EC2、Kubernetes、Standalone、Local。
三、Spark技术栈:
- Spark Core:核心组件,分布式计算引擎。
- Spark SQL:高性能的基于Hadoop的SQL解决方案。
- Spark Streaming:可以实现高吞吐量、具备容错机制的准实时流处理系统。
- Spark GraphX:分布式图处理框架。
- Spark MLlib:构建在Spark上的分布式机器学习库。
四、Spark基本原理:
Spark Streaming:构建在Spark上处理Stream数据的框架,基本的原理是将Stream数据分成小的时间片段(几秒),以类似batch批量处理的方式来处理这小部分数据。Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+),虽然比不上专门的流式数据处理软件,也可以用于实时计算,另一方面相比基于Record的其它处理框架(如Storm),一部分窄依赖的RDD数据集可以从源数据重新计算达到容错处理目的。此外小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑和算法。方便了一些需要历史数据和实时数据联合分析的特定应用场合。
五、Spark架构设计:
1.运行架构:
- 在驱动程序中,通过SparkContext主导应用的执行。
- SparkContext可以连接不同类型的Cluster Manager(Standalone、YARN、Mesos),连接后,获得集群节点上的Executor。
- 一个Worker节点默认一个Executor,可通过SPARK_WORKER_INSTANCES调整。
- 每个应用获取自己的Executor。
- 每个Task处理一个RDD分区。
2.Spark架构核心组件:
术语 | 说明 |
---|---|
Application | 建立在Spark上的用户程序,包括Driver代码和运行在集群各节点Executor中的代码 |
Driver program | 驱动程序。Application中的main函数并创建SparkContext |
Cluster Manager | 在集群(Standalone、Mesos、YARN)上获取资源的外部服务 |
Worker Node | 集群中任何可以运行Application代码的节点 |
Executor | 某个Application运行在worker节点上的一个进程 |
Task | 被送到某个Executor上的工作单元 |
Job | 包含多个Task组成的并行计算,往往由Spark Action触发生成,一个Application中往往会产生多个Job |
Stage | 每个Job会被拆分成多组Task,作为一个TaskSet,其名称为Stage |
六、Spark API:
1.SparkContext:
- 连接Driver与Spark Cluster(Workers);
- Spark的主入口;
- 每个JVM仅能有一个活跃的SparkContext;
创建sparkContext:
import org.apache.spark.{SparkConf, SparkContext}
val conf = new SparkConf().setMaster("local[2]").setAppName("HelloSpark")
val sc = SparkContext.getOrCreate(conf)
2.SparkSession:
Spark 2.0+应用程序的主入口:包含了SparkContext、SQLContext、HiveContext以及StreamingContext。
创建SparkSession:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder
.master("local[2]")
.appName("appName")
.getOrCreate()
3.RDD:
Spark核心,主要数据抽象。
4.Dataset:
从Spark1.6开始引入的新的抽象,特定领域对象中的强类型集合,它可以使用函数或者相关操作并行地进行转换等操作。
5.DataFrame:
DataFrame是特殊的Dataset。
七、Spark工作过程简略版:
- driver端建立链接;
- 定义rdd,定义算子;
- 生成DAG(有向无环图);
- DAG调度计划,划分阶段 ,生成taskSet;
- 通过clusterManager链接集群资源管理器,提交任务集;
- 集群分配资源;
- work上启动executor;
- executor加载管理任务;
- driver收取结果,并完成任务。
注:阶段之间的数据传递使用拉而不是推。