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

三.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的几个主要概念及相互关系

Master、Worker

  MasterWorker是Spark独立集群里用到的类。如果是yarn环境部署,是不需要这两个类的。Master是Spark独立集群的控制者,Worker是工作者,一个Spark独立集群需要启动一个Master和多个Worker。

Spark提供了Master选举功能,保障Master挂掉的时候能选出另一个Master,做一个切换的动作,这块原理和ZooKeeper类似。Master节点常驻Master守护进程,负责管理Worker节点,从Master节点提交应用。

Worker节点常驻worker守护进程,与Master节点通信,并且管理executor进程。

 RDD、DAG

RDD:Resillient Distributed Dataset(弹性分布式数据集),是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。

DAG:Directed Acyclic Graph(有向无环图),反映RDD之间的依赖关系。

 

Application、Job、Stage、Task

  RDD任务切分中间分为:Application、Job、Stage和Task。Application(应用)用户编写的Spark应用程序。Job(作业)Job是用户程序一个完整的处理流程,是逻辑的叫法。一个作业可以包含多个RDD及作用于相应RDD上的各种操作。Stage(阶段)是作业的基本调度单位,每个作业会因为RDD之间的依赖关系拆分成多组任务集合TaskSet,称为调度阶段。调度阶段的划分是由DAGScheduler来划分的,有Shuffle Map Stage和Result Stage两种。Task(任务)分发到Executor上的工作任务,是spark实际执行应用的最小单元,一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。一个Stage可以包含多个task,比如sc.textFile("/xxxx").map().filter(),其中map和filter就分别是一个task。每个task的输出就是下一个task的输出。

 

Driver、Executor、Claster Manager

  Driver进程应用 main() 函数并且构建sparkContext对象。当我们提交了应用之后,便会启动一个对应的Driver进程,Driver本身会根据我们设置的参数占有一定的资源就是Executor。然后集群管理者会分配一定数量的Executor,每个Executor都占用一定数量的cpu和memory。这里Executors其实是一个独立的JVM进程,在每个工作节点上会起一个,主要用来执行task,一个executor内,可以同时并行的执行多个task。而Claster Manager主要负责整个程序的资源调度目前的主要调度器有:YARN、Spark Standalone、Mesos。

 

DAGScheduler、TaskScheduler

  DAGScheduler:面向调度阶段的任务调度器,负责接收spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交调度阶段给TaskScheduler.

TaskScheduler:面向任务的调度器,它接受DAGScheduler提交过来的调度阶段,然后把任务分发到work节点运行,由Worker节点的Executor来运行该任务

 

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

>>> 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-15 17:12  阿斯顿法定  阅读(68)  评论(0编辑  收藏  举报