2017/1/10 8:27
Spark架構原理
**概念詞彙:**Application,Application Jar,Driver program(驅動程序)、Cluster Manager(管理集羣資源的外部服務)、Deploy mode(決定在何處運行Driver進程的部署模式:cluster和client)、worker node、Executor、Task、job、stage(階段)、RDD、Operation(transformation和action)、partition、DAG、Narrow dependency、Wide dependency、CaChing Management
Standalone集羣模式
1.Driver進程:
2.Master進程:負責資源的調度和分配、集羣的監控。
3.worker進程:主要職責
- 存儲RDD的partition
- 啓動其他的進程和線程,對RDD進行並行計算處理
4.Excutor:啓動線程來執行task
5.task線程:對RDD的partition數據執行指定的算子操作
client提交應用,master找到worker啓動Driver,Driver向master申請資源,之後將其轉化爲RDDGraph
再由DAGscheduler將其轉化爲statge的有向無環圖交給taskScheduler,
TaskScheduler將任務交給executor執行。
架構原理簡述
- Client上提交應用請求給master
- MAster在接受請求後開始進行資源調度(集羣資源分配算法),調用worker資源。【Executor的分配】
- worker在接收到master的請求後,會爲spark應用啓動Executor。
- Executor啓動後,會向Driver進行反註冊,這樣Driver就可以知道那些Excutor在爲他繼續服務了。
- Driver在註冊一些Executor後,就可以開始執行應用了,首先初始化RDD,告知Master,並進行註冊,啓動程序。
- HDFS的文件被讀取到多個worker節點上,形成分佈式數據集,也就是初始RDD(讀數據的過程)。
- Driver根據我們對RDD的操作,提交一堆task到Executor上。Executor接收到task後,啓動多個線程來執行task。
- task會對RDD的partition數據進行指定的算子操作,形成新的RDD的partition。
YARN模式
運行原理:
(yarn-cluster提交模式)
- spark-submit提交,將請求發送到ResourceManager,請求啓動ApplicationMaster。
- RM對資源進行調度分配,分配container在某些nodeManager上,啓動ApplicationMaster
- ApplicationMaster(相當於Driver)會找RM,請求container啓動Executor。
- RM分配一批container用於啓動Executor,AM鏈接相應的NM來啓動Executor,(NodeManager相當於之前的Worker)。
- Executor在啓動後,向AM反向註冊,告訴AM哪些節點參與了工作。
- 讀數據、計算、產生結果
(yarn-client模式)
- Driver進程是在本地啓動的。用戶提交請求給ResourcesManager(RM),請求啓動ApplicationMaster(AM)。
- RM進行集羣資源分配,分配container在某個NodeMannager上,(AM在這裏起ExecutorLauncher的作用)
- AM申請Container。啓動Executor。
- RM分配給一批container,然後AM鏈接其他NM,用container的資源啓動Executor
- Executor反省註冊到本地的Driver上。
- 初始化RDD,讀取數據,執行Task,產生結果。
比較:yarn-cluster\yarn-client:
- yarn-client用於測試,因爲Driver運行在本地客戶端。會和yarn集羣進行通訊,會產生大量流量,直接運行的時候,本地可以看到所有log
- yarn-cluster用於生產環境,Driver運行在nodemanager。產生的日誌會分散到各個節點上,不方便查看。
分組和二次排序
排序:(初級版)
import org.apache.spark.{SparkConf, SparkContext}
/**
* Created by yxy on 1/9/17.
*/
object sortDemo {
def main(args: Array[String]): Unit = {
sortedDemo
}
def sortedDemo: Unit ={
val conf=new SparkConf().setAppName("sortDemo").setMaster("local")
val sc=new SparkContext(conf)
val infoRDD=sc.textFile("hdfs://hadoop01:9000/data/student.txt")
val result=infoRDD.map(_.split(" "))
.filter(m=>m.length==2 && m(0)!="" && m(1)!=" ") //記得判斷分割後的數據是否滿足格式哦!
.map(m=>{
val classinfo=m(0).trim
val score=m(1).trim.toInt
(classinfo,score)
})
.groupByKey()
.map(m=>{
val classname=m._1
val scores=m._2.toArray.sortWith(_>_).take(3)
(classname,scores)
})
.foreach(m=>{
println(m._1+" : ")
for (elem <- m._2) {
println("score :"+elem)
}
})
}
}
(待續)