赞
踩
Spark 基于内存式计算的分布式的统一化的数据分析引擎。
Spark 框架模块包含:Spark Core、Spark SQL、Spark Streaming、Spark GraphX、 Spark MLlib,而后四项的能力都是建立在核心引擎之上。
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合一样轻松的操作分布式数据集。Spark具有运行速度快、易用性好、通用性强和随处运行等特点。
运行速度快:Spark支持内存计算
Spark处理数据与MapReduce处理数据相比,有如下3个不同点:
MapReduce | Spark | |
---|---|---|
计算流程结构 | Map和Reduce的结果都必须进入磁盘 | 支持DAG,一个程序中可以有多个Map、Reduce过程,多个Map之间的操作可以直接在内存中完成 |
中间结果存储 | 磁盘 | 不经过Shuffle的中间处理结果数据直接存储在内存中 |
Task运行方式 | 进程(Process):MapTask、ReduceTask | 线程(Thread):所有Task都以线程方式存在,不需要频繁启动、申请资源 |
Spark 框架编写的应用程序可以运行在本地模式(Local Mode)、集群模式(Cluster Mode)和云服务(Cloud),方便开发测试和生产部署。
集群模式:
Spark context Web UI available at http://node1.itcast.cn:4040
Spark为每个程序都提供了一个Web监控界面,端口从4040开始,如果被占用就不断+1,方便我们对每个程序的运行状况做监控。
Spark context available as ‘sc’ (master = local[2], app id = local-1652950421045)
SparkContext是Spark程序中的一个类,任何一个Spark的程序都必须包含一个SparkContext类的对象
功能: |
---|
1. 负责启动、监听整个程序组件 |
2. 负责管理当前程序的所有配置信息 |
3. 负责读取外部数据,将数据构建为RDD |
4. 负责解析同步提交job等 |
SparkSession available as ‘spark’
SparkSession也是Spark程序中的一个类,功能类似于SparkContext,Spark2.0以后推出的,主要用于SparkSQL
# 脚本:spark-submit spark-submit \ --master spark://node1.itcast.cn:7077 \ --name test_app \ --deploy-mode client \ --driver-memory 512M \ --driver-cores 1 \ --supervise \ --executor-memory 1G \ --executor-cores 1 \ --total-executor-cores 2 \ 执行的程序的路径 \ 参数1 \ 参数2 \ …
–master: 用于指定程序的运行的模式:Local、Standalone、YARN、Mesos、K8s
参数 | 注释 |
---|---|
local[N]: | 使用本地模式,给N核CPU |
spark://主机名:7077: | 使用Standalone模式,提交给Master |
yarn: | 使用YARN集群模式,提交给ResourceManager |
–name: 指定程序的名字,等同于代码中setAppName
–deploy-mode: 部署模式,决定Driver程序运行在哪里。
–deploy-mode: 决定了Driver进程运行的位置,两种模式:client【默认】、cluster
–jars: 指定额外的第三方依赖包,例如读写MySQL,需要MySQL的驱动包
–conf: 指定一些其他配置–conf key=value, 等同于代码中set方法
–driver-memory: 用于指定Driver进程运行时能够使用的内存大小
–driver-cores: 用于指定Driver进程运行时能够使用CPU的核数
–supervise: 用于保证Driver进程安全,故障以后会自动重启
–executor-memory: 用于指定每个Executor能使用的内存数
–executor-cores: 用于指定每个Executor能使用的CPU核心数
–total-executor-cores: 用于指定 Standalone 情况下,所有Executor使用的总CPU核数
—num-executors: 用于指定 YARN 情况下,指定启动的Executor的个数
–queue: 用于指定将程序提交到哪个队列中运行
Standalone集群使用了分布式计算中的master-slave模型,master是集群中含有Master进程的节点,slave是集群中的Worker节点含有Executor进程。Standalone集群是Spark自己研发的,类似Hadoop YARN的,一个管理集群资源和调度资源的架构。
主节点Master(管理节点): 一个JVM Process进程,主要负责整个集群的资源的调度和分配,并进行集群的监控等职责,接收所有程序的提交,分配Task任务给从节点。
从节点Workers(计算节点): 一个JVM Process进程,管理单个机器的资源,分配相应的资源来运行Executors 进程 ;资源信息包含内存Memory和CPU Cores核数。一个Worker运行在集群中的一台服务器上,主要负责两个职责,一个是用自己的内存存储RDD的某个或某些partition;另一个是启动其他进程和线程(Executor),对RDD上的partition进行并行的处理和计算。
MR on YARN | Spark on Standalone |
---|---|
ResourceManager | Master |
NodeManager | Worker |
AppMaster | Driver |
计算进程:MapTask、ReduceTask | Executor |
task 线程 |
Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群 一样,存在着Master单点故障(SPOF)问题。可以通过Zookeeper的master高可用解决!
ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master,但是只有一个是Active的,其他的都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。
client 模式
cluster 模式
主节点ResourceManage 代替了 Master ,从节点NodeManage 代替了 Workers
Client 模式
详细流程:
cluster 模式
详细流程:
AppMaster与Driver合并: Driver以子进程的方式运行在AppMaster进程内部,整体负责实现资源申请、Task的解析、调度和监控
RDD会不断进行转换处理,得到新的RDD,每个RDD之间就产生了依赖关系。
例如:A调用转换算子产生了B,那么我们称A为父RDD,称B为子RDD
窄依赖 (Narrow Dependencies):父RDD的一个分区的数据只给了子RDD的一个分区【不用调用分区器】
宽依赖 (Wide/Shuffle Dependencies):父RDD的一个分区的数据给了子RDD的多个分区【需要调用Shuffle的分区器来实现】
Shuffle的本质是基于磁盘来解决分布式的全局分组、全局排序、重新分区 (调大) 的问题。
Spark2.0版本后,所有Shuffle方式全部统一到Sort Shuffle实现。
Shuffle分为Shuffle Write 和 Shuffle Read:
Stage输出的结果先写入内存缓冲区,内存中排序以后,生成小文件,小文件合并成整体有序的大文件以及索引文件。类似于MR中 溢写小文件–小文件合并成大文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。