[英]How to create SparkSession using Java 8 and Spark 2.3.0
[英]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.