spark架構、部署形式和運行機理(獨立集羣、YARN集羣)

spark 生態架構

http://dblab.xmu.edu.cn/blog/spark/

Spark最初由美國加州伯克利大學(UCBerkeley)的AMP(Algorithms, Machines and People)實驗室於2009年開發, 分佈式大數據並行計算框架。

BDAS

在實際應用中,大數據處理主要包括以下三個類型:
 複雜的批量數據處理:時間跨度通常在數十分鐘到數小時之間;
 基於歷史數據的交互式查詢:時間跨度通常在數十秒到數分鐘之間;
 基於實時數據流的數據處理:時間跨度通常在數百毫秒到數秒之間。

伯克利數據分析軟件棧BDAS(Berkeley Data Analytics Stack), “一個軟件棧滿足不同應用場景”的理念, 同時支持批處理、交互式查詢和流數據處理。

  •  Spark Core:Spark Core包含Spark的基本功能,如內存計算、任務調度、部署模式、故障恢復、存儲管理等。Spark建立在統一的抽象RDD之上,使其可以以基本一致的方式應對不同的大數據處理場景;通常所說的Apache Spark,就是指Spark Core;
  •  Spark SQL:Spark SQL允許開發人員直接處理RDD,同時也可查詢Hive、HBase等外部數據源。Spark SQL的一個重要特點是其能夠統一處理關係表和RDD,使得開發人員可以輕鬆地使用SQL命令進行查詢,並進行更復雜的數據分析;
  •  Spark Streaming:Spark Streaming支持高吞吐量、可容錯處理的實時流數據處理,其核心思路是將流式計算分解成一系列短小的批處理作業。Spark Streaming支持多種數據輸入源,如Kafka、Flume和TCP套接字等;
  •  MLlib(機器學習):MLlib提供了常用機器學習算法的實現,包括聚類、分類、迴歸、協同過濾等,降低了機器學習的門檻,開發人員只要具備一定的理論知識就能進行機器學習的工作;
  •  GraphX(圖計算):GraphX是Spark中用於圖計算的API,可認爲是Pregel在Spark上的重寫及優化,Graphx性能良好,擁有豐富的功能和運算符,能在海量數據上自如地運行復雜的圖算法。

Spark具有如下幾個主要特點:
 運行速度快:Spark使用先進的DAG(Directed Acyclic Graph,有向無環圖)執行引擎,以支持循環數據流與內存計算,基於內存的執行速度可比Hadoop MapReduce快上百倍,基於磁盤的執行速度也能快十倍;
 容易使用:scala 語言實現.Spark支持使用Scala、Java、Python和R語言進行編程,簡潔的API設計有助於用戶輕鬆構建並行程序,並且可以通過Spark Shell進行交互式編程;
 通用性:Spark提供了完整而強大的技術棧,包括SQL查詢、流式計算、機器學習和圖算法組件,這些組件可以無縫整合在同一個應用中,足以應對複雜的計算;
 運行模式多樣:Spark可運行於獨立的集羣模式中,或者運行於Hadoop中,也可運行於Amazon EC2等雲環境中,並且可以訪問HDFS、Cassandra、HBase、Hive等多種數據源。

spark 部署形式

單機、Standalone獨立集羣、Yarn集羣、Mesos集羣和kubernets集羣。主要介紹 Standalone獨立集羣、Yarn集羣。

  • 集羣架構
    Cluster Mode Overview

    • Application:User program built on Spark. Consists of a driver program and executors on the cluster.
    • Driver:
      • Application的main函數並創建SparkContext,準備Spark應用程序的運行環境.
      • 在Spark中有SparkContext負責與ClusterManager通信,進行資源申請、任務的分配和監控等,當Executor部分運行完畢後,Driver同時負責將SparkContext關閉,通常用SparkContext代表Driver。
    • Executor: 執行器,是爲某個Application運行在worker node上的一個進程, 運行任務、數據的內存和磁盤存儲。
    • cluster managers:
      • 三種:standalone cluster manager, Mesos or YARN
      • 在standalone模式中即爲Master主節點,控制整個集羣,監控worker。在YARN模式中爲資源管理器ResourcesManager
  • 幾點注意:

    • 不同的應用Application相互獨立隔離,每個Executor跑在不同JVMs, 一個sparkcontext對應一個應用。
    • Driver既可以運行在Master節點上中,也可以運行在本地Client端。
      • 當用spark-shell交互式工具提交Spark的Job時,Driver在Master節點上運行;
      • 當使用spark-submit工具提交Job或者在Eclips、IDEA等開發平臺上使用”new SparkConf.setManager(“spark://master:7077”)”方式運行Spark任務時,Driver是運行在本地Client端上的

Spark Standalone獨立集羣

http://spark.apache.org/docs/latest/cluster-overview.html
http://spark.apache.org/docs/latest/spark-standalone.html

  • 官網下載

  • 部署啓動

    • 配置:{$SPARK_HOME}/conf/spark-env.sh, Options for the daemons used in the standalone deploy mode
      SPARK_MASTER_HOST, to bind the master to a different IP address or hostname
      SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
      SPARK_MASTER_OPTS, to set config properties only for the master (e.g. “-Dx=y”)
      SPARK_WORKER_CORES, to set the number of cores to use on this machine
      SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
      SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
      SPARK_WORKER_DIR, to set the working directory of worker processes
      SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. “-Dx=y”)
      SPARK_DAEMON_MEMORY, to allocate to the master, worker and history server themselves (default: 1g).
      SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. “-Dx=y”)
      SPARK_SHUFFLE_OPTS, to set config properties only for the external shuffle service (e.g. “-Dx=y”)
      SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. “-Dx=y”)
      SPARK_DAEMON_CLASSPATH, to set the classpath for all daemons
      SPARK_PUBLIC_DNS, to set the public dns name of the master or workers
    • 啓動:
      {$SPARK_HOME}/sbin:
      sbin/start-master.sh - Starts a master instance on the machine the script is executed on.
      sbin/start-slaves.sh - Starts a slave instance on each machine specified in the conf/slaves file.
      sbin/start-slave.sh - Starts a slave instance on the machine the script is executed on.
      sbin/start-all.sh - Starts both a master and a number of slaves as described above.
      sbin/stop-master.sh - Stops the master that was started via the sbin/start-master.sh script.
      sbin/stop-slaves.sh - Stops all slave instances on the machines specified in the conf/slaves file.
      sbin/stop-all.sh - Stops both the master and the slaves as described above.
  • 應用Jar包提交運行

    • $ {$SPARK_HOME}/bin/spark-submit --class path.to.your.Class --master spark://SPARK_MASTER_IP:PORT[options] [app options]
  • 基本運行流程

    運行流程

    1. SparkContext連接到Master,向Master註冊並申請資源(CPU Core 和Memory)
    2. Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啓動StandaloneExecutorBackend;
    3. StandaloneExecutorBackend向SparkContext註冊;
    4. SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部數據和shuffle之前產生),然後以Stage(或者稱爲TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;
    5. StandaloneExecutorBackend會建立Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成;
    6. 所有Task完成後,SparkContext向Master註銷,釋放資源

Spark on YARN 集羣

  • 安裝(需要準備YARN Hadoop 集羣)

  • 配置: {$SPARK_HOME}/conf/spark-env.sh, Options read in YARN client/cluster mode

    • SPARK_CONF_DIR, Alternate conf dir. (Default: ${SPARK_HOME}/conf)
    • HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
    • YARN_CONF_DIR, to point Spark towards YARN configuration files when you use YARN
    • SPARK_EXECUTOR_CORES, Number of cores for the executors (Default: 1).
    • SPARK_EXECUTOR_MEMORY, Memory per Executor (e.g. 1000M, 2G) (Default: 1G)
    • SPARK_DRIVER_MEMORY, Memory for Driver (e.g. 1000M, 2G) (Default: 1G)
  • 應用Jar包提交運行

    • $ {$SPARK_HOME}/bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] [app options]
    • 示例:
    • $ ./bin/spark-submit --class org.apache.spark.examples.SparkPi
      –master yarn
      –deploy-mode cluster | client
      –driver-memory 4g
      –executor-memory 2g
      –executor-cores 1
      –queue thequeue
      examples/jars/spark-examples*.jar
      10
  • Yarn-client 運行過程:
    Yarn-Client模式中,Driver在客戶端本地運行,這種模式可以使得Spark Application和客戶端進行交互,因爲Driver在客戶端,所以可以通過webUI訪問Driver的狀態,默認是http://hadoop1:4040訪問,而YARN通過http:// hadoop1:8088訪問
    spark yarn cluster

  1. Spark Yarn Client向YARN的ResourceManager申請啓動Application Master。同時在SparkContent初始化中將創建DAGScheduler和TASKScheduler等,由於我們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
  2. ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不運行SparkContext,只與SparkContext進行聯繫進行資源的分派
  3. Client中的SparkContext初始化完畢後,與ApplicationMaster建立通訊,向ResourceManager註冊,根據任務信息向ResourceManager申請資源(Container)
  4. 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向Client中的SparkContext註冊並申請Task
  5. client中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向Driver彙報運行的狀態和進度,以讓Client隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務
  6. 應用程序運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉自己
  • Yarn-cluster 運行流程:
    在YARN-Cluster模式中,當用戶向YARN中提交一個應用程序後,YARN將分兩個階段運行該應用程序:
    1. 第一個階段是把Spark的Driver作爲一個ApplicationMaster在YARN集羣中先啓動;
    2. 第二個階段是由ApplicationMaster創建應用程序,然後爲它向ResourceManager申請資源,並啓動Executor來運行Task,同時監控它的整個運行過程,直到運行完成

Yarn-cluster

1. Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啓動ApplicationMaster的命令、需要在Executor中運行的程序等
2. ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化
3. ApplicationMaster向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將採用輪詢的方式通過RPC協議爲各個任務申請資源,並監控它們的運行狀態直到運行結束
4. 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式一樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等
5. ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務
6. 應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉自己
  • Spark Client 和 Spark Cluster的區別:
    • 理解YARN-Client和YARN-Cluster深層次的區別之前先清楚一個概念:Application Master。在YARN中,每個Application實例都有一個ApplicationMaster進程,它是Application啓動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源之後告訴NodeManager爲其啓動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別
    • YARN-Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的運行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上運行,因而YARN-Cluster模式不適合運行交互類型的作業.
    • YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通信來調度他們工作,也就是說Client不能離開

運行提交

spark-shell Test

  • spark-shell --master local[*], local模式,local[N] to run locally with N threads。

  • spark-shell --master spark://host:7077, 可遠程訪問standalone模式的集羣,在本地機4040或遠程spark集羣的8080 webUI 可查看運行狀態。開啓一個spark-shell爲一個名爲 Spark shell 的應用。

在交互式的命令行狀態下,每遇到一個Action算子,則化爲一個實質計算的Job。一個worker節點,可根據DAG需要啓動一個或多個Executor命令行狀態下,每遇到一個Action算子,則化爲一個實質計算的Job。一個worker節點,可根據DAG需要啓動一個或多個Executor, 每個Exector的執行若干個Task,Task 的數量和 Action 操作對應的RDD的分區數量一致. 每個Excutor 有自己的stdout, stderr.

Remot Debug spark program

  • IDEA Remote setting

    • Debugger mode: Attach to remote JVM
    • Transport: Socket
    • HOST/PORT: RemoteIP/Default 5055
    • Command line arguments for remote JVM: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5055
  • Standalone cluster
    spark-submit --class Ex1_SimpleRDD --master spark://host:7077 --driver-java-options “-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5055” /data/jars/learningspark*.jar

  • YARN cluster
    spark-submit --class Ex1_SimpleRDD --master yarn --deploy-mode client --driver-java-options “-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5055” /data/jars/learningspark*.jar
    spark-submit --class Ex1_SimpleRDD --master yarn --deploy-mode cluster --driver-java-options “-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5055” /data/jars/learningspark*.jar

Spark 調優

https://www.cnblogs.com/xjh713/p/7309426.html
https://www.jianshu.com/p/3716ade93b02
https://blog.csdn.net/evankaka/article/details/61934540

spark 參數配置

  • num-executors
    參數說明:該參數用於設置Spark作業總共要用多少個Executor進程來執行。Driver在向YARN集羣管理器申請資源時,YARN集羣管理器會盡可能按照你的設置來在集羣的各個工作節點上,啓動相應數量的Executor進程。這個參數非常之重要,如果不設置的話,默認只會給你啓動少量的Executor進程,此時你的Spark作業的運行速度是非常慢的。
    參數調優建議:每個Spark作業的運行一般設置50~100個左右的Executor進程比較合適,設置太少或太多的Executor進程都不好。設置的太少,無法充分利用集羣資源;設置的太多的話,大部分隊列可能無法給予充分的資源。

注意:新版spark, 設置spark.dynamicAllocation.enabled=true的優先級高於此設置. spark.dynamicAllocation.executorIdleTimeout=60s 當executors空閒達到設定時間後會被移除(緩存了數據的executor不會被移除)。

  • executor-memory
    參數說明:該參數用於設置每個Executor進程的內存。Executor內存的大小,很多時候直接決定了Spark作業的性能,而且跟常見的JVM OOM異常,也有直接的關聯。
    參數調優建議:每個Executor進程的內存設置4G ~ 8G較爲合適。但是這只是一個參考值,具體的設置還是得根據不同部門的資源隊列來定。可以看看自己團隊的資源隊列的最大內存限制是多少,num-executors乘以executor-memory,就代表了你的Spark作業申請到的總內存量(也就是所有Executor進程的內存總和),這個量是不能超過隊列的最大內存量的。此外,如果你是跟團隊裏其他人共享這個資源隊列,那麼申請的總內存量最好不要超過資源隊列最大總內存的1/3~1/2,避免你自己的Spark作業佔用了隊列所有的資源,導致別的同學的作業無法運行。

  • executor-cores
    參數說明:該參數用於設置每個Executor進程的CPU core數量。這個參數決定了每個Executor進程並行執行task線程的能力。因爲每個CPU core同一時間只能執行一個task線程,因此每個Executor進程的CPU core數量越多,越能夠快速地執行完分配給自己的所有task線程。
    參數調優建議:Executor的CPU core數量設置爲2~4個較爲合適。同樣得根據不同部門的資源隊列來定,可以看看自己的資源隊列的最大CPU core限制是多少,再依據設置的Executor數量,來決定每個Executor進程可以分配到幾個CPU core。同樣建議,如果是跟他人共享這個隊列,那麼num-executors * executor-cores不要超過隊列總CPU core的1/3~1/2左右比較合適,也是避免影響其他同學的作業運行。

Spark 內存

https://www.cnblogs.com/gaoxing/p/5041806.html
https://www.cnblogs.com/missie/p/4370135.html
https://www.cnblogs.com/yesecangqiong/p/6274427.html

  • YARN 資源抽象
    • yarn.nodemanager.resource.memory-mb
      • NM 節點上YARN可使用的物理內存總量,默認是8192(MB)
    • yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocation-mb
      • RM 單個任務可申請的最少物理內存量,默認是1024(MB)
      • RM 單個任務可申請的最多物理內存量,默認是8192(MB)
    • mapreduce.map.memory.mb mapreduce.reduce.memory.mb
      • 指定map和reduce task的內存大小,該值應該在RM的最大最小container之間。
      • 一般地,reduce設置爲map的兩倍。
    • mapreduce.map.java.opts mapreduce.reduce.java.opts
      • 這兩個參數是僞需要運行JVM程序(java,scala等)準備,通過這兩個參數可以向JVM中傳遞參數,與內存有關的是-Xmx, -Xms等選項,數值的大小應該要再AM中的map.mb和reduce.mb之間。
  • Spark Driver 和 Executor JVM進程的內存分佈
    • 90% Safe ( 90%*20% Shuffle, 90%*60% Storage(90%*60% *20% Unroll 處理反序列化對象) )

Spark 數據本地化級別

https://blog.csdn.net/weixin_38750084/article/details/83187264

  • PROCESS_LOACL > NODE_LOACL > NO_PREF > RACK_LOACL > ANY
    Spark中任務調度時,TaskScheduler在分發之前需要依據數據的位置來分發,最好將task分發到數據所在的節點上,如果TaskScheduler分發的task在默認3s依然無法執行的話,TaskScheduler會重新發送這個task到相同的Executor中去執行,會重試5次,如果依然無法執行,那麼TaskScheduler會降低一級數據本地化的級別再次發送task。

<完>

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