与Hadoop中的MapReduce计算模型差异
MapReduce:
- 磁盘IO开销大
- Map/Reduce表达能力有限,难以描述复杂的数据处理过程
- 延迟高: 磁盘读写延迟;Map/Reduce分阶段执行导致的延迟
- 不利于迭代式
Spark:
- 内存计算(也不是完全在内存,比如shuffle;比如RDD默认存放在内存中,但内存不足时RDD将被写入磁盘)
- 比Map/Reduce更多的操作模式,不仅实现了Map/Reduce的算子map函数和reduce函数及计算模型,还提供更为丰富的算子,如filter、 join、groupByKey等
- 基于DAG的调度机制,优化
生态系统(the Berkeley Data Analytics Stack)
Spark Core:包含Spark基本功能
Spark SQL:允许开发人员直接处理RDD,同时也可以查询Hive、HBase等外部数据源
Spark Streaming:实时流数据处理,支持多种数据输入源,如Kafka、Flue、TCP套接字等
GraphX:图计算
MLlib
基本概念
RDD:
- 将数据拆分为多个分区的集合,储存在集群中的worker node上的内存中,每个分区有计算函数,计算该分区的数据
- RDD的操作: transformation (lazy),action (non-lazy);对于transformation,RDD不会直接计算结果,仅记录操作,只有遇到action时才进行计算
- 只读
- 分区数量可动态变化(数据集可大可小)
- 可分布式地储存在多台机器的内存中
DAG:
- 反应RDD间的依赖关系
- DAGScheduler将DAG划分为多个stage,每个stage由一组并行的task组成
- 计算向数据靠拢:优先把计算分发到数据所在的节点,减少数据的移动开销
Application:建立在Spark上的用户程序,包含一个driver program和集群上的executors
Driver program: 执行application中的main方法和创建SparkContext的进程
Cluster manager: 在集群上获取资源的外部服务(与Spark运行过程无关),可以是 Spark’s own standalone cluster manager, Apache Mesos,Hadoop YARN 或 Kubernetes,
Worker node:集群中可以运行applicaion的节点,每个worker node上有一个executor,每个executor派生多个线程,执行具体的task
Executor:工作在worker node上的执行task和存储RDD的进程,每个application有自己专属的executor进程
Task:被送到某个executor上的工作单元,一个task包含多个RDD及作用在相应RDD上的各种操作
Job:包含多个task的并行运行,往往由Spark action触发
Stage:每个job被分成相互依赖的多组tasks,每组tasks称为stage
运行架构
一个application由一个driver program和若干个job组成,一个job由多个stage组成,一个stage由多个task组成
- 当一个application被提交时,首先为这个application构建基本的运行环境,即由driver program创建一个SparkContext,并在之后通过SparkContext主导application的运行
- SparkContext连接cluster manager,并向其申请资源
- 启动executor进程
- SparkContext根据RDD依赖关系构建DAG,DAGScheduler解析成多个stage并计算出stage间依赖关系,然后发送给TaskScheduler
- TaskScheduler将task分发给executor(计算将数据靠拢原则),同时SparkContext将application的代码发送给executor
- executor运行task后,将结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放资源
部署模式
standalone
Spark on Mesos
Spark on YARN
Notes
分布式的两种典型架构模式:master-slave pattern / peer-to-peer pattern
Reference