如何在mesos集群上使用spark时预打包外部库

lvmkulzt  于 2021-06-21  发布在  Mesos
关注(0)|答案(4)|浏览(278)

根据mesos文档上的Spark,需要设置 spark.executor.uri 指向Spark分布:

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发行版的定制版本。
我现在的问题是,是否可以/希望预先打包外部库,例如
Kafka
ElasticSearchSpark
Sparkcsv
这将主要用于所有的工作罐,我将提交通过 spark-submit
减少时间 sbt assembly 我需要把肥jar打包
缩小需要提交的胖jar的尺寸
如果是这样,如何实现这一点?一般来说,是否有一些关于如何加快工作提交过程中fat jar生成的提示?
背景是我想为spark作业运行一些代码生成,并立即提交这些代码,并在浏览器前端异步显示结果。前端部分不应该太复杂,但是我想知道如何实现后端部分。

ttp71kqs

ttp71kqs1#

是的,您可以将依赖项复制到worker,并将它们放在系统范围的jvm lib目录中,以便将它们放在类路径上。
然后您可以将这些依赖项标记为sbt构建中提供的依赖项,并且它们不会包含在程序集中。这确实加快了装配和转移时间。
我没有在mesos上具体尝试过,但在spark standalone上使用过,它适用于每个工作中很少改变的事情。

d7v8vwbk

d7v8vwbk2#

使用所有依赖项创建示例maven项目,然后使用maven插件 maven-shade-plugin . 它将在目标文件夹中创建一个shade jar。
这是样品聚甲醛

<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>
cs7cruho

cs7cruho3#

当你说pre-package时,你真的是指分发给所有的从机,并设置作业来使用这些包,这样你就不需要每次都下载这些包了吗?这可能是一个选择,但是听起来有点麻烦,因为将所有内容分发给从属服务器并使所有包保持最新不是一件容易的事情。
把你的.tar.gz分解成更小的文件,这样你的作业就可以得到几个更小的文件,而不是一个胖文件,怎么样?在这种情况下,应该可以利用mesos fetcher缓存。因此,当代理缓存处于冷态时,您将看到糟糕的性能,但一旦它预热(即,一旦一个作业在本地运行并下载公共文件),连续作业将更快完成。

6fe3ivhb

6fe3ivhb4#

在我发现spark jobserver项目之后,我决定这是最适合我的用例的项目。
它支持通过restapi创建动态上下文,以及手动/编程地向新创建的上下文添加jar。它还能够运行低延迟同步作业,这正是我所需要的。
我创建了dockerfile,因此您可以使用spark(1.4.1)、spark jobserver(0.6.0)和内置mesos支持(0.24.1)的最新(受支持)版本进行尝试:
https://github.com/tobilg/docker-spark-jobserver
https://hub.docker.com/r/tobilg/spark-jobserver/
参考文献:
https://github.com/spark-jobserver/spark-jobserver#features
https://github.com/spark-jobserver/spark-jobserver#context-配置

相关问题