簡體   English   中英

使用Spark的REST API進行提交時,驅動程序在哪里運行以及如何訪問SparkSession?

[英]Where does driver run and how to access SparkSession when using Spark's REST API for submission?

Spark允許通過REST API( 示例腳本)提交作業。 Spark REST Client Java API可以執行相同的操作,但是使用Java而不是curl。

1)通過SparkSession從我的主應用程序提交的作業:

SparkConf configuration =
            new SparkConf()
                .setAppName(name)
                .setMaster(host)
                .setJars(listOfJars)
                .setAll(allPropertiesSet);
SparkSession session =  SparkSession.builder().config(configuration).getOrCreate();
session.sql(query).collectAsList();

Spark REST API的特定之處在於它不能與SparkSession一起使用。 因此,我需要將MySparkJob到單獨的JAR並部署到每個工作程序。

2)通過REST API從我的主應用程序提交的作業:

SparkRestClient client = SparkRestClient
                .builder()
                .masterHost("cluster.master.host.address")
                .sparkVersion("2.0.1")
                .build();

        final String submissionId = client
                .prepareJobSubmit()
                .appName("MySparkJob!")
                .appResource("file:/home/spark/my-spark-job.jar")
                .mainClass("com.vbakh.jobs.MySparkJob")
                .submit();

MySparkJob代碼( 在哪里執行?與REST API調用在同一台計算機上?在Spark驅動程序上?還是在Spark worker上? ):

public class MySparkJob implements Serializable {

  public static void main(String[] args) {
     // Question 1: How to make Spark SQL Join here if I haven't got SparkSession?
     // Question 2: how to return result of the join to the driver?
  }
}

除非我誤解了您的問題,否則您應該執行SparkSession.builder.getOrCreate等。請參見SparkSession對象API。


無論您使用spark-submit -way還是使用REST API,Spark應用程序中都沒有任何變化。

換句話說,您使用REST API提交的jar應該與spark-submit相同。

如何從MySparkJob的主類訪問SparkSession

起點處引用Spark的正式文檔:SparkSession

SparkSession所有功能的入口點都是SparkSession類。 要創建一個基本的SparkSession ,只需使用SparkSession.builder()

關於另一個問題:

如何將MySparkJob的結果返回給驅動程序?

這個問題讓我有些困惑,因為...驅動程序是您的Spark應用程序( SparkSession (和SparkContext )所在的SparkContext )。 無論您如何提交Spark應用程序,這里都沒有任何變化。

將執行任務的結果發送給驅動程序是Spark的主要部分,無論您使用spark-submit來運行它還是使用REST API都不會改變。


話雖如此,讓我翻閱您的項目,並一一回答。

1)通過SparkSession從我的主應用程序提交的作業:

正確。 SparkSession使用SparkContext會將結構化查詢轉換為相應的基於RDD的管道,該管道將在集群中執行。

2)通過REST API從我的主應用程序提交的作業:

根據精度級別,可能不一定正確。

您使用上面的REST API(就像您使用spark-submit提交1中的代碼一樣)。 是為了提交您的代碼以供執行。

因此,在2)中,與1)中的“通過REST API提交的作業”和“通過SparkSession提交的作業”無關。

它更多地是關於通過REST API(項目2)提交的Spark應用程序的jar(而不是通過Spark spark-submit (項目1)) spark-submit

無論您如何提交Spark應用程序, main方法中的代碼都不會更改-REST API與spark-submit。

它在哪里執行? 與REST API調用在同一台機器上嗎? 在Spark驅動程序上? 還是Spark工作者?)

這是一個非常好的問題,並且取決於驅動程序的所謂deploy-mode 你的任務是在執行人所以哪兒取決於您的集群上總是執行(見所謂的主URL指定使用--master主網址 )。

您不能將應用程序提交給Spark驅動程序,因為它是Spark應用程序的一部分,而不是執行環境。 您只能對Spark執行程序執行任務。

使用deploy-mode情況可能會發生變化(請參閱使用spark-submit啟動應用程序 ):

--deploy-mode是將驅動程序部署在工作程序節點( cluster )上還是作為外部客戶端( client )本地部署(默認值: client

認為 SparkRestClient將執行您的驅動程序,就像您使用cluster部署模式進行spark-submited SparkRestClient一樣,但這是您必須檢查的事情。 由於您是使用REST API提交Spark應用程序的jar,因此我無法想到一種在REST API的主服務器上運行該應用程序的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM