1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能
Spark Core:
是整个BDAS生态系统的核心组件,是一个分布式大数据处理框架。其包含Spark最基础和最核心的功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等,主要面向批数据处理。Spark Core建立在统一的抽象RDD之上,使其可以以基本一致的方式应对不同的大数据处理场景。
Spark SQL:
其本质上是通过Hive 的HQL 进行解析,把HQL 翻译成Spark 上对应的RDD 操作,然后通过Hive 的Metadata 获取数据库里的表信息,实际为HDFS 上的数据和文件,最后由Shark 获取并放到Spark 上运算。
Spark Streaming:
Spark Streaming 是一个对实时数据流进行高吞吐、高容错的流式处理系统。可以对多种数据源进行类似Map、Reduce 和Join 等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。核心思路是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用Spark Core进行快速处理。
BlinkDB:
BlinkDB 是一个用于在海量数据上运行交互式SQL 查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应时间,其数据的精度被控制在允许的误差范围内。
MLBase:
MLBase 是Spark 生态系统中专注于机器学习的组件,它的目标是让机器学习的门槛更低,让一些可能并不了解机器学习的用户能够方便地使用MLBase。
GraphX:
GraphX 扩展了Spark RDD 的抽象,它有Table 和Graph 两种视图,但只需要一份物理存储,两种视图都有自己独有的操作符,从而获得了灵活操作和执行效率。支持图并行计算。
SparkR:
提供了Spark 中弹性分布式数据集(RDDs)的API,用户可以在集群上通过R Shell交互性地运行Spark 任务。
支持序化闭包功能,可以将用户定义函数中所引用到的变量自动序化发送到集群中其他的机器上。
SparkR 还可以很容易地调用R 开发包,只需要在集群上执行操作前用includePackage读取R 开发包就可以了。
MLlib:
MLlib:是Spark 实现一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化。该算法可以进行可扩充。
2.请阐述Spark的几个主要概念及相互关系:
RDD,DAG,Application, job,stage,task,Master, worker, driver,executor,Claster Manager
RDD:是弹性分布式数据集(Resilient Distributed Dataset)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。
DAG:是有向无环图(Directed Acyclic Graph)的简称,反映RDD之间的依赖关系。
Executor:是运行在工作节点(Work Node)上的一个进程,负责运行任务,并为应用程序存储数据。
Application应用:用户编写的Spark应用程序。
Task任务:分发到Executor上的工作任务,是spark实际执行应用的最小单元。
Job作业:一个作业包含多个RDD及作用于相应RDD上的各种操作。
Stage阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“stage(阶段)”,或者也被称为“任务集”
Master:任务控制节点,简称driver
worker:运行作业任务的工作节点
driver:任务控制节点
Claster Manager:集群资源管理器
相互关系:
在Spark中,一个应用(Application)由一个任务控制节点(Driver)和若干个作业(Job)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个任务(Task)组成。当执行一个应用时,任务控制节点Driver会向集群管理器(Cluster Manager)申请资源,启动Executor,并向Executer发送应用程序代码和文件,然后在Executor上执行任务。运行结束后,执行结果会返回给任务控制节点Driver,或写到HDFS或其他数据库中。
图2-1 Spark运行架构
图2-2Spark中各种概念之间的互相关系
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。
>>> sc
>>> lines = sc.textFile("file:///home/hadoop/bigdatahomework/english.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)
自己生成sc
答: