簡単簡単といろんな記事で書かれているsbt assemblyがsparkでは全然簡単じゃなくて心が折れそうだったのでメモ
sbt assemblyはscalaプロジェクトをスタンドアローン起動できるjarを作ってくれるsbtプラグイン
sbt assemblyプラグインの設定を書く
project/plugins.sbt
logLevel := Level.Warn
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
ごくシンプルなWordCountプログラムを書く 第一引数=データファイル 第2引数=検索キーワード
SparkSubmit_sample1.scala
import org.apache.spark
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by Siori on 15/05/22.
*/
object SparkSubmit_sample1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("WordCount Application")
val sc = new SparkContext(conf)
val textFile = sc.textFile(args(0))
val filterResult = textFile.filter(line => line.contains(args(1)))
println(filterResult.count())
sc.stop
}
}
build.sbtを書く
build.sbt
name := "sparkWorkCount"
version := "1.0"
scalaVersion := "2.11.6"
libraryDependencies ++= Seq(
("org.apache.spark" %% "spark-core" % "1.3.1").
exclude("org.mortbay.jetty", "servlet-api").
exclude("com.google.guava","guava").
//exclude("org.apache.spark","spark-network-common_2.11").
exclude("org.apache.hadoop","hadoop-yarn-api").
exclude("commons-beanutils", "commons-beanutils-core").
exclude("commons-collections", "commons-collections").
exclude("commons-logging", "commons-logging").
exclude("org.spark-project.spark", "unused").
exclude("com.esotericsoftware.minlog", "minlog")
)
// libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.1"
// libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.6.0"
mainClass in assembly := Some("SparkSubmit_sample1")
Sparkは現状scala2.10x系がデフォルトなので注意。ここではなんとなく最新版にしている。
とりあえずWordCountプログラムであればこの設定で動く。
exclude(訳:締め出す)はコンフリクトを起こしているクラス名を除外している設定である。
そう、簡単と言われているsbt assemblyだが結局ココらへんは手で人間が調整する必要がありはっきりいって全然簡単でもないしストレスが貯まる作業である。
sbt assembly
すると成功すればJARが作成され、失敗すればコンフリクトを起こしているパッケージがずらーと出てくるので
排除したい方をbuild.sbtに記述し、またsbt assembly
を実行し、またエラーが出たら・・・の繰り返しをやる楽しい作業をすることになる。