2015-08-28 28 views
9

按照Spark on Mesos docs一個需要的spark.executor.uri指向設置爲星火分佈在使用星火時:如何預包裝外部庫一Mesos集羣

val conf = new SparkConf() 
    .setMaster("mesos://HOST:5050") 
    .setAppName("My app") 
    .set("spark.executor.uri", "<path to spark-1.4.1.tar.gz uploaded above>") 

該文檔還指出,一個可以建立一個定製Spark發行版本。

我現在的問題是,是否有可能/期望預封裝外部庫如

  • 火花流-卡夫卡
  • elasticsearch火花
  • 火花CSV

這將用於大多數我將通過​​提交到

的所有工作罐子中使用
  • 減少時間sbt assembly需要打包脂肪罐子
  • 減少需要提交

如果是脂肪罐子的大小,如何才能實現這一目標?一般來說,關於如何提高工作提交過程中的胖子生成速度,有一些提示嗎?

背景是我想爲Spark作業運行一些代碼生成,並立即提交併在瀏覽器前端異步顯示結果。前端部分不應該太複雜,但我想知道後端部分是如何實現的。

+0

當你說預包裝你真的是分發到所有的奴隸,併成立了工作使用這些包,這樣你就不需要下載的每一次?這可能是一個選擇,但它聽起來有點麻煩。 – hartem

回答

0

後,我發現了Spark JobServer項目,我決定,這是最合適的一個我的使用情況。

它支持通過REST API創建動態上下文,以及手動/以編程方式將JAR添加到新創建的上下文中。它還能夠運行低延遲同步作業,這正是我所需要的。

我創建了一個Dockerfile,因此您可以使用Spark(1.4.1),Spark JobServer(0.6.0)和buit-in Mesos支持(0.24.1)的最新(支持)版本進行試用:

參考文獻:

2

當你說預包裝時,你真的意思是分配給所有的奴隸,並設置工作使用這些包,以便你不需要每次下載?這可能是一個選項,但是這聽起來有點麻煩,因爲將所有內容分發給從服務器並保持所有軟件包保持最新並非易事。

如何將你的.tar.gz分解成更小的部分,這樣你的作業就可以取代幾個較小的文件而不是一個胖文件?在這種情況下,應該可以利用Mesos Fetcher Cache。因此,當代理緩存很冷時,您會看到的性能不佳,但一旦它變熱(即一旦一個作業運行並在本地下載公共文件),連續作業就會更快完成。

+0

這是關於一個客戶的Spark分配作爲'spark.executor.uri'傳遞,包含Spark作業所需的罐子,以便生成的胖罐子可以變得更小 – Tobi

2

是的,您可以將依賴關係複製到工作人員,並將其放入系統範圍的jvm lib目錄中,以便將它們放到類路徑中。

然後你可以標記你的sbt版本中提供的依賴關係,它們將不會被包含在程序集中。這會加快裝配和傳輸時間。

我沒有試過這個特別的mesos,但已經用它在火花獨立的東西,在每一個工作,很少改變。

3

用你所有的依賴關係創建示例maven項目,然後使用maven插件maven-shade-plugin。它會在你的目標文件夾中創建一個陰影罐。

下面是示例POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com</groupId> 
    <artifactId>test</artifactId> 
    <version>0.0.1</version> 
    <properties> 
     <java.version>1.7</java.version> 
     <hadoop.version>2.4.1</hadoop.version> 
     <spark.version>1.4.0</spark.version> 
     <version.spark-csv_2.10>1.1.0</version.spark-csv_2.10> 
     <version.spark-avro_2.10>1.0.0</version.spark-avro_2.10> 
    </properties> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>${java.version}</source> 
        <target>${java.version}</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <!-- <minimizeJar>true</minimizeJar> --> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
           <exclude>org/bdbizviz/**</exclude> 
          </excludes> 
         </filter> 
        </filters> 
        <finalName>spark-${project.version}</finalName> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> <!-- Hadoop dependency --> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-client</artifactId> 
      <version>${hadoop.version}</version> 
      <exclusions> 
       <exclusion> 
        <artifactId>servlet-api</artifactId> 
        <groupId>javax.servlet</groupId> 
       </exclusion> 
       <exclusion> 
        <artifactId>guava</artifactId> 
        <groupId>com.google.guava</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.4</version> 
     </dependency> 

     <dependency> <!-- Spark Core --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-core_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark SQL --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-sql_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark CSV --> 
      <groupId>com.databricks</groupId> 
      <artifactId>spark-csv_2.10</artifactId> 
      <version>${version.spark-csv_2.10}</version> 
     </dependency> 
     <dependency> <!-- Spark Avro --> 
      <groupId>com.databricks</groupId> 
      <artifactId>spark-avro_2.10</artifactId> 
      <version>${version.spark-avro_2.10}</version> 
     </dependency> 
     <dependency> <!-- Spark Hive --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
     <dependency> <!-- Spark Hive thriftserver --> 
      <groupId>org.apache.spark</groupId> 
      <artifactId>spark-hive-thriftserver_2.10</artifactId> 
      <version>${spark.version}</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

正如我的問題所寫,我使用SBT作爲構建工具...也許我會明天嘗試Maven的方式...無論如何感謝 – Tobi

+0

是的,你可以嘗試,Maven是做這種事情的好方法。 – Kaushal