Apache Spark

最後更新: 2026-07-14 00:19:21 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

Spark 應用程式只是一種 YARN 應用程式。

Apache Spark 以 Scala 撰寫,只要類別路徑中提供相容的 Scala 執行階段 JAR,就能在任何 JVM 上執行。

工作節點需要 HDFS 用戶端和 YARN 用戶端才能運作,並在 HDFS 上讀寫作業的輸入與輸出檔案。

概觀 #

使用者撰寫 JVM 位元組碼程式(使用 Java 或 Scala),稱為驅動程式,並將其封裝成 foo.jar JAR 檔案。 此 JAR 檔案可以包含所有相依性(即 uber JAR),也可以不包含相依性,並預期由工作節點環境提供這些相依性。

驅動程式如下所示:

java
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;

public class SimpleApp {
  public static void main(String[] args) {
    SparkSession spark = SparkSession.builder().appName("Simple Application").getOrCreate();
    Dataset<String> logData = spark.read().textFile("SOME_DIR/SOME_FILE.md").cache();

    long numAs = logData.filter(s -> s.contains("a")).count();
    long numBs = logData.filter(s -> s.contains("b")).count();

    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);

    spark.stop();
  }
}

接著,使用者應透過以下命令執行此程式:

sh
./bin/spark-submit \
  --master 'spark://master-server-addr:port' \
  --class org.full.package.SimpleApp \
  foo.jar

此命令會立即啟動本機 JVM 程序,並完全在本機執行此程式。

接著:

  1. 建立 SparkSession 執行個體時,此程式(驅動程式)會與主節點建立 TCP 連線,並傳送以下訊息:"嗨,主節點。我需要幾個執行器程序;請為我配置執行器,等它們準備好後,透過 TCP 與我通訊;這是我的 IP 位址和監聽 TCP 連接埠。"
  2. 此驅動程式接著會阻塞,並在其整個生命週期中監聽來自執行器的傳入連線。
  • 對驅動程式而言,主節點(又稱叢集管理器)的具體實作並不重要,只要主節點理解該通訊協定,且未來有執行器建立 TCP 連線即可。

雜項 #

  1. 每個 SparkContext 執行個體都稱為一個 Spark 應用程式。同一個驅動程式中可以有多個彼此完全獨立的 SparkContext。
  2. 在同一個 Spark 應用程式中,可以並行執行多個 Spark 動作(即工作)。
  • SparkContext 是(應當是)單例,且在一個 Spark 應用程式中只能建立一次。
  • 另一方面,SparkSession 可以在一個應用程式中建立多次。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)