这是我参与「第四届青训营 」笔记创作活动的的第1天
笔记分为四大部分:
一、大数据处理引擎Spark介绍
二、SparkCore原理解析
三、SparkSQL原理解析
四、业界挑战与实践
一、大数据处理引擎Spark介绍
1.常见的开源大数据处理引擎
其中着重介绍Map Reduce和Spark。
Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。
MapReduce擅长处理大数据,它为什么具有这种能力呢?这可由MapReduce的设计思想发觉。MapReduce的思想就是“分而治之”。
(1)Mapper负责“分” ,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:
一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。
(2)Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
2.Spark版本演进
3.Spark生态和特点
-统一引擎,支持多种分布式场景
-多语言支持:可支持SQL、Java\Scala、R语言和Python等
-可读写丰富的数据源:可以使用内置的DataSource,也可以进行自定义DataSource
-丰富灵活的API/算子
-支持K8S/YARN/Mesos资源调度
二、SparkCore原理解析
1.SparkCore概览图
2.RDD相关知识
RDD:弹性分布式数据集 (Resilient Distributed DataSet)
RDD有三个基本特性,分别为:分区、不可变、并行执行。
如何创建RDD:(1)使用内置RDD函数,如ShuffleRDD、HadoopRDD、JDBCRDD等。(2)自定义RDD,实现五要素对应的函数。
RDD包含两类算子,一个是Transform算子:生成一个新的RDD;另一个是Action算子:触发Job提交。
RDD依赖:描述父子RDD之间的依赖关系。窄依赖:父RDD的每个Partition至多对应一个子RDD分区。宽依赖:父RDD的每个Partition都可能对应多个子RDD分区。
3.RDD的执行流程
4.Scheduler
Spark的调度系统主要由DAGScheduler和TaskScheduler组成,一路是Stage级的调度,一路是Task级的调度,总体调度流程如下图所示:
5.Shuffle
Shuffle的概念来自Hadoop的MapReduce计算过程。当对一个RDD的某个分区进行操作而无法精确知道依赖前一个RDD的哪个分区时,依赖关系变成了依赖前一个RDD的所有分区。比如,几乎所有<key, value>类型的RDD操作,都涉及按key对RDD成员进行重组,将具有相同key但分布在不同节点上的成员聚合到一个节点上,以便对它们的value进行操作。这个重组的过程就是Shuffle操作。因为Shuffle操作会涉及数据的传输,所以成本特别高,而且过程复杂。
三、SparkSQL原理解析
1.SparkSQL的执行过程
2.Catalyst优化器
为了解决过多依赖 Hive 的问题,SparkSQL 使用了一个新的 SQL 优化器替代 Hive 中的优化器,整个 SparkSQL 的架构大致如下:
- 1.API 层简单的说就是 Spark 会通过一些 API 接受 SQL 语句。
- 2.收到 SQL 语句以后,将其交给 Catalyst,Catalyst 负责解析 SQL,生成执行计划等。
- 3.Catalyst 的输出应该是 RDD 的执行计划。
- 4.最终交由集群执行。
四、业界挑战与实践
1.shuffle稳定性问题
在大规模作业下,开源ESS的实现机制易带来大量随机读导致的磁盘IOPS瓶颈、Fetch请求积压等问题,进而导致运算过程中经常出现Stage重算甚至作业失败,进而引起资源使用的恶性循环,严重影响SLA。
2.Shuffle稳定性能解决方案
3.SQL执行性能问题
4.SQL执行性能解决方案