簡體   English   中英

Spark,Fat Jar的替代品

[英]Spark, Alternative to Fat Jar

我知道至少有兩種方法可以將我的依賴項放入Spark EMR作業中。 一種是創建一個胖jar,另一種是使用--packages選項指定spark中提交的--packages

拉鏈需要很長時間。 這是正常的嗎? ~10分鍾。 我們是否可能錯誤配置了它?

命令行選項很好,但容易出錯。

還有其他選擇嗎? 我喜歡它,如果有(已經存在)一種方法將依賴列表包含在帶有gradle的jar中,然后讓它下載它們。 這可能嗎? 還有其他選擇嗎?

更新:我發布了部分答案。 我在原始問題中沒有說清楚的一件事是我關心你何時遇到依賴沖突,因為你有不同版本的jar。

更新

感謝您關於減少依賴項數量或盡可能使用提供的響應。 為了這個問題,我們假設我們擁有運行jar所需的最少數量的依賴項。

如果必須通過某些應用程序在Spark啟動器的幫助下啟動spark作業,則可以使用Spark啟動程序,您可以配置jar patah,無需為運行應用程序創建fat.jar。

使用fat-jar,你必須安裝Java並啟動Spark應用程序需要執行java -jar [your-fat-jar-here]。 如果您想要從Web應用程序啟動應用程序,則很難自動化它。

使用SparkLauncher,您可以選擇從另一個應用程序啟動Spark應用程序,例如上面的Web應用程序。 它更容易。

import org.apache.spark.launcher.SparkLauncher

SparkLauncher extends App {

val spark = new SparkLauncher()
.setSparkHome("/home/knoldus/spark-1.4.0-bin-hadoop2.6")
.setAppResource("/home/knoldus/spark_launcher-assembly-1.0.jar")
.setMainClass("SparkApp")
.setMaster("local[*]")
.launch();
spark.waitFor();

}

代碼: https //github.com/phalodi/Spark-launcher

這里

  • setSparkHome(“/ home / knoldus / spark-1.4.0-bin-hadoop2.6”)用於設置內部使用的spark home來調用spark submit。

  • .setAppResource(“/ home / knoldus / spark_launcher-assembly-1.0.jar”)用於指定我們的spark應用程序的jar。

  • .setMainClass(“SparkApp”)火花程序的入口點即驅動程序。

  • .setMaster(“local [*]”)設置master的地址,從這里開始我們現在在loacal機器上運行它。

  • .launch()只是啟動我們的spark應用程序

SparkLauncher與java -jar fat-jar有什么好處?

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-SparkLauncher.html

https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/launcher/SparkLauncher.html

http://henningpetersen.com/post/22/running-apache-spark-jobs-from-applications

例如,在Cloudera的集群上,所有節點上都有一些庫可用,這些庫將在類路徑上用於驅動程序,執行程序。 這些是例如火花核心,火花蜂巢,hadoop等

版本按Cloudera分組 ,因此例如你有spark-core-cdh5.9.0,其中cdh5.9.0后綴表示具有該后綴的所有庫實際上都被Cloudera驗證為正常工作。 您應該做的只是使用具有相同組后綴的庫,並且不應該有任何類路徑沖突。

允許的是:在應用程序中配置依賴關系 作為Maven的范圍提供 ,因此它們不會成為胖jar的一部分 ,而是從節點上的類路徑解析。

你不會寫你有什么樣的集群,但也許你可以使用similliar方法。

maven shade插件可用於創建fat jar,它還允許設置要包含在jar中的庫,並且不包括列表中不包含的庫。

我認為在這個回答Spark,替代Fat Jar但使用S3作為依賴存儲的情況下描述了類似的東西。

胖罐確實需要花費大量時間來制作。 通過刪除運行時不需要的依賴項,我能夠優化一點。 但這確實是一種痛苦。

HubSpot有一個(部分)解決方案:SlimFast。 你可以在http://product.hubspot.com/blog/the-fault-in-our-jars-why-we-stopped-building-fat-jars找到解釋,你可以在這里找到代碼https:// github.com/HubSpot/SlimFast

實際上它會存儲它在s3上所需的所有罐子,所以當它構建時它會在沒有包裝罐子的情況下完成它,但是當它需要運行時它會從s3獲取它們。 所以你的構建很快,下載不需要很長時間。

我認為如果這也能夠在上傳時遮蔽jar的路徑,為了避免沖突,那么這將是一個完美的解決方案。

暫無
暫無

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

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