《Spark Streaming实时流式大数据处理实战》 ——2.2 Spark运行模式

举报
华章计算机 发表于 2020/02/22 13:41:11 2020/02/22
【摘要】 本节书摘来自华章计算机《Spark Streaming实时流式大数据处理实战》 —— 书中第2章,第2.2.1节,作者是肖力涛 。

2.2  Spark运行模式

  Spark提供了4种模式,分别是本地模式、Standalone模式、Spark On Yarn模式及Spark On Mesos模式。其中,本地模式包含了单机模式和单机伪集群模式,用于基本的调试与实验,而另外3种模式都是基于不同资源调配的集群模式,一般是生产环境中搭建的分布式集群。

  为了更清楚地讲解Spark中不同的运行模式,我们先对Spark集群的运作方式从整体上进行一个介绍,其中需要清楚几个关键的概念,如图2.2所示。

  图2.2中给出了应用程序在Spark集群中运行时涉及的相关概念。

* Application:提交到Spark集群的应用程序,简称App。

* Driver:执行应用程序中创建SparkContext的main函数的进程,一般在集群的任何节点向集群提交应用程序,就可以将该节点称做Driver节点。

* Cluster manager:即集群管理器,作为Spark集群的“神经中枢”,统筹管理Spark集群的各种资源,包括CPU和内存等,并分配不同服务所需的资源(例如standalone manager即Master、Mesos和Yarn)。

* Master节点:即部署Cluster manager的节点,是一个物理层的概念。

* Worker:任何在集群中运行应用程序的节点,其接收集群管理器的调度安排,为应用程序分配必需的资源,生成Executor,起到桥梁作用。

* Slave节点:即部署Worker的机器节点,每个Slave节点可以有多个Worker进程,是一个物理层的概念。

* Executor:表示应用在Worker节点中进行实际计算的继承,进程会接收切分好的Task任务,并将结果缓存在节点内存和磁盘上。

* Task:被分配到各个Executor的单位工作内容,它是Spark中的最小执行单位,一般来说有多少个Paritition(物理层面的概念,即分支可以理解为将数据划分成不同部分并行处理),就会有多少个Task,每个Task只会处理单一分支上的数据。

* Job:由多个Task的并行计算部分,一般Spark中的action操作(如save、collect,下一章会进一步说明),会生成一个Job。

* Stage:是Job的组成单位,一个Job会切分成多个Stage,Stage彼此之间相互依赖顺序执行,而每个Stage是多个Task的集合,类似map和reduce stage。

 image.png

图2.2  Spark的不同组件

  下面用一个例子来解释Spark应用的过程,以及其中概念的对应关系。假设我们需要做如下所述的事情,如图2.3所示(将在第3章介绍RDD的各类操作,然后在3.8节用一个小实例实现这个例子,读者在学习第3章后可以动手实践该例子)。

  (1)将一个包含人名和地址的文件加载到RDD1中。

  (2)将一个包含人名和电话的文件加载到RDD2中。

  (3)通过name来拼接(join)RDD1和RDD2,生成RDD3。

  (4)在RDD3上做映射(map),给每个人生成一个HTML展示卡作为RDD4。

  (5)将RDD4保存到文件中。

  (6)在RDD1上做映射(map),从每个地址中提取邮编,结果生成RDD5。

  (7)在RDD5上做聚合,计算出每个邮编地区中生活的人数,结果生成RDD6。

  (8)收集(collect)RDD6,并且将这些统计结果输出到stdout。

 image.png

图2.3  以概念解释例子

  图2.3中第①、②、⑤、⑧步涉及输入和输出操作,其余是对RDD的操作(数字①~⑧对应上面所述的8个步骤)。以这个例子为参考,接下来解释Driver program、Job和Stage这几个概念。

* Driver program是全部的代码,运行所有的8个步骤。

* 第⑤步中的save和第⑧步中的collect都会产生Spark Job。Spark中每个action对应着一个Job,注意Transformation不会产生Job。

* 其他几步(①、②、③、④、⑥、⑦)被Spark组织成多个Stages,每个Job则是一些Stage序列的结果。对于一些简单的场景,一个Job可以只有一个Stage。但是对于数据重分区的需求(比如第③步中的join),或者任何破坏数据局域性的事件,通常会产生更多的Stage。可以将Stage看作能够产生中间结果的计算,这种计算可以被持久化,比如可以把RDD1持久化来避免重复计算。

  以上3个概念解释了某个程序运行时被拆分的逻辑。相比之下,Task是一个特定的数据片段,在指定的Executor上运行,并且可以跨越某个特定的Stage。

2.2.1  本地模式

  该模式又可以称为单机模式,是Spark为开发人员提供的单机测试环境,利用单机的多个线程来模拟Spark分布式计算,用于对程序进行调试,验证应用逻辑的正确性。

  我们可以通过两种方式来启用这种模式运行我们的程序:一种是在向Spark提交应用时,利用--master local[N]参数来设置;另一种方式是直接在程序中用setMaster("local[N]")进行设置。

  其中N表示用几个线程来模仿Spark集群节点,从而模仿应用程序在集群上的执行,该运行模式非常简单,我们不需要启动任何Spark的Master和Worker等守护进程,另外如果不需要使用HDFS,也不需要启动Hadoop的各项服务。

  举一个简单的例子,假设有一个Spark小程序用来统计input.txt文件中每个单词出现的数量,主类是com.spark.hello.HelloSpark,有两种方式来利用local模式运行该程序。

  我们可以在向Spark提交的时候,在命令行中直接加入--master local[2]参数,代码如下:

  

  $ spark-submit --class com.spark.hello.HelloSparkStreaming --master local

    [2] target/spark-streaming_hello-0.1-jar-with-dependencies.jar file:

    //input.txt

  

  或者在初始化SparkContext时,在配置master时设置:

  

  val conf = new SparkConf().setAppName("spark-streaming_hello").setMaster

    ("local[2]")


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。