簡體   English   中英

將 JAR 個文件添加到 Spark 作業 - spark-submit

[英]Add JAR files to a Spark job - spark-submit

是的……已經討論了很多。

但是,有很多歧義和提供的一些答案......包括在 jars/executor/driver 配置或選項中復制 JAR 引用。

模棱兩可和/或遺漏的細節

應針對每個選項澄清以下含糊不清、不清楚和/或遺漏的細節:

  • ClassPath 是如何受到影響的
    • 司機
    • 執行器(用於運行的任務)
    • 兩個都
    • 一點也不
  • 分隔符:逗號、冒號、分號
  • 如果提供的文件自動分發
    • 對於任務(對每個執行者)
    • 對於遠程驅動程序(如果在集群模式下運行)
  • 接受的 URI 類型:本地文件、 HDFS、HTTP等。
  • 如果復制一個公共位置,該位置(HDFS,本地?)

它影響的選項:

  1. --jars
  2. SparkContext.addJar(...)方法
  3. SparkContext.addFile(...)方法
  4. --conf spark.driver.extraClassPath=...--driver-class-path...
  5. --conf spark.driver.extraLibraryPath=...--driver-library-path...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. 不要忘記,spark-submit 的最后一個參數也是一個.jar 文件。

我知道在哪里可以找到主要的 Apache Spark 文檔,特別是關於如何提交、可用選項以及JavaDoc的信息。 然而,這給我留下了很多漏洞,盡管它也得到了部分回答。

我希望它不是那么復雜,並且有人可以給我一個清晰簡潔的答案。

如果我從文檔中猜測,似乎--jars以及SparkContext addJaraddFile方法將自動分發文件,而其他選項僅修改 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 標志中分別指定它們。

分隔符:

遵循與 JVM 相同的規則

  • Linux:冒號:
    • 例如:-- --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
  • Windows:一個分號;
    • 例如:-- --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"

文件分發:

這取決於您運行工作的模式:

  1. 客戶端模式 - 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
  2. 集群模式 - 在集群模式下,spark 選擇了一個領導工作節點來執行驅動程序進程。 這意味着作業不是直接從主節點運行的。 在這里,Spark不會設置 HTTP 服務器。 您必須通過所有節點都可用的 HDFS/S3/Other 源手動將 JARS 提供給所有工作節點。

接受的文件 URI

“提交應用程序”中,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.addJarSparkContext.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.

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