问题导读:
1.什么是sbt?
2.sbt项目环境如何建立?
3.如何使用sbt编译打包scala?
sbt介绍
sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要java1.6以上。
sbt项目环境建立
sbt编译需要固定的目录格式,并且需要联网,sbt会将依赖的jar包下载到用户home的.ivy2下面,目录结构如下:
|--build.sbt |--lib |--project |--src | |--main | | |--scala | |--test | |--scala |--sbt |--target
以上建立目录如下:
mkdir -p ~/spark_wordcount/lib mkdir -p ~/spark_wordcount/project mkdir -p ~/spark_wordcount/src/main/scala mkdir -p ~/spark_wordcount/src/test/scala mkdir -p ~/spark_wordcount/target
然后拷贝spark安装目录的sbt目录的 sbt脚本和sbt的jar包
cp /path/to/spark/sbt/sbt* ~/spark_wordcount/
由于spark的sbt脚本默认查找./sbt目录,修改如下
JAR=sbt/sbt-launch-${SBT_VERSION}.jar
to
JAR=sbt-launch-${SBT_VERSION}.jar
拷贝spark的jar包到,sbt的lib目录
cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar
> ~/spark_wordcount/lib/
建立build.sbt配置文件,各行需要有一个空行分割
1 name := "WordCount" 2 [this is bank line] 3 version := "1.0.0" 4 [this is bank line] 5 scalaVersion := "2.10.3"
由于spark的sbt脚本需要到project的build.properties文件找sbt的版本号,我们建立该文件,增加如下内容:
sbt.version=0.12.4
Spark WordCount程序编写及编译
建立WordCount.scala源文件,假设需要包为spark.example
mkdir -p ~/spark_wordcount/src/main/scala/spark/example
vi -p ~/spark_wordcount/src/main/scala/spark/example/WordCount.scala
添加具体的程序代码,并保存
1 package spark.example 2 3 import org.apache.spark._ 4 import SparkContext._ 5 6 object WordCount { 7 def main(args: Array[String]) { 8 //命令行参数个数检查 9 if (args.length == 0) { 10 System.err.println("Usage: spark.example.WordCount <input> <output>") 11 System.exit(1) 12 } 13 //使用hdfs文件系统 14 val hdfsPathRoot = "hdfshost:9000" 15 //实例化spark的上下文环境 16 val spark = new SparkContext(args(0), "WordCount", 17 System.getenv("SPARK_HOME"),SparkContext.jarOfClass(this.getClass)) 18 //读取输入文件 19 val inputFile = spark.textFile(hdfsPathRoot + args(1)) 20 //执行WordCount计数 21 //读取inputFile执行方法flatMap,将每行通过空格分词 22 //然后将该词输出该词和计数的一个元组,并初始化计数 23 //为 1,然后执行reduceByKey方法,对相同的词计数累 24 //加 25 val countResult = inputFile.flatMap(line => line.split(" ")) 26 .map(word => (word, 1)) 27 .reduceByKey(_ + _) 28 //输出WordCount结果到指定目录 29 countResult.saveAsTextFile(hdfsPathRoot + args(2)) 30 } 31 }
到spark_wordcount目录,执行编译:
cd ~/spark_wordcount/
./sbt compile
打成jar包
./sbt package
编译过程,sbt需要上网下载依赖工具包,jna,scala等。编译完成后可以在target/scala-2.10/目录找到打包好的jar
[root@bd001 scala-2.10]# pwd /usr/local/hadoop/spark_wordcount/target/scala-2.10 [root@bd001 scala-2.10]# ls cache classes wordcount_2.10-1.0.0.jar
WordCount执行
可以参考Spark分布式运行于hadoop的yarn上的方法,写一个执行脚本
1 #!/usr/bin/env bash 2 3 SPARK_JAR=./assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar 4 ./bin/spark-class org.apache.spark.deploy.yarn.Client 5 --jar ~/spark_wordcount/target/scala-2.10/wordcount_2.10-1.0.0.jar 6 --class spark.example.WordCount 7 --args yarn-standalone 8 --args /testWordCount.txt 9 --args /resultWordCount 10 --num-workers 3 11 --master-memory 4g 12 --worker-memory 2g 13 --worker-cores 2
然后,拷贝一个名为testWordCount.txt的文件进hdfs
hdfs dfs -copyFromLocal ./testWordCount.txt /testWordCount.txt
执行脚本,过一会就可以看到结果了