歡迎轉載,轉載請註明出處,徽滬一郎。java
本文以wordCount爲例,詳細說明spark建立和運行job的過程,重點是在進程及線程的建立。
node
在進行後續操做前,確保下列條件已知足。web
local模式運行很是簡單,只要運行如下命令便可,假設當前目錄是$SPARK_HOMEshell
MASTER=local bin/spark-shell
"MASTER=local"就是代表當前運行在單機模式apache
local cluster模式是一種僞cluster模式,在單機環境下模擬standalone的集羣,啓動順序分別以下瀏覽器
$SPARK_HOME/sbin/start-master.sh
注意運行時的輸出,日誌默認保存在$SPARK_HOME/logs目錄。bash
master主要是運行類 org.apache.spark.deploy.master.Master,在8080端口啓動監聽,日誌以下圖所示jvm
export SPARK_MASTER_IP=localhost
export SPARK_LOCAL_IP=localhost
bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077 -i 127.0.0.1 -c 1 -m 512M
worker啓動完成,鏈接到master。打開maser的web ui能夠看到鏈接上來的worker. Master WEb UI的監聽地址是http://localhost:8080函數
MASTER=spark://localhost:7077 bin/spark-shell
若是一切順利,將看到下面的提示信息。ui
Created spark context..
Spark context available as sc.
能夠用瀏覽器打開localhost:4040來查看以下內容
上述環境準備穩當以後,咱們在sparkshell中運行一下最簡單的例子,在spark-shell中輸入以下代碼
scala>sc.textFile("README.md").filter(_.contains("Spark")).count
上述代碼統計在README.md中含有Spark的行數有多少
Spark佈置環境中組件構成以下圖所示。
Notes: 在集羣(cluster)方式下, Cluster Manager運行在一個jvm進程之中,而worker運行在另外一個jvm進程中。在local cluster中,這些jvm進程都在同一臺機器中,若是是真正的standalone或Mesos及Yarn集羣,worker與master或分佈於不一樣的主機之上。
job生成的簡單流程以下
調用路徑大體以下
代碼片斷executor.lauchTask
def launchTask(context: ExecutorBackend, taskId: Long, serializedTask: ByteBuffer) { val tr = new TaskRunner(context, taskId, serializedTask) runningTasks.put(taskId, tr) threadPool.execute(tr) }
說了這麼一大通,也就是講最終的邏輯處理切切實實是發生在TaskRunner這麼一個executor以內。
運算結果是包裝成爲MapStatus而後經過一系列的內部消息傳遞,反饋到DAGScheduler,這一個消息傳遞路徑不是過於複雜,有興趣能夠自行勾勒。