用SBT编译Spark的WordCount程序
问题导读:
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配置文件,各行需要有一个空行分割
name := "WordCount"
[this is bank line]
version := "1.0.0"
[this is bank line]
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[String]) {
//命令行参数个数检查
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
[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上的方法,写一个执行脚本
#!/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 \
--class spark.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
执行脚本,过一会就可以看到结果了
用SBT编译Spark的WordCount程序的更多相关文章
- [转] 用SBT编译Spark的WordCount程序
问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...
- sbt编译spark程序提示value toDF is not a member of Seq()
sbt编译spark程序提示value toDF is not a member of Seq() 前提 使用Scala编写的Spark程序,在sbt编译打包的时候提示value toDF is no ...
- 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6 ...
- 使用SBT编译Spark子项目
前言 最近为了解决Spark2.1的Bug,对Spark的源码做了不少修改,需要对修改的代码做编译测试,如果编译整个Spark项目快的话,也得半小时左右,所以基本上是改了哪个子项目就单独对那个项目编译 ...
- window环境下使用sbt编译spark源码
前些天用maven编译打包spark,搞得焦头烂额的,各种错误,层出不穷,想想也是醉了,于是乎,换种方式,使用sbt编译,看看人品如何! 首先,从官网spark官网下载spark源码包,解压出来.我这 ...
- Eclipse+Maven+Scala Project+Spark | 编译并打包wordcount程序
学习用Eclipse+Maven来构建并打包一个简单的单词统计的例程. 本项目源码已托管于Github –>[Spark-wordcount] 第一步 在EclipseIDE中安装Scala插件 ...
- 在IDEA中编写Spark的WordCount程序
1:spark shell仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在IDE中编制程序,然后打成jar包,然后提交到集群,最常用的是创建一个Maven项目,利用Maven来管理jar包 ...
- spark运行wordcount程序
首先提一下spark rdd的五大核心特性: 1.rdd由一系列的分片组成,比如说128m一片,类似于hadoop中的split2.每一个分区都有一个函数去迭代/运行/计算3.一系列的依赖,比如:rd ...
- Spark开发wordcount程序
1.java版本(spark-2.1.0) package chavin.king; import org.apache.spark.api.java.JavaSparkContext; import ...
随机推荐
- linux用户下的.profile文件丢失
登录用户时出现以下问题: #su - wqq-bash-4.1$ -bash-4.1$ 查看时发现环境变量文件丢失造成的 解决方法: # ls -la /etc/skel/ total 36drwx ...
- 【转】SyntaxError: Non-ASCII character ‘\xe5′ in file
SyntaxError: Non-ASCII character ‘\xe5′ in file 在写一个小脚本,运行起来总是出现这个错误 查了下Python的默认编码文件是用的ASCII码,你将文件存 ...
- 有关FPGA
在FPGA发展历史上,前后共有过超过50家厂商,在国外目前剩下不到10家,除赛灵思和ALTERA两家持续不断地军备竞赛,其它的都有着各自固守的市场定位.即使是有新进入者,例如受英特尔新工艺支 ...
- 二、django rest_framework源码之认证流程剖析
1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...
- 【原创】MySQL Replay线上流量压测工具
一. 背景 去年做过一次mysql trace 重放的测试,由于performance schema本身采集样本的长度等限制,实际回放的成功率比较低. 最近找到一款开源的工具,基于TCPCopy实现了 ...
- [python 源码]整数对象的创建和维护
刚开始学python时候,发现一个很迷惑的现象,一直到看了源码后才知道了: >>> a=6 >>> b=6 >>> a is b True 想用同 ...
- 使用gdb调试
启用gdb进行调试二进制程序,必须在二进制程序在采用gcc或g++编译时加入-g参数 启动gdb进行调试的几种形式: 直接启动gdb程序进行调试program程序 gdb program 启动gdb挂 ...
- session过期情况下ajax请求不会触发重新登录的问题
在拦截器中添加以下逻辑 String requestType = request.getHeader("X-Requested-With"); if (!StringUtils.i ...
- loj#2537. 「PKUWC2018」Minimax
题目链接 loj#2537. 「PKUWC2018」Minimax 题解 设\(f_{u,i}\)表示选取i的概率,l为u的左子节点,r为u的子节点 $f_{u,i} = f_{l,i}(p \sum ...
- luoguP3359 改造异或树 线段树合并
删边转化为加边 然后每次用线段树合并就行..... 确确实实很简单 然而为什么线段树合并跑不过$splay$的启发式合并,常数稍大了点... 复杂度$O(n \log n)$ #include < ...