安装sbt
sbt是一款Spark用来对scala编写程序进行打包的工具,这里简单介绍sbt的安装过程,感兴趣的读者可以参考官网资料了解更多关于sbt的内容。
Spark 中没有自带 sbt,这里直接给出sbt-launch.jar的下载地址(https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.11/sbt-launch.jar),直接点击下载即可。
我们选择安装在 /usr/local/sbt 中:
sudo mkdir /usr/local/sbt
sudo chown -R hadoop /usr/local/sbt # 此处的 hadoop 为你的用户名
cd /usr/local/sbt
下载后,执行如下命令拷贝至 /usr/local/sbt 中:
cp ~/下载/sbt-launch.jar .
接着在 /usr/local/sbt 中创建 sbt 脚本(vim ./sbt
),添加如下内容:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
保存后,为 ./sbt 脚本增加可执行权限:
chmod u+x ./sbt
最后运行如下命令,检验 sbt 是否可用(请确保电脑处于联网状态,首次运行会处于 “Getting org.scala-sbt sbt 0.13.11 …” 的下载状态,请耐心等待。笔者等待了 10 分钟才出现第一条下载提示):
./sbt sbt-version
只要能得到如下图的版本信息就没问题:

下面我们编写一个Scala应用程序kmeans算法来实现sbt编译打包。
请登录Linux系统(本教程统一采用用户名hadoop进行登录),进入Shell命令提示符状态,然后,执行下面命令:
cd /usr/local/spark/mycode/Kmean/ //Kmean是项目根目录
mkdir -p src/main/scala //这里加入-p选项,可以一起创建src目录及其子目录
请在“/usr/local/spark/mycode/Kmean/src/main/scala”目录下新建一个Kmeans.scala文件,里面包含如下代码:
//测试数据 自己创建数据文件kmeans_data.txt
0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2
//代码 自己创建代码文件Kmeans.scala
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
object Kmeans {
def main(args: Array[String]) {
// 屏蔽不必要的日志显示在终端上
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
// 设置运行环境
val conf = new SparkConf().setAppName("Kmeans").setMaster("local[4]")
val sc = new SparkContext(conf)
// 装载数据集
val data = sc.textFile("/home/hadoop/upload/class8/kmeans_data.txt", 1)
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble)))
// 将数据集聚类,2个类,20次迭代,进行模型训练形成数据模型
val numClusters = 2
val numIterations = 20
val model = KMeans.train(parsedData, numClusters, numIterations)
// 打印数据模型的中心点
println("Cluster centers:")
for (c <- model.clusterCenters) {
println(" " + c.toString)
}
// 使用误差平方之和来评估数据模型
val cost = model.computeCost(parsedData)
println("Within Set Sum of Squared Errors = " + cost)
// 使用模型测试单点数据
println("Vectors 0.2 0.2 0.2 is belongs to clusters:" + model.predict(Vectors.dense("0.2 0.2 0.2".split(' ').map(_.toDouble))))
println("Vectors 0.25 0.25 0.25 is belongs to clusters:" + model.predict(Vectors.dense("0.25 0.25 0.25".split(' ').map(_.toDouble))))
println("Vectors 8 8 8 is belongs to clusters:" + model.predict(Vectors.dense("8 8 8".split(' ').map(_.toDouble))))
// 交叉评估1,只返回结果
val testdata = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble)))
val result1 = model.predict(testdata)
result1.saveAsTextFile("/home/hadoop/upload/class8/result_kmeans1")
// 交叉评估2,返回数据集和结果
val result2 = data.map {
line =>
val linevectore = Vectors.dense(line.split(' ').map(_.toDouble))
val prediction = model.predict(linevectore)
line + " " + prediction
}.saveAsTextFile("/home/hadoop/upload/class8/result_kmeans2")
sc.stop()
}
}
然后执行如下命令:
cd /usr/local/spark/mycode/Kmean/
vim simple.sbt
通过上面代码,新建一个build.sbt文件,请在该文件中输入下面代码:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.1.0" //添加依赖包方法
注意, “org.apache.spark”后面是两个百分号,千万不要少些一个百分号%,如果少了,编译时候会报错。
下面我们使用 sbt 打包 Scala 程序。为保证 sbt 能正常运行,先执行如下命令检查整个应用程序的文件结构:
cd /usr/local/spark/mycode/wordcount/
find .
应该是类似下面的文件结构:
.
./src
./src/main
./src/main/scala
./src/main/scala/Kmeans.scala
./build.sbt
./kmeans_data.txt
接着,我们就可以通过如下代码将整个应用程序打包成 JAR(首次运行同样需要下载依赖包 ):
cd /usr/local/spark/mycode/Kmean/ //请一定把这目录设置为当前目录
/usr/local/sbt/sbt package //sbt安装地址
上面执行过程需要消耗几分钟时间,屏幕上会返回一下信息:
hadoop@dblab-VirtualBox:/usr/local/spark/mycode/wordcount$ /usr/local/sbt/sbt package
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] Set current project to Simple Project (in build file:/usr/local/spark/mycode/wordcount/)
[info] Updating {file:/usr/local/spark/mycode/wordcount/}wordcount...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Packaging /usr/local/spark/mycode/wordcount/target/scala-2.11/simple-project_2.11-1.0.jar ...
[info] Done packaging.
[success] Total time: 34 s, completed 2017-2-20 10:13:13
#屏幕上返回上述信息表明打包成功
生成的 jar 包的位置为 /usr/local/spark/mycode/Kmean/target/scala-2.11/simple-project_2.11-1.0.jar。
最后,通过 spark-submit 运行程序。我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了,命令如下:
/usr/local/spark/bin/spark-submit --class "kmeans" /usr/local/spark/mycode/Kmean/target/scala-2.11/simple-project_2.11-1.0.jar
本文参考下列文章,感谢贡献者!
https://www.jianshu.com/p/65d7fb14f03b
http://dblab.xmu.edu.cn/blog/1307-2/