2015-08-28 21 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