|
前兩篇介紹了Spark的yarn client和yarn cluster模式,本篇繼續(xù)介紹Spark的STANDALONE模式和Local模式。 下面具體還是用計(jì)算PI的程序來(lái)說(shuō)明,examples中該程序有三個(gè)版本,分別采用Scala、Python和Java語(yǔ)言編寫(xiě)。本次用Java程序JavaSparkPi做說(shuō)明。 1 package org.apache.spark.examples; 2 3 import org.apache.spark.api.java.JavaRDD; 4 import org.apache.spark.api.java.JavaSparkContext; 5 import org.apache.spark.sql.SparkSession; 6 7 import java.util.ArrayList; 8 import java.util.List; 9 10 /** 11 * Computes an approximation to pi 12 * Usage: JavaSparkPi [partitions] 13 */ 14 public final class JavaSparkPi { 15 16 public static void main(String[] args) throws Exception { 17 SparkSession spark = SparkSession 18 .builder() 19 .appName("JavaSparkPi") 20 .getOrCreate(); 21 22 JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext()); 23 24 int slices = (args.length == 1) ? Integer.parseInt(args[0]) : 2; 25 int n = 100000 * slices; 26 List<Integer> l = new ArrayList<>(n); 27 for (int i = 0; i < n; i++) { 28 l.add(i); 29 } 30 31 JavaRDD<Integer> dataSet = jsc.parallelize(l, slices); 32 33 int count = dataSet.map(integer -> { 34 double x = Math.random() * 2 - 1; 35 double y = Math.random() * 2 - 1; 36 return (x * x + y * y <= 1) ? 1 : 0; 37 }).reduce((integer, integer2) -> integer + integer2); 38 39 System.out.println("Pi is roughly " + 4.0 * count / n); 40 41 spark.stop(); 42 } 43 } 程序邏輯與之前的Scala和Python程序一樣,就不再多做說(shuō)明了。對(duì)比Scala、Python和Java程序,同樣計(jì)算PI的邏輯,程序分別是26行、30行和43行,可以看出編寫(xiě)Spark程序,使用Scala或者Python比Java來(lái)得更加簡(jiǎn)潔,因此推薦使用Scala或者Python編寫(xiě)Spark程序。 下面來(lái)以STANDALONE方式來(lái)執(zhí)行這個(gè)程序,執(zhí)行前需要啟動(dòng)Spark自帶的集群服務(wù)(在master上執(zhí)行$SPARK_HOME/sbin/start-all.sh),最好同時(shí)啟動(dòng)spark的history server,這樣即使在程序運(yùn)行完以后也可以從Web UI中查看到程序運(yùn)行情況。啟動(dòng)Spark的集群服務(wù)后,會(huì)在master主機(jī)和slave主機(jī)上分別出現(xiàn)Master守護(hù)進(jìn)程和Worker守護(hù)進(jìn)程。而在Yarn模式下,就不需要啟動(dòng)Spark的集群服務(wù),只需要在客戶端部署Spark即可,而STANDALONE模式需要在集群每臺(tái)機(jī)器都部署Spark。 輸入以下命令: [root@BruceCentOS4 jars]# $SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.JavaSparkPi --master spark://BruceCentOS.Hadoop:7077 $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.0.jar 以下是程序運(yùn)行輸出信息部分截圖, 開(kāi)始部分:
中間部分:
結(jié)束部分:
從上面的程序輸出信息科看出,Spark Driver是運(yùn)行在客戶端BruceCentOS4上的SparkSubmit進(jìn)程當(dāng)中的,集群是Spark自帶的集群。 SparkUI上的Executor信息:
BruceCentOS4上的客戶端進(jìn)程(包含Spark Driver):
BruceCentOS3上的Executor進(jìn)程:
BruceCentOS上的Executor進(jìn)程:
BruceCentOS2上的Executor進(jìn)程:
下面具體描述下Spark程序在standalone模式下運(yùn)行的具體流程。 這里是一個(gè)流程圖:
最后來(lái)看Local運(yùn)行模式,該模式就是在單機(jī)本地環(huán)境執(zhí)行,主要用于程序測(cè)試。程序的所有部分,包括Client、Driver和Executor全部運(yùn)行在客戶端的SparkSubmit進(jìn)程當(dāng)中。Local模式有三種啟動(dòng)方式。 #啟動(dòng)1個(gè)Executor運(yùn)行任務(wù)(1個(gè)線程) [root@BruceCentOS4 ~]#$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.JavaSparkPi --master local $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.0.jar #啟動(dòng)N個(gè)Executor運(yùn)行任務(wù)(N個(gè)線程),這里N=2 [root@BruceCentOS4 ~]#$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.JavaSparkPi --master local[2] $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.0.jar #啟動(dòng)*個(gè)Executor運(yùn)行任務(wù)(*個(gè)線程),這里*指代本地機(jī)器上的CPU核的個(gè)數(shù)。 [root@BruceCentOS4 ~]#$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.JavaSparkPi --master local[*] $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.0.jar
以上就是個(gè)人對(duì)Spark運(yùn)行模式(STANDALONE和Local)的一點(diǎn)理解,其中參考了“求知若渴 虛心若愚”博主的“Spark(一): 基本架構(gòu)及原理”的部分內(nèi)容(其中基于Spark2.3.0對(duì)某些細(xì)節(jié)進(jìn)行了修正),在此表示感謝。
|
|
|
來(lái)自: 路人甲Java > 《待分類(lèi)》