【发布时间】:2017-09-29 04:41:12
【问题描述】:
我正在使用 Spark 中的 ETL 管道,我发现推送发布是时间/带宽密集型的。我的发布脚本(伪代码):
sbt assembly
openstack object create spark target/scala-2.11/etl-$VERSION-super.jar
spark-submit \
--class comapplications.WindowsETLElastic \
--master spark://spark-submit.cloud \
--deploy-mode cluster \
--verbose \
--conf "spark.executor.memory=16g" \
"$JAR_URL"
它可以工作,但可能需要 4 多分钟来组装和一分钟来推动。我的 build.sbt:
name := "secmon_etl"
version := "1.2"
scalaVersion := "2.11.8"
exportJars := true
assemblyJarName in assembly := s"${name.value}-${version.value}-super.jar"
libraryDependencies ++= Seq (
"org.apache.spark" %% "spark-core" % "2.1.0" % "provided",
"org.apache.spark" %% "spark-streaming" % "2.1.0" % "provided",
"org.apache.spark" %% "spark-streaming-kafka-0-10" % "2.1.0",
"io.spray" %% "spray-json" % "1.3.3",
// "commons-net" % "commons-net" % "3.5",
// "org.apache.httpcomponents" % "httpclient" % "4.5.2",
"org.elasticsearch" % "elasticsearch-spark-20_2.11" % "5.3.1"
)
assemblyMergeStrategy in assembly <<= (assemblyMergeStrategy in assembly) {
(old) => {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
}
问题似乎在于 elasticsearch-spark-20_2.11 的大小。它为我的 uberjar 增加了大约 90MB。我很乐意将其转换为对 spark 主机的 provided 依赖项,从而无需打包。问题是,最好的方法是什么?我应该手动复制 jars 还是有一种万无一失的方法来指定依赖项并让工具解析所有传递依赖项?
【问题讨论】:
标签: java apache-spark dependencies etl sbt-assembly