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

 

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

 

 

 

  • Spark Core:Spark核心组件,它实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed Datasets,RDD)的API定义,RDD是只读的分区记录的集合,只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。
  • Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、 HBase等多种外部数据源中的数据。Spark SQL的重要特点是能够统一处理关系表和RDD在处理结构化数据时,开发人员无须编写 MapReduce程序,直接使用SQL命令就能完成更加复杂的数据查询操作。
  • Spark Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理,其核心原理是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用 Spark Core进行快速处理。Spark Streaming支持多种数据源,如 Kafka以及TCP套接字等。
  • MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能,开发人员只需了解一定的机器学习算法知识就能进行机器学习方面的开发,降低了学习成本。
  • GraphX: Spark提供的分布式图处理框架,拥有图计算和图挖掘算法的API接口以及丰富的功能和运算符,极大地方便了对分布式图的处理需求,能在海量数据上运行复杂的图算法。
  • 独立调度器、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:是弹性分布式数据集(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或其他数据库中。

 

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

复制代码
>>> 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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-03-12 21:36  azell  阅读(17)  评论(0编辑  收藏  举报