[英]Add JAR files to a Spark job - spark-submit
是的……已經討論了很多。
但是,有很多歧義和提供的一些答案......包括在 jars/executor/driver 配置或選項中復制 JAR 引用。
應針對每個選項澄清以下含糊不清、不清楚和/或遺漏的細節:
--jars
SparkContext.addJar(...)
方法SparkContext.addFile(...)
方法--conf spark.driver.extraClassPath=...
或--driver-class-path...
--conf spark.driver.extraLibraryPath=...
或--driver-library-path...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
我知道在哪里可以找到主要的 Apache Spark 文檔,特別是關於如何提交、可用選項以及JavaDoc的信息。 然而,這給我留下了很多漏洞,盡管它也得到了部分回答。
我希望它不是那么復雜,並且有人可以給我一個清晰簡潔的答案。
如果我從文檔中猜測,似乎--jars
以及SparkContext
addJar
和addFile
方法將自動分發文件,而其他選項僅修改 ClassPath。
為簡單起見,假設我可以同時使用三個主要選項添加其他應用程序 JAR 文件是否安全?
spark-submit --jar additional1.jar,additional2.jar \
--driver-library-path additional1.jar:additional2.jar \
--conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar
我在另一個帖子的答案上找到了一篇不錯的文章。 然而,並沒有學到任何新東西。 海報確實很好地說明了本地驅動程序(yarn-client)和遠程驅動程序(yarn-cluster)之間的區別。 牢記這一點絕對重要。
ClassPath 會受到影響,具體取決於您提供的內容。 有幾種方法可以在類路徑上設置一些東西:
spark.driver.extraClassPath
或其別名--driver-class-path
用於在運行驅動程序的節點上設置額外的類路徑。spark.executor.extraClassPath
在 Worker 節點上設置額外的類路徑。如果您希望某個 JAR 對 Master 和 Worker 都有效,則必須在 BOTH 標志中分別指定它們。
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
;
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
這取決於您運行工作的模式:
客戶端模式 - Spark 啟動 Netty HTTP 服務器,該服務器在啟動時為每個工作節點分發文件。 您可以看到,當您開始 Spark 作業時:
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b 16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server 16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922. 16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732 16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
集群模式 - 在集群模式下,spark 選擇了一個領導工作節點來執行驅動程序進程。 這意味着作業不是直接從主節點運行的。 在這里,Spark不會設置 HTTP 服務器。 您必須通過所有節點都可用的 HDFS/S3/Other 源手動將 JARS 提供給所有工作節點。
在“提交應用程序”中,Spark 文檔很好地解釋了文件的可接受前綴:
使用 spark-submit 時,應用程序 jar 以及 --jars 選項中包含的任何 jar 將自動傳輸到集群。 Spark 使用以下 URL 方案來允許使用不同的策略來傳播 jars:
- file: - 絕對路徑和 file:/ URI 由驅動程序的 HTTP 文件服務器提供服務,每個執行程序從驅動程序 HTTP 服務器中提取文件。
- hdfs:, http:, https:, ftp: - 這些按照預期從 URI 中下拉文件和 JAR
- local: - 以 local:/ 開頭的 URI 預期作為每個工作節點上的本地文件存在。 這意味着不會產生網絡 IO,並且適用於推送到每個 worker 或通過 NFS、GlusterFS 等共享的大文件/JAR。
請注意,JAR 和文件被復制到執行器節點上每個 SparkContext 的工作目錄中。
如前所述,JAR 被復制到每個 Worker 節點的工作目錄中。 那究竟是哪里? 它通常在/var/run/spark/work
,你會看到它們是這樣的:
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
當您查看內部時,您會看到您部署的所有 JAR:
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark 457 May 8 17:34 stderr
-rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
要了解的最重要的事情是優先級。 如果您通過代碼傳遞任何屬性,它將優先於您通過spark-submit
指定的任何選項。 Spark文檔中提到了這一點:
任何指定為標志或屬性文件中的值都將傳遞給應用程序並與通過 SparkConf 指定的值合並。 直接在 SparkConf 上設置的屬性具有最高優先級,然后標志傳遞給 spark-submit 或 spark-shell,然后是 spark-defaults.conf 文件中的選項
因此,請確保將這些值設置在正確的位置,這樣當一個優先於另一個時您就不會感到驚訝。
讓我們分析每個有問題的選項:
--jars
vs SparkContext.addJar
:它們是相同的,只有一個是通過 spark submit 設置的,一個是通過代碼設置的。 選擇更適合您的那一款。 需要注意的一件重要事情是,使用這些選項中的任何一個都不會將 JAR 添加到您的驅動程序/執行程序 classpath ,您需要在兩者上使用extraClassPath
配置顯式添加它們。SparkContext.addJar
與SparkContext.addFile
:當您有需要與代碼一起使用的依賴項時,請使用前者。 當您只想將任意文件傳遞到工作節點時使用后者,這不是代碼中的運行時依賴項。--conf spark.driver.extraClassPath=...
或--driver-class-path
:這些是別名,不管你選擇哪一個--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
同上,別名。--conf spark.executor.extraClassPath=...
:當您有一個無法包含在 uber JAR 中的依賴項(例如,因為庫版本之間存在編譯時沖突)並且您需要加載該依賴項時使用此選項在運行時。--conf spark.executor.extraLibraryPath=...
這作為 JVM 的java.library.path
選項傳遞。 當您需要對 JVM 可見的庫路徑時使用此選項。為了簡單起見,我可以同時使用 3 個主要選項添加額外的應用程序 jar 文件是否安全:
您可以安全地假設這僅適用於客戶端模式,而不是集群模式。 正如我之前所說的。 此外,你給出的例子有一些多余的論點。 例如,將 JAR 傳遞給--driver-library-path
是沒有用的,如果您希望它們在您的類路徑上,您需要將它們傳遞給extraClassPath
。 最終,當您在驅動程序和工作線程上部署外部 JAR 時,您想要做的是:
spark-submit --jars additional1.jar,additional2.jar \
--driver-class-path additional1.jar:additional2.jar \
--conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar
spark 2.1.0
另一種方法是在 spark-submit 期間使用--conf spark.driver.userClassPathFirst=true
改變依賴加載的優先級,從而改變 spark-job 的行為,通過優先考慮用戶的 jars正在使用--jars
選項添加到類路徑。
其他與 jars 和 classpath 相關的可配置 Spark 選項,在yarn
作為部署模式的情況下如下
從火花文檔,
spark.yarn.jars
包含要分發到 YARN 容器的 Spark 代碼的庫列表。 默認情況下,YARN 上的 Spark 將使用本地安裝的 Spark jar,但 Spark jar 也可以位於 HDFS 上的全局可讀位置。 這允許 YARN 將其緩存在節點上,以便每次應用程序運行時都不需要分發。 例如,要指向 HDFS 上的 jar,請將此配置設置為 hdfs:///some/path。 允許使用 Glob。
spark.yarn.archive
包含分發到 YARN 緩存所需的 Spark jar 的存檔。 如果設置,此配置將替換 spark.yarn.jars 並且存檔用於所有應用程序的容器。 存檔應在其根目錄中包含 jar 文件。 與前一個選項一樣,存檔也可以托管在 HDFS 上以加快文件分發。
用戶可以配置此參數來指定他們的 jar,這些 jar 又包含在 Spark 驅動程序的類路徑中。
將 spark-submit 與 --master yarn-cluster 一起使用時,應用程序 jar 以及 --jars 選項中包含的任何 jar 將自動傳輸到集群。 在 --jars 之后提供的 URL 必須用逗號分隔。 該列表包含在驅動程序和執行程序類路徑中
示例:
spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar
https://spark.apache.org/docs/latest/submitting-applications.html
使用--jars
有限制:如果要為jar/xml
文件的位置指定目錄,則不允許目錄擴展。 這意味着如果您需要為每個 jar 指定絕對路徑。
如果您指定--driver-class-path
並且在紗線集群模式下執行,則驅動程序類不會更新。 我們可以在 tab 環境下的 spark ui 或 spark history server 下驗證類路徑是否更新。
對我來說傳遞包含目錄擴展並在紗線集群模式下工作的--conf
選項是--conf
選項。 最好將驅動程序和執行程序類路徑作為--conf
,這會將它們添加到 spark 會話對象本身,並且這些路徑反映在 Spark 配置中。 但是請確保將 jars 放在整個集群的同一路徑上。
spark-submit \
--master yarn \
--queue spark_queue \
--deploy-mode cluster \
--num-executors 12 \
--executor-memory 4g \
--driver-memory 8g \
--executor-cores 4 \
--conf spark.ui.enabled=False \
--conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
--conf spark.hadoop.mapred.output.dir=/tmp \
--conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
--conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp
我知道使用--jars
選項添加 jar 也會自動將其添加到類路徑中。
https://spark.apache.org/docs/3.2.1/submitting-applications.html
該列表包含在驅動程序和執行程序類路徑中。
雖然我們使用 spark-submit 實用程序提交 spark 作業,但有一個選項--jars
。 使用此選項,我們可以將 jar 文件傳遞給 Spark 應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.