3.Spark设计与运行原理,基本操作
1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。
1. Spark Core
Spark Core是整个BDAS的核心组件,是一种大数据分布式处理框架,不仅实现了MapReduce的算子map函数和reduce函数及计算模型,还提供如filter、join、groupByKey等更丰富的算子。
Spark将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。其底层采用Scala函数式语言书写而成,并且深度借鉴Scala函数式的编程思想,提供与Scala类似的编程接口。
2. Mesos
Mesos是Apache下的开源分布式资源管理框架,被称为分布式系统的内核,提供了类似YARN的功能,实现了高效的资源任务调度
3. Spark Streaming
Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计算。
4. MLlib
MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类以及协同过滤,还包括一个底层的梯度下降优化基础算法。
5. GraphX
GraphX是Spark中用于图和图并行计算的API,可以认为是GraphLab和Pregel在Spark (Scala)上的重写及优化,与其他分布式图计算框架相比,GraphX最大的贡献是,在Spark上提供一栈式数据解决方案,可以方便、高效地完成图计算的一整套流水作业。
6. Spark SQL
Shark是构建在Spark和Hive基础之上的数据仓库。它提供了能够查询Hive中所存储数据的一套SQL接口,兼容现有的Hive QL语法。熟悉Hive QL或者SQL的用户可以基于Shark进行快速的Ad-Hoc、Reporting等类型的SQL查询。由于其底层计算采用了Spark,性能比Mapreduce的Hive普遍快2倍以上,当数据全部存储在内存时,要快10倍以上。2014年7月1日,Spark社区推出了Spark SQL,重新实现了SQL解析等原来Hive完成的工作,Spark SQL在功能上全覆盖了原有的Shark,且具备更优秀的性能。
7. Alluxio
Alluxio(原名Tachyon)是一个分布式内存文件系统,可以理解为内存中的HDFS。为了提供更高的性能,将数据存储剥离Java Heap。用户可以基于Alluxio实现RDD或者文件的跨应用共享,并提供高容错机制,保证数据的
可靠性。
8. BlinkDB
BlinkDB是一个用于在海量数据上进行交互式SQL的近似查询引擎。它允许用户在查询准确性和查询响应时间之间做出权衡,执行相似查询。
2.请阐述Spark的几个主要概念及相互关系:
RDD,DAG,Application, job,stage,task,Master, worker, driver,executor,Claster Manager
RDD:是弹性分布式数据集(Resilient Distributed Dataset)的英文缩写,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
DAG : 是指有向无环图(有方向 ,无闭环) ; 是对多个RDD转换过程和依赖关系的描述 ; 触发 Action 就会形成一个完整的 DAG ,一个DAG 对应一个 Job .
Application : 一个SparkContext就是一个application,通过spark-submit脚本提交给集群。 一个Application 中可以触发多次 Action ,触发一次 Action 产生一个 Job ;一个Application 中可以有一到多个 Job .
Job: 用户提交的作业,Job包含多个Task.
Stage: Stage 是指任务执行阶段 ,执行是有先后顺序的 ,先执行前面的 ,再执行后面的 ;一个Stage 对应一个TaskSet ,一个TaskSet 中的 Task 的数量取决于Stage 中最后一个RDD 分区的数量 .
Task: 是Spark中任务最小的执行单位 ,Task 分类两种 ,即 ShuffleMapTask 和 ResultTask .Task 的数量取决于Stage 中最后一个RDD分区的数量 ,Task 的数量决定并行度(分区数) ,同时也要考虑Spark 中可用的 cores .
Master: Spark特有资源调度系统的 Leader,掌管着整个集群的资源信息(Standalone模式),类似于 Yarn 集群中的ResourceManager。管理 Worker、Application(接收 Worker 的注册并管理所有的 Worker;接收 Client 提交的 Application,调度等待的Application 并向Worker提交)。
Worker: Spark 特有资源调度系统的 Slaver,一个集群中有多个 Slaver(Standalone),每个 Slaver 掌管着所在节点的资源信息,类似于 Tarn 框架中的 NodeManager。根据 Master 发送的 Application 配置进程环境,并启动 ExecutorBackend(执行 Task 所需的临时进程)。
Driver:Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭。
Executor: 在 worker node 上 application 启动的一个进程, 该进程运行 task 并在内存或磁盘上保存数据. 每个 application 都有其独有的 executor.
Cluster manager: 获取集群资源的一个外部服务, 比如 standalone 管理器, Mesos 和 YARN.
Master、Worker、Driver 、Executor之间的关系:
driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks,然后将这些tasks分配到各个executor中执行。
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。
>>> sc
>>> lines = sc.textFile("file:///home/hadoop/test.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)
>>> lines.foreach(print)
>>> words.foreach(print)
>>>wordKV.foreach(print)
>>>lineKV.foreach(print)
相应的RDD转换关系图。