3.Spark设计与运行原理,基本操作

1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。

 

Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的

Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。

Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据

MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。

GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作

 

2.请详细阐述Spark的几个主要概念及相互关系:

  Master, Worker;  RDD,DAG; Application, job,stage,task; driver,executor,Claster Manager

--------------------------------------------------

  DAGScheduler, TaskScheduler.

 

Master<--->Worker <--Executor(挂载)

Master与worker的关系可以归为Master管理Worker,Worker通过Master提交,Master就发送使用调度算法给Application分配资源,完成消息的传递,实际的操作交给Worker

RDD为弹性数据集,具体操作过程中有简化计算过程的能里,Spark中只有遇到action才会执行RDD的计算,可以不用管中间结果,并且支持缓存,在内存中计算

Driver:即main函数并且构造sparkcontext对象,然后向executor申请资源,管理一个应用

Executor:挂载在Worker节点上,为程序要求缓存的RDD提供内存式存储,负责内存管理

Manager:管理应用执行过程中的资源分配

Cluster Manger:在基于standalone的Spark集群,Cluster Manger就是Master。

DAGScheduler:划分阶段,形成一系列的TaskSet,然后传给TaskScheduler,把具体的Task交给Worker节点上的Executor的线程池处理。线程池中的线程工作,通过BlockManager来读写数据。 

DASGScheduler->TaskSet->TaskScheduler->Executor

Job:调用RDD的一个action,如count,即触发一个Job

Stage :表示一个Job的DAG,会在发生shuffle处被切分,切分后每一个部分即为一个Stage

Task : 最终被发送到Executor执行的任务

Driver由框架直接生成; 
Executor执行的才是我们的业务逻辑代码。 
执行的时候,框架控制我们代码的执行。Executor需要执行的结果汇报给框架也就是Driver。

3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。

>>> sc

输出结果:

 

>>> lines = sc.textFile("file:///home/hadoop/TextOne.txt")

>>> lines

输出结果:

 

 >>> words=lines.flatMap(lambda line:line.split())

>>> words

输出结果:

 

 >>> wordKV=words.map(lambda word:(word,1))

>>> wordKV

输出结果:

 

 >>> wc=wordKV.reduceByKey(lambda a,b:a+b)

>>> wc

输出结果:

 

 >>> cs=lines.flatMap(lambda line:list(line))

>>> cs

输出结果:

 

 >>> cKV=cs.map(lambda c:(c,1))

>>> cKV

输出结果:

 

 >>> cc=cKV.reduceByKey(lambda a,b:a+b)

>>> cc 

输出结果:

 

>>> lines.foreach(print)

输出结果:

 

>>> words.foreach(print)

输出结果:

 

 >>> wordKV.foreach(print)

输出结果:

 

 >>> cs.foreach(print)

输出结果:

 

 >>> cKV.foreach(print)

输出结果:

 

 

 >>> wc.foreach(print)

输出结果:

 

 

 >>> cc.foreach(print)

输出结果:

posted @ 2022-03-13 00:09  益康大排档  阅读(31)  评论(0编辑  收藏  举报