SparkCore學習筆記(一)

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執行。

架構原理簡述

  1. Client上提交應用請求給master
  2. MAster在接受請求後開始進行資源調度(集羣資源分配算法),調用worker資源。【Executor的分配】
  3. worker在接收到master的請求後,會爲spark應用啓動Executor。
  4. Executor啓動後,會向Driver進行反註冊,這樣Driver就可以知道那些Excutor在爲他繼續服務了。
  5. Driver在註冊一些Executor後,就可以開始執行應用了,首先初始化RDD,告知Master,並進行註冊,啓動程序。
  6. HDFS的文件被讀取到多個worker節點上,形成分佈式數據集,也就是初始RDD(讀數據的過程)。
  7. Driver根據我們對RDD的操作,提交一堆task到Executor上。Executor接收到task後,啓動多個線程來執行task。
  8. task會對RDD的partition數據進行指定的算子操作,形成新的RDD的partition。

YARN模式

運行原理:

(yarn-cluster提交模式)

  1. spark-submit提交,將請求發送到ResourceManager,請求啓動ApplicationMaster。
  2. RM對資源進行調度分配,分配container在某些nodeManager上,啓動ApplicationMaster
  3. ApplicationMaster(相當於Driver)會找RM,請求container啓動Executor。
  4. RM分配一批container用於啓動Executor,AM鏈接相應的NM來啓動Executor,(NodeManager相當於之前的Worker)。
  5. Executor在啓動後,向AM反向註冊,告訴AM哪些節點參與了工作。
  6. 讀數據、計算、產生結果

(yarn-client模式)

  1. Driver進程是在本地啓動的。用戶提交請求給ResourcesManager(RM),請求啓動ApplicationMaster(AM)。
  2. RM進行集羣資源分配,分配container在某個NodeMannager上,(AM在這裏起ExecutorLauncher的作用)
  3. AM申請Container。啓動Executor。
  4. RM分配給一批container,然後AM鏈接其他NM,用container的資源啓動Executor
  5. Executor反省註冊到本地的Driver上。
  6. 初始化RDD,讀取數據,執行Task,產生結果。

比較:yarn-cluster\yarn-client:

  1. yarn-client用於測試,因爲Driver運行在本地客戶端。會和yarn集羣進行通訊,會產生大量流量,直接運行的時候,本地可以看到所有log
  2. 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)
    }
  })
  }
}

(待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章