天天看點

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

在本章其他部分(在 PySpark shell 和應用程式中),我們已經在 Spark 的 Standalone 資料總管中執行過 Spark 應用程式。讓我們嘗試了解這些叢集資料總管互相之間有什麼不同,以及它們該在什麼情況下使用。

在繼續講解叢集資料總管之前,讓我們來了解叢集模式與本地模式的差別。

當跨叢集執行代碼時,了解變量和方法的範圍和生命周期非常重要。讓我們看一個使用 foreach 動作的例子:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

在本地模式下,前面的代碼執行正常,因為計數器(counter)變量和 RDD 在相同的記憶體空間(單個 JVM)裡。

在叢集模式下,計數器 counter 的值永遠不會改變,并且始終保持為 0。在叢集模式下,Spark 會計算出帶有變量和方法的閉包,并将它們發送到執行程序。當執行程序執行這個 foreach 函數時,它指向的是執行程序上的計數器的新副本。執行程序不能通路驅動程序上的計數器。是以,每次執行此操作時,本地計數器都會遞增,但不會傳回到驅動程序。要在叢集模式下解決此問題,需要為每個閉包建立一個單獨的變量副本,或使用一個累加變量。

你可以在四種不同的模式下運作 Spark 應用程式:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

如果指定了 spark.master(或--master)配置屬性,應用程式會在它指定的一個叢集資料總管上運作,運作在用戶端還是叢集模式則取決于指定的 --deploy-mode 參數。

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

預設情況下,以 Standalone模式送出的應用程式會占用叢集的所有 CPU 核心(根據 spark.deploy.defaultCores 屬性),并給每個執行程序配置設定 1G 記憶體。在多個應用程式的環境中,重要的是限制每個應用程式占用的資源上限。限制 CPU 核心占用的方式可以利用 spark-submit 的 --total-executor-cores 參數,或 Spark 配置檔案中的 spark.cores.max 參數。要限制占用的記憶體,可以利用 spark-submit 的 --executor-memory 參數,或 Spark 配置檔案中的 spark.executor.memory 參數。

在本示例中,我們使用一個 20 節點的叢集,每個節點有 4 個 CPU 核心:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

應用程式可以用 --master yarn-client 參數送出,即為用戶端模式;或用 --master yarn-cluster 參數送出,即為叢集模式。在 Yarn 模式下,你可以指定所需的執行程序數與 CPU 核心數,這可以對照 Spark 的 Standalone 主機中的 -total-executor-cores 參數。

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

在本示例中,我們使用了一個 20 節點的叢集,每個節點有 4 個 CPU 核心:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos
《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

動态資源配置設定

動态資源配置設定功能是在 Spark 1.2 中引入的。應用程式可以把不會再用到的資源傳回給叢集,并在以後需要時再次請求它們。動态的資源配置設定可以有效率地控制叢集上的資源使用。如圖3-12 所示,由于存在運作較慢的節點(straggler)、排程、等待、空閑等情況,所有 Spark 應用程式中配置設定和使用的資源都有很大的變化。

要啟用此功能,可以在應用程式中設定以下配置屬性:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos
《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos
《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

用戶端模式和叢集模式

在 YARN 用戶端模式下運作 Spark 時,驅動程序在用戶端計算機上運作,應用管理器和執行程序在叢集上運作。每個 Spark 執行程序會作為用戶端或叢集模式下的一個 YARN 容器運作。

在 YARN 叢集模式下,驅動程序在應用管理器中運作。是以,應用管理器負責運作驅動程序和從 YARN 資料總管請求資源。啟動應用程式的用戶端在應用程式的整個生命周期中并不需要一直介入。

YARN 叢集用于生産作業,而 YARN 用戶端模式用于互動模式,在這種模式下,你可以即時看到應用程式的輸出。

YARN 用戶端模式和叢集模式如圖3-13 所示。

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

Apache Mesos 是一個通用的叢集管理器,它可以在叢集上運作分析任務及長時間運作的服務(例如 Web 應用程式或鍵值存儲)。請參閱以下示例用法:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos
《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

Mesos 中有兩種類型的排程模式:

《Spark與Hadoop大資料分析》——3.6 Spark 資料總管:Standalone、YARN和Mesos

當在 Hadoop 叢集上把 Spark 和其他應用程式配套使用時,最好使用 YARN 來更好地共享資源。在無需擔心改善性能和共享資源的情況下,可以使用 Standalone 管理器。Mesos 和 Yarn 提供了類似的資源共享功能。在 Hadoop 叢集上,使用 YARN 是合适的,因為 Hadoop 的所有其他架構都與 Yarn 內建了。對于非 Hadoop 叢集,使用 Mesos 也是可行的。

繼續閱讀