pig2 发表于 2014-8-1 10:48:02

用SBT编译Spark的WordCount程序

问题导读:
1.什么是sbt?
2.sbt项目环境如何建立?
3.如何使用sbt编译打包scala?


static/image/hrline/4.gif




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配置文件,各行需要有一个空行分割
name := "WordCount"

version := "1.0.0"

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
添加具体的程序代码,并保存
package spark.example

import org.apache.spark._
import SparkContext._

object WordCount {
def main(args: Array) {
    //命令行参数个数检查
    if (args.length == 0) {
      System.err.println("Usage: spark.example.WordCount <input> <output>")
      System.exit(1)
    }
    //使用hdfs文件系统
    val hdfsPathRoot = "hdfshost:9000"
    //实例化spark的上下文环境
    val spark = new SparkContext(args(0), "WordCount",
      System.getenv("SPARK_HOME"),SparkContext.jarOfClass(this.getClass))
    //读取输入文件
    val inputFile = spark.textFile(hdfsPathRoot + args(1))
    //执行WordCount计数
    //读取inputFile执行方法flatMap,将每行通过空格分词
    //然后将该词输出该词和计数的一个元组,并初始化计数
    //为 1,然后执行reduceByKey方法,对相同的词计数累
    //加
    val countResult = inputFile.flatMap(line => line.split(" "))
                      .map(word => (word, 1))
                      .reduceByKey(_ + _)
    //输出WordCount结果到指定目录
    countResult.saveAsTextFile(hdfsPathRoot + args(2))
}
}
到spark_wordcount目录,执行编译:
cd ~/spark_wordcount/
./sbt compile
打成jar包
./sbt package
编译过程,sbt需要上网下载依赖工具包,jna,scala等。编译完成后可以在target/scala-2.10/目录找到打包好的jar
# pwd
/usr/local/hadoop/spark_wordcount/target/scala-2.10
# ls
cacheclasseswordcount_2.10-1.0.0.jar

WordCount执行
可以参考Spark分布式运行于hadoop的yarn上的方法,写一个执行脚本
#!/usr/bin/env bash

SPARK_JAR=./assembly/target/scala-2.10/spark-assembly_2.10-0.9.0-incubating-hadoop2.2.0.jar \
    ./bin/spark-class org.apache.spark.deploy.yarn.Client \
      --jar ~/spark_wordcount/target/scala-2.10/wordcount_2.10-1.0.0.jar \
      --classspark.example.WordCount \
      --args yarn-standalone \
      --args /testWordCount.txt \
      --args /resultWordCount \
      --num-workers 3 \
      --master-memory 4g \
      --worker-memory 2g \
      --worker-cores 2
然后,拷贝一个名为testWordCount.txt的文件进hdfs
hdfs dfs -copyFromLocal ./testWordCount.txt /testWordCount.txt


然后执行脚本,过一会就可以看到结果了



















刚果 发表于 2015-4-21 20:37:08

spark目录下哪里有sbt目录?????
spark1.2.0

xbings 发表于 2016-5-16 15:57:58


spark-1.6 目录下也没有sbt目录,楼主,咋整 。。。

Asakariayisa 发表于 2016-6-9 14:55:55

拷贝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/
这一步复制的是什么jar? 是spark的lib目录里的jar还是spark的安装包?
我的spark安装包是.gz格式的

Asakariayisa 发表于 2016-6-9 14:57:43

出现了这个报错能帮忙解决一下吗?

nextuser 发表于 2016-6-9 16:25:40

Asakariayisa 发表于 2016-6-9 14:55
拷贝spark的jar包到,sbt的lib目录
cp /path/to/spark/assembly/target/scala-2.10/spark-assembly_2.10-0 ...

安装包需要解压,里面有很多jar包。里面搜搜应该就能找到

nextuser 发表于 2016-6-9 16:26:51

Asakariayisa 发表于 2016-6-9 14:57
出现了这个报错能帮忙解决一下吗?

错误看不出太多的问题,可能是类型的问题

gao634209276 发表于 2016-6-9 16:36:22

他已经解决了

页: [1]
查看完整版本: 用SBT编译Spark的WordCount程序