2015-06-16 58 views

回答

1

我認爲spark工作是FIFO(先進先出)。

1

Spark的調度程序以FIFO方式運行作業。

也可以在作業之間配置公平共享。

要啓用公平調度,配置SparkContext時只需將spark.scheduler.mode屬性FAIR:

> val conf = new SparkConf().setMaster(...).setAppName(...) 
> conf.set("spark.scheduler.mode", "FAIR") val sc = new 
> SparkContext(conf) 

有關詳細信息,請查看https://spark.apache.org/docs/1.2.0/job-scheduling.html

1

取決於你在呼喚什麼樣的工作 - 如果你正在談論獨立提交,這實際上並不是由spark而是由主機環境來處理(mesos或Hadoop YARN)

單個spark-context中的不同作業會,b除非將其配置爲使用FAIR調度程序,否則使用FIFO

4

在高級別,在RDD上調用任何操作時,Spark會創建DAG並提交給DAG調度程序。

  • DAG調度程序將操作員劃分爲多個任務階段。一個階段由基於輸入數據分區的任務組成。 DAG調度程序一起管理運營商。對於例如許多地圖運營商可以安排在單一階段。 DAG調度程序的最終結果是一系列階段。

  • 階段傳遞到任務計劃程序。任務計劃程序通過集羣管理器啓動任務(Spark Standalone/Yarn/Mesos)。任務調度程序不知道階段的依賴關係。

  • 工作人員執行從站上的任務。

看看this answer瞭解更多信息

+0

假設我在客戶端模式下運行Spark Client程序,在獨立模式下運行Spark Cluster。誰創建了一個DAG? Spark客戶創建DAG還是Spark Master創建DAG? Spark客戶端程序是否指導工作人員進行哪些轉換? – user1870400

0

好問題。這些術語在不同的地方以不同的方式使用,並且可能具有挑戰性。 Spark最令人困惑的事情是,應用程序的一次運行可以產生多個作業,每個作業都被分解爲多個任務!例如,如果應用程序是多線程的,則每個線程都可以生成一個Spark作業。但是,在正常情況下,應用程序與工作是一對一的。應用程序的一次運行會生成一份作業。

現在,Spark是以一種靈活的方式製作的,所以它將調度片斷開並使其可插拔。可以插入許多不同的調度程序。最受歡迎的3個是來自Hadoop,Mesos和Spark自帶的調度程序的YARN。所以,調度有各種各樣的行爲。

下一個令人困惑的事情是,作業和任務都安排好了。工作被分配資源。這可以靜態完成,因此,例如將一組服務器分配給一個作業,然後該作業是唯一可以使用這些服務器的作業。或者,資源可以在作業中共享。一旦分配了資源,作業就會指向一個任務調度程序。然後作業生成任務並將其提供給任務調度程序,該任務調度程序將任務分配給特定資源。爲作業分配資源的同一實體還提供任務調度程序(IE,YARN,Mesos或Spark內置)。因此,任務調度程序的工作方式也存在差異。

通常情況下,調度程序試圖跟蹤數據的位置,然後將任務分配到數據已駐留的位置,或者有足夠的可用網絡容量來移動數據。

複雜的因素是任務之間有依賴關係。執行這些依賴關係實際上是計劃過程的一部分,但Spark術語在這一點上會變得混亂。在Spark中,只有處理器的最終任務分配被稱爲「調度」。

0

我給你舉個例子,

  • 假如你有一個做如下操作的應用,

    1. 閱讀來自HDFS數據
    2. 上COLUMN_1
    3. 過濾運算
    4. 過濾器op on column_2
    5. column_3上的過濾器操作
    6. 寫RDD到HDFS
  • 斯巴克的DAGScheduler分析應用程序動作的過程中,設計最好的辦法來實現任務
  • 我的意思是,它的而不是每個過濾器的不同的階段操作,它會將所有三個過濾器視爲一個階段。因此,不需要三次過濾數據集,它只會掃描一次。這當然是最佳的做法。

希望這會有所幫助。