spark代码中添加logger_SBT命令行打包spark程序

本文介绍了如何在Spark项目中使用sbt进行打包。首先,详细讲述了sbt的安装步骤,包括下载sbt-launch.jar并创建sbt脚本。然后,展示了如何编写Scala应用程序kmeans算法,并创建build.sbt配置文件。接着,通过sbt命令打包Scala程序,生成的jar包可以在Spark上提交运行。最后,提供了spark-submit运行程序的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装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

只要能得到如下图的版本信息就没问题:

1fa61dbffadce2be1ed2a315edc21d9f.png

下面我们编写一个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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值