Spark设计与运行原理,基本操作
1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。
·Spark Core:BDAS生态系统的核心组件,是一种大数据分布式处理框架,提供了多种资源调度管理,通过内存计算、有向无环图(DAG)等机制保证分布式计算的快速,并引入了RDD的抽象保证数据的高容错性。
·Spark SQL:前身是Shark,它发布时Hive 可以说是SQL on Hadoop的唯一选择(Hive负责将SQL编译成可扩展的MapReduce 作业)。 Spark SQL允许开发人员直接处理RDD,同时也可查询在Hive 上存在的外部数据。SparkSQL的一个重要特点是能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析。
·Spark Streaming:一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计算。
·MLlib是Spark:对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。
·GraphX:是Spark中用于图和图并行计算的API,跟其他分布式图计算框架相比,GraphX最大的优势是:在Spark基础上提供了一栈式数据解决方案,可以高效地完成图计算的完整的流水作业。
·独立调度器、Yarn、 Mesos: Spark框架可以高效地在一个到数千个节点之间伸缩计算,集群管理器则主要负责各个节点的资源管理工作,为了实现这样的要求,同时获得最大的灵活性, Spark支持在各种集群管理器( Cluster Manager)上运行, Hadoop Yarn、Apache Mesos以及 Spark自带的独立调度器都被称为集群管理器。
2.请详细阐述Spark的几个主要概念及相互关系:
RDD,DAG,Application, job,stage,task,Master, worker, driver,executor,Claster Manager
·RDD:弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
·DAG:有向无环图,是一组顶点和边的组合。顶点代表了 RDD, 边代表了对 RDD 的一系列操作,常用于建模。
·Application:用spark-submit提交的程序。一个application通常包含三部分:从数据源取数据形成RDD,通过RDD的transformation和action进行计算,将结果输出到console或者外部存储。
·job:一个action算子就算一个Job。包含很多task的并行计算,可以认为是Spark RDD 里面的action,每个action的计算会生成一个job。用户提交的Job会提交给DAGScheduler,Job会被分解成Stage和Task。
·stage:stage概念是spark中独有的。一般而言一个Job会切换成一定数量的stage。各个stage之间按照顺序执行。至于stage是怎么切分的,首选得知道spark论文中提到的narrow dependency(窄依赖)和wide dependency(宽依赖)的概念。其实很好区分,看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。宽依赖和窄依赖的边界就是stage的划分点。从spark的论文中的两张截图,可以清楚的理解宽窄依赖以及stage的划分。
·task:task是Spark中最新的执行单元。RDD一般是带有partitions的,每个partition的在一个executor上的执行可以任务是一个task。
·Master:负责管理worker节点,从master节点提交应用。
·worker:master节点通信,并且管理executor进程。
·driver:driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程,
·executor:executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task,executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。
·Claster Manager:集群上获取资源的外部服务。
1个Application中至少有1个job;
1个job中依据宽窄依赖划分至少有一个stage(至少有一个resultStage);
1个stage中依据分区至少有一个task(至少一个分区)。
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
>>> sc >>> lines = sc.textFile( "file:///home/hadoop/my.txt" ) >>> lines >>> words = lines.flatMap( lambda line:line.split()) >>> words >>> wordKV = words. map ( lambda word:(word, 1 )) >>> wordKV >>> lineKV = lines. map ( lambda line:( 1 ,line)) >>> lineKV >>> lines.foreach( print ) >>> words.foreach( print ) >>>wordKV.foreach( print ) >>>lineKV.foreach( print ) |
关系转换图: