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 程序,並完全在本機執行此程式。
接著:
- 建立
SparkSession執行個體時,此程式(驅動程式)會與主節點建立 TCP 連線,並傳送以下訊息:"嗨,主節點。我需要幾個執行器程序;請為我配置執行器,等它們準備好後,透過 TCP 與我通訊;這是我的 IP 位址和監聽 TCP 連接埠。" - 此驅動程式接著會阻塞,並在其整個生命週期中監聽來自執行器的傳入連線。
- 對驅動程式而言,主節點(又稱叢集管理器)的具體實作並不重要,只要主節點理解該通訊協定,且未來有執行器建立 TCP 連線即可。
雜項 #
- 每個
SparkContext執行個體都稱為一個 Spark 應用程式。同一個驅動程式中可以有多個彼此完全獨立的SparkContext。 - 在同一個 Spark 應用程式中,可以並行執行多個 Spark 動作(即工作)。
SparkContext是(應當是)單例,且在一個 Spark 應用程式中只能建立一次。- 另一方面,
SparkSession可以在一個應用程式中建立多次。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)