01 Spark是什么
简单的说Apache Spark是一个开源的、强大的分布式查询和处理引擎,它提供MapReduce的灵活性和可扩展性,但速度明显要快上很多;拿数据存储在内存中的时候来说,它比Apache Hadoop 快100倍,访问磁盘时也要快上10倍。
02 Spark生态系统
- Spark Core:Spark Core包含Spark的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark建立在统一的抽象RDD之上,使其可以以基本一致的方式应对不同的大数据处理场景;通常所说的Apache Spark,就是指Spark Core;
- Spark SQL:兼容HIVE数据,提供比Hive更快的查询速度(10~100x)的分布式SQL引擎,开发者可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析;
- Spark Streaming:流式计算分解成一系列小的批处理作业利用spark轻量级低时延的框架来支持流数据处理,目前已经支持Kafka,Flume等;
- MLilb:提供基于Spark的机器学习算法库,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作;
- GraphX:提供图形计算框架,与Pregel/GraphLab兼容。
03 Spark的特点
- 运行速度快:Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍;
- 容易使用:Spark支持使用Scala、Java、Python和R语言进行编程,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程;
- 通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算;
- 运行模式多样:Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
04 Spark术语
- Application:基于spark的用户程序,包含了一个driver program 和集群中多个 executor;
- Driver Program:运行application的main()函数并自动创建SparkContext。通常SparkContext 代表driver program;
- Executor:为某个Application运行在worker node 上的一个进程。该进程负责运行task并负责将数据存储在内存或者硬盘上,每个application 都有自己独立的 executors;
- Cluster Mannager:在集群上获得资源的外部服务(spark standalon,mesos,yarm);
- Worker Node:集群中任何可运行application 代码的节点;
- RDD:spark 的基本运算单元,通过scala集合转化,读取数据集生成或者由其他RDD经过算子操作得到;
- Job:可以被拆分成task并行计算的单元,一般为spark action 触发的一次执行作业;
- Stage:每个job会被拆分成很多组task,每组任务被称为stage,也可称TaskSet,该属于经常在日志中看到;
- task:被送到executor上执行的工作单元。
05 Spark执行过程
SparkContext(SC)
解读Spark执行过程之前,我们需要先了解一下SparkContext是什么。
SparkContext:SparkContext是spark功能的主要入口。其代表与spark集群的连接,能够用来在集群上创建RDD、累加器、广播变量。每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前的SparkContext。在SparkContext的初始化过程中,Spark会分别创建DAGScheduler作业和TaskScheduler任务调度两级调度模块。
更直白的可以说SparkContext是Spark的入口,相当于应用程序的main函数。目前在一个JVM进程中可以创建多个SparkContext,但是只能有一个激活状态的。
Spark执行
任何Spark应用程序在执行的时候都会分离主节点上的单个驱动程序(Driver Program)(程序中可以有多个作业),然后将执行进程分配给多个工作节点(Worker Node),驱动进程会确定任务进程的数量和组成,这些任务进程是根据为指定作业生成的图形分配给执行节点的。
Spark详细执行流程
- 当一个Spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源;
- 资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上;
- SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor;
- 任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
06 Pyspark
Apache Spark是用Scala编程语言编写的。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,我们也可以使用Python编程语言中的 RDD 。正是由于一个名为Py4j的库,他们才能实现这一目标。
目前,70%数据科学家和分析专家都使用Python,能够将Python和Spark相结合,也给该类人群带来了福音。