上一篇說(shuō)到Spark的yarn client運(yùn)行模式,它與yarn cluster模式的主要區(qū)別就是前者Driver是運(yùn)行在客戶端,后者Driver是運(yùn)行在yarn集群中。yarn client模式一般用在交互式場(chǎng)景中,比如spark shell, spark sql等程序,但是該模式下運(yùn)行在客戶端的Driver與Yarn集群有大量的網(wǎng)絡(luò)交互,如果客戶端與集群之間的網(wǎng)絡(luò)不是很好,可能會(huì)導(dǎo)致性能問(wèn)題。因此一般在生產(chǎn)環(huán)境中,大部分還是采用yarn cluster模式運(yùn)行spark程序。
下面具體還是用計(jì)算PI的程序來(lái)說(shuō)明,examples中該程序有三個(gè)版本,分別采用Scala、Python和Java語(yǔ)言編寫(xiě)。本次用Python程序pi.py做說(shuō)明。
1 from __future__ import print_function 2 3 import sys 4 from random import random 5 from operator import add 6 7 from pyspark.sql import SparkSession 8 9 10 if __name__ == "__main__":11 """12 Usage: pi [partitions]13 """14 spark = SparkSession15 .builder16 .appName("PythonPi")17 .getOrCreate()18 19 partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 220 n = 100000 * partitions21 22 def f(_):23 x = random() * 2 - 124 y = random() * 2 - 125 return 1 if x ** 2 + y ** 2 <= 1 else 026 27 count = spark.sparkContext.parallelize(range(1, n + 1), partitions).map(f).reduce(add)28 print("Pi is roughly %f" % (4.0 * count / n))29 30 spark.stop()
程序邏輯與上一篇Scala程序一樣,就不再多做說(shuō)明了。
下面來(lái)以yarn cluster方式來(lái)執(zhí)行這個(gè)程序,注意執(zhí)行程序前先要啟動(dòng)hdfs和yarn,最好同時(shí)啟動(dòng)spark的history server,這樣即使在程序運(yùn)行完以后也可以從Web UI中查看到程序運(yùn)行情況。
輸入以下命令:
[root@BruceCentOS4 ~]# $SPARK_HOME/bin/spark-submit --master yarn --deploy-mode cluster $SPARK_HOME/examples/src/main/python/pi.py
以下是程序運(yùn)行輸出信息部分截圖,
開(kāi)始部分:
中間部分:
結(jié)束部分:
由于程序是以yarn cluster方式運(yùn)行的,因此Driver是運(yùn)行在Yarn集群當(dāng)中(在BruceCentOS3上的ApplicationMaster進(jìn)程當(dāng)中),同時(shí)在BruceCentOS和BruceCentOS2上各運(yùn)行了1個(gè)Executor進(jìn)程(進(jìn)程名字:CoarseGrainedExecutorBackend),而B(niǎo)ruceCentOS4上的SparkSubmit進(jìn)程僅僅作為yarn client向yarn集群提交spark程序。作為對(duì)比,在yarn client模式當(dāng)中,客戶端SparkSubmit進(jìn)程不僅作為yarn client提交程序,而且同時(shí)還會(huì)運(yùn)行Driver,并啟動(dòng)SparkContext,并且向Executor分配和管理Task,最后收集運(yùn)行結(jié)果,因此yarn client模式程序輸出信息會(huì)顯示最終的打印結(jié)果。然而在yarn cluster模式當(dāng)中,由于Driver運(yùn)行在yarn集群的ApplicationMaster中,因此最終結(jié)果需要到ApplicationMaster進(jìn)程的日志中取查看。可以通過(guò)如下命令查看。
SparkUI上的Executor信息:
BruceCentOS4上的客戶端進(jìn)程:
BruceCentOS3上的ApplicationMaster進(jìn)程(包含Spark Driver):
BruceCentOS上的Executor:
BruceCentOS2上的Executor:
下面具體描述下Spark程序在yarn cluster模式下運(yùn)行的具體流程。
這里是一個(gè)流程圖:
以上就是個(gè)人對(duì)Spark運(yùn)行模式(yarn cluster)的一點(diǎn)理解,其中參考了“求知若渴 虛心若愚”博主的“Spark(一): 基本架構(gòu)及原理”的部分內(nèi)容(其中基于Spark2.3.0對(duì)某些細(xì)節(jié)進(jìn)行了修正),在此表示感謝。
聯(lián)系客服