1.引言吧阿西吧,对于Spark新手来说,首先对于Spark的运行机制不了解,往往跟你交流的时候,互相都不知道在说什么,比如部署模式和运行模式,可能都混为一谈,对于有一定开发经验的老手,即使知道运行机制,可能在表述上,对Spark的各种术语也不是很懂,因此理解Spark术语,是Spark开发者之间沟通的必要之路,本文从Spark的运行机制开始,到WordCount案例来理解Spark中的各种术语。 2.Spark的运行机制首先拿官网的一张图,来说明,其是分布式集群上spark应用程序的一般执行框架。主要由sparkcontext(spark上下文)、cluster manager(资源管理器)和▪executor(单个节点的执行进程)。其中cluster manager负责整个集群的统一资源管理。executor是应用执行的主要进程,内部含有多个task线程以及内存空间。
3.理解Spark中的各个名词术语从运行机制上,我们来继续解释下面的名词术语, 3.1 Driver programdriver就是我们编写的spark应用程序,用来创建sparkcontext或者sparksession,driver会和cluster mananer通信,并分配task到executor上执行 3.2 Cluster Manager负责整个程序的资源调度,目前的主要调度器有: YARN Spark Standalone Mesos 3.3 ExecutorsExecutors其实是一个独立的JVM进程,在每个工作节点上会起一个,主要用来执行task,一个executor内,可以同时并行的执行多个task。 3.4 JobJob是用户程序一个完整的处理流程,是逻辑的叫法。 3.5 Stage一个Job可以包含多个Stage,Stage之间是串行的,State的触发是由一些shuffle,reduceBy,save动作产生的 3.6 Task一个Stage可以包含多个task,比如sc.textFile("/xxxx").map().filter(),其中map和filter就分别是一个task。每个task的输出就是下一个task的输出。 3.7 Partitionpartition是spark里面数据源的一部分,一个完整的数据源会被spark切分成多个partition以方便spark可以发送到多个executor上去并行执行任务。 3.8 RDDRDD是分布式弹性数据集,在spark里面一个数据源就可以看成是一个大的RDD,RDD由多个partition组成,spark加载的数据就会被存在RDD里面,当然在RDD内部其实是切成多个partition了。 那么问题来了一个spark job是如何执行的? (1)我们写好的spark程序,也称驱动程序,会向Cluster Manager提交一个job (2)Cluster Manager会检查数据本地行并寻找一个最合适的节点来调度任务 (3)job会被拆分成不同stage,每个stage又会被拆分成多个task (4)驱动程序发送task到executor上执行任务 (5)驱动程序会跟踪每个task的执行情况,并更新到master node节点上,这一点我们可以在spark master UI上进行查看 (6)job完成,所有节点的数据会被最终再次聚合到master节点上,包含了平均耗时,最大耗时,中位数等等指标。 3.9 部署模式和运行模式部署模式 就是说的,Cluster Manager,一般有Standalone, Yarn ,而运行模式说的是Drvier的运行机器,是集群还是提交任务的机器,分别对应Cluster和Client模式,区别在于运行结果,日志,稳定性等。 4. 从WordCount案例来理解各个术语再次理解相关概念
下面是一段WordCount程序
Yarn模式在生产环境用的较多,因此从Yarn的部署模式来看,代码上只有一个action操作collect,所以只有一个Job, Job又由于Shuffle的原因被划分为3个stage, 分别是flatMap 和 map 和 reduceBykey 算一个Stage0, 另外的line2又算一个,Stage1, 而Stage3 是前面两个结果join,然后collect, 且stage3依赖于 stage1 和 stage0, 但stage0 和 stage1 是并行的,在实际的生产环境下,要去看依赖stage的依赖图,可以明显看到依赖的关系。 吴邪,小三爷,混迹于后台,大数据,人工智能领域的小菜鸟。 |
|