如何配置 scala + maven + eclipse怎么配置maven

Scala教程:简单构建工具SBT - ImportNew
这个章节会讲解SBT(Simple Build Tool)!包含的主题有:
创建一个sbt工程
连续执行命令
自定义工程
自定义命令
sbt代码简介(如果时间允许的话)
SBT是一个现代构建工具。它是用Scala编写的,并且针对Scala也提供了很多方便快捷的功能。它也是一个通用的构建工具。
为什么使用SBT?
强大的依赖管理功能
Ivy用来管理依赖
一个只会根据需求更新的模型
所有任务的创建都支持Scala
可连续执行命令
可以在工程的上下文里启动REPL
下载jar包:
创建一个stb shell脚本来调用jar包,例如:
java -Xmx512M -jar sbt-launch.jar &$@&
保证以上命令能够正确执行,它已经放在了path下
运行sbt来创建工程
[local ~/projects]$ sbt
Project does not exist, create new project? (y/N/s) y
Name: sample
Organization: com.twitter
Version [1.0]: 1.0-SNAPSHOT
Scala version [2.7.7]: 2.8.1
sbt version [0.7.4]:
Getting Scala 2.7.7 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
2 artifacts copied, 0 already retrieved (9911kB/221ms)
Getting org.scala-tools.sbt sbt_2.7.7 0.7.4 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
15 artifacts copied, 0 already retrieved (4096kB/167ms)
[success] Successfully initialized directory structure.
Getting Scala 2.8.1 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
2 artifacts copied, 0 already retrieved (15118kB/386ms)
[info] Building project sample 1.0-SNAPSHOT against Scala 2.8.1
using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
从一个SNAPSHORT版本来开始你的工程是一个不错的方式。
project – 工程定义文件
project/build/.scala – 主要的工程定义文件
project/build.properties – 工程,sbt以及scala版本定义
src/main – 你的应用代码放在这里,不同的子目录名称表示不同的编程语言(例如,src/main/scala,src/main/java)
src/main/resources – 你想添加到jar包里的静态文件(例如日志配置文件)
lib_managed – 你的工程所依赖的jar文件。会在sbt更新的时候添加到该目录
target – 最终生成的文件存放的目录(例如,生成的thrift代码,class文件,jar文件)
添加一些代码
我们会创建一个简单的json解析器来解析简单的tweet。添加下面的代码到 src/main/scala/com/twitter/sample/SimpleParser.scala
package com.twitter.sample
case class SimpleParsed(id: Long, text: String)
class SimpleParser {
val tweetRegex = &\&id\&:(.*),\&text\&:\&(.*)\&&.r
def parse(str: String) = {
tweetRegex.findFirstMatchIn(str) match {
case Some(m) =& {
val id = str.substring(m.start(1), m.end(1)).toInt
val text = str.substring(m.start(2), m.end(2))
Some(SimpleParsed(id, text))
case _ =& None
这段代码很丑并且有bug,但是它可以通过编译。
在控制台里进行测试
SBT可以被用作命令行脚本也可以被用作是构建控制台。我们主要把它用作构建控制台,不过大部分的命令都可以单独作为参数传给SBT,例如:
注意,如果一个命令接受参数,你需要给参数加上引号
sbt 'test-only com.twitter.sample.SampleSpec'
这种方式很古怪。
暂时不管它。现在启动sbt来构建我们的代码:
[local ~/projects/sbt-sample]$ sbt
[info] Building project sample 1.0-SNAPSHOT against Scala 2.8.1
using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
SBT允许你启动会在你启动Scala REPL的时候加载所有的依赖。它会在启动控制台前先编译工程代码,这样更加便于我们测试我们的解析器了。
[info] == compile ==
Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[info] Nothing to compile.
Post-analysis: 3 classes.
[info] == compile ==
[info] == copy-test-resources ==
[info] == copy-test-resources ==
[info] == test-compile ==
Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling test sources...
[info] Nothing to compile.
Post-analysis: 0 classes.
[info] == test-compile ==
[info] == copy-resources ==
[info] == copy-resources ==
[info] == console ==
[info] Starting scala interpreter...
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
代码编译完成,并且提供了经典的Scala命令行提示符。我们会创建一个新的解析器,一个示例的tweet,并且保证它能够正常“工作”。
scala& import com.twitter.sample._
import com.twitter.sample._
scala& val tweet = &&&{&id&:1,&text&:&foo&}&&&
tweet: java.lang.String = {&id&:1,&text&:&foo&}
scala& val parser = new SimpleParser
parser: com.twitter.sample.SimpleParser = com.twitter.sample.SimpleParser@71060c3e
scala& parser.parse(tweet)
res0: Option[com.twitter.sample.SimpleParsed] = Some(SimpleParsed(1,&foo&}))
这个简单的解析器对于这点输入内容是可以正常工作的,但是我们还需要加入测试代码并且对它进行一些改造。首先要做的就是把specs测试库以及一个真正的JSON解析器加入到我们的工程里来。为了达到这个目标,我们需要在默认的工程结构上进行改造,然后创建项目。把下面的内容添加到project/build/SampleProject.scala里:
import sbt._
class SampleProject(info: ProjectInfo) extends DefaultProject(info) {
val jackson = &org.codehaus.jackson& % &jackson-core-asl& % &1.6.1&
val specs = &org.scala-tools.testing& % &specs_2.8.0& % &1.6.5& % &test&
一个工程的定义就是一个SBT类。在这里我们继承了SBT的DefaultProject类。
这里你可以通过一个常量来指定具体的依赖。SBT使用在构建期通过反射来扫描你工程里所有的依赖常量,并且生成一个依赖树。这个语法可能比较新,不过它和下面的maven依赖是等同的:
org.codehaus.jackson
jackson-core-asl
org.scala-tools.testing
specs_2.8.0
现在我们可以把依赖的库下载下来了。从命令行(而不是sbt控制台)里运行sbt update
[local ~/projects/sbt-sample]$ sbt update
[info] Building project sample 1.0-SNAPSHOT against Scala 2.8.1
using SampleProject with sbt 0.7.4 and Scala 2.7.7
[info] == update ==
[info] :: retrieving :: com.twitter#sample_2.8.1 [sync]
confs: [compile, runtime, test, provided, system, optional, sources, javadoc]
1 artifacts copied, 0 already retrieved (2785kB/71ms)
[info] == update ==
[success] Successful.
[info] Total time: 1 s, completed Nov 24, :26 AM
[info] Total session time: 2 s, completed Nov 24, :26 AM
[success] Build completed successfully.
你会看到sbt解析出了specs库。 你的工程下面现在有了libmanaged目录,并且在libmanaged/scala2.8.1/test目录下会有specs2.8.0-1.6.5.jar文件。
添加测试用例
现在我们添加了测试二方库,把下面的代码添加到src/test/scala/com/twitter/sample/SimpleParserSpec.scala里
package com.twitter.sample
import org.specs._
object SimpleParserSpec extends Specification {
&SimpleParser& should {
val parser = new SimpleParser()
&work with basic tweet& in {
val tweet = &&&{&id&:1,&text&:&foo&}&&&
parser.parse(tweet) match {
case Some(parsed) =& {
parsed.text must be_==(&foo&)
parsed.id must be_==(1)
case _ =& fail(&didn't parse tweet&)
在sbt控制台里,运行test命令
[info] == compile ==
Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[info] Nothing to compile.
Post-analysis: 3 classes.
[info] == compile ==
[info] == test-compile ==
Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling test sources...
[info] Nothing to compile.
Post-analysis: 10 classes.
[info] == test-compile ==
[info] == copy-test-resources ==
[info] == copy-test-resources ==
[info] == copy-resources ==
[info] == copy-resources ==
[info] == test-start ==
[info] == test-start ==
[info] == com.twitter.sample.SimpleParserSpec ==
[info] SimpleParserSpec
[info] SimpleParser should
+ work with basic tweet
[info] == com.twitter.sample.SimpleParserSpec ==
[info] == test-complete ==
[info] == test-complete ==
[info] == test-finish ==
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0
[info] All tests PASSED.
[info] == test-finish ==
[info] == test-cleanup ==
[info] == test-cleanup ==
[info] == test ==
[info] == test ==
[success] Successful.
[info] Total time: 0 s, completed Nov 24, :45 AM
我们的测试用例执行了!现在我们可以添加更多的测试用例。SBT提供的一个很好的功能就是自动运行被触发的动作。它会预先启动一个循环,不断检测代码改动,一旦有改动就执行相应的动作。我们来运行~test命令,看看有什么效果。
[info] == test ==
[success] Successful.
[info] Total time: 0 s, completed Nov 24, :50 AM
1. Waiting for source changes... (press enter to interrupt)
现在,我们添加下面的测试用例:
&reject a non-JSON tweet& in {
val tweet = &&&&id&:1,&text&:&foo&&&&
parser.parse(tweet) match {
case Some(parsed) =& fail(&didn't reject a non-JSON tweet&)
case e =& e must be_==(None)
&ignore nested content& in {
val tweet = &&&{&id&:1,&text&:&foo&,&nested&:{&id&:2}}&&&
parser.parse(tweet) match {
case Some(parsed) =& {
parsed.text must be_==(&foo&)
parsed.id must be_==(1)
case _ =& fail(&didn't parse tweet&)
&fail on partial content& in {
val tweet = &&&{&id&:1}&&&
parser.parse(tweet) match {
case Some(parsed) =& fail(&didn't reject a partial tweet&)
case e =& e must be_==(None)
一旦我们保存好文件,SBT会检测到改动,它会运行测试代码,并且告诉我们parser的实现有问题。
[info] == com.twitter.sample.SimpleParserSpec ==
[info] SimpleParserSpec
[info] SimpleParser should
+ work with basic tweet
x reject a non-JSON tweet
didn't reject a non-JSON tweet (Specification.scala:43)
x ignore nested content
'foo&,&nested&:{&id' is not equal to 'foo' (SimpleParserSpec.scala:31)
+ fail on partial content
那么我们就来JSON parser的代码,让它更接近真实的parser。
package com.twitter.sample
import org.codehaus.jackson._
import org.codehaus.jackson.JsonToken._
case class SimpleParsed(id: Long, text: String)
class SimpleParser {
val parserFactory = new JsonFactory()
def parse(str: String) = {
val parser = parserFactory.createJsonParser(str)
if (parser.nextToken() == START_OBJECT) {
var token = parser.nextToken()
var textOpt:Option[String] = None
var idOpt:Option[Long] = None
while(token != null) {
if (token == FIELD_NAME) {
parser.getCurrentName() match {
case &text& =& {
parser.nextToken()
textOpt = Some(parser.getText())
case &id& =& {
parser.nextToken()
idOpt = Some(parser.getLongValue())
case _ =& // noop
token = parser.nextToken()
if (textOpt.isDefined && idOpt.isDefined) {
Some(SimpleParsed(idOpt.get, textOpt.get))
这是一个简单的Json解析器。当我们保存代码时,SBT会编译我们的代码并且运行测试代码。越来越方便了!
info] SimpleParser should
+ work with basic tweet
+ reject a non-JSON tweet
x ignore nested content
'2' is not equal to '1' (SimpleParserSpec.scala:32)
+ fail on partial content
[info] == com.twitter.sample.SimpleParserSpec ==
噢。我们需要考虑嵌套的对象。我们来给读入token的循环加上恶心的处理代码。
def parse(str: String) = {
val parser = parserFactory.createJsonParser(str)
var nested = 0
if (parser.nextToken() == START_OBJECT) {
var token = parser.nextToken()
var textOpt:Option[String] = None
var idOpt:Option[Long] = None
while(token != null) {
if (token == FIELD_NAME && nested == 0) {
parser.getCurrentName() match {
case &text& =& {
parser.nextToken()
textOpt = Some(parser.getText())
case &id& =& {
parser.nextToken()
idOpt = Some(parser.getLongValue())
case _ =& // noop
} else if (token == START_OBJECT) {
nested += 1
} else if (token == END_OBJECT) {
nested -= 1
token = parser.nextToken()
if (textOpt.isDefined && idOpt.isDefined) {
Some(SimpleParsed(idOpt.get, textOpt.get))
好了…现在没问题了!
打包和发布
现在,我们可以运行package命令来生成一个jar文件了。不过,我们可能需要和其他的团队分享我们的jar文件。要达到这个目的,我们需要基于StandardProject来构建,这个需要从头开始,并且过程有点复杂。
第一步是需要把StandardProject作为一个SBT插件添加进行来。插件是一种引入依赖的方式,只不过它是针对于你的构建而不是项目。这些依赖都定义在project/plugins/Plugins.scala里。把下面的内容添加到Plugins.scala文件。
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
val twitterMaven = && at &/&
val defaultProject = &com.twitter& % &standard-project& % &0.7.14&
注意我们把一个maven仓库也作为依赖添加进来。这是因为这个标准项目库是我们维护的,而不是在sbt的默认仓库里。
同时,我们也需要更新我们的工程定义,让他扩展StandProject类,还需要扩展一个SubversionPublisher trait,同时也需要定义我们打算发布的仓库。把SampleProject.scala修改成如下所示:
import sbt._
import com.twitter.sbt._
class SampleProject(info: ProjectInfo) extends StandardProject(info) with SubversionPublisher {
val jackson = &org.codehaus.jackson& % &jackson-core-asl& % &1.6.1&
val specs = &org.scala-tools.testing& % &specs_2.8.0& % &1.6.5& % &test&
override def subversionRepository = Some(&http://svn./maven/&)
现在我们来执行publish的动作,会看到下面的结果
[info] == deliver ==
IvySvn Build-Version: null
IvySvn Build-DateTime: null
[info] :: delivering :: com.twitter#1.0-SNAPSHOT :: 1.0-SNAPSHOT :: release :: Wed Nov 24 10:26:45 PST 2010
delivering ivy file to /Users/mmcbride/projects/sbt-sample/target/ivy-1.0-SNAPSHOT.xml
[info] == deliver ==
[info] == make-pom ==
[info] Wrote /Users/mmcbride/projects/sbt-sample/target/sample-1.0-SNAPSHOT.pom
[info] == make-pom ==
[info] == publish ==
[info] :: publishing :: com.twitter#sample
[info] Scheduling publish to http://svn./maven/com/twitter/sample/1.0-SNAPSHOT/sample-1.0-SNAPSHOT.jar
published sample to com/twitter/sample/1.0-SNAPSHOT/sample-1.0-SNAPSHOT.jar
[info] Scheduling publish to http://svn./maven/com/twitter/sample/1.0-SNAPSHOT/sample-1.0-SNAPSHOT.pom
published sample to com/twitter/sample/1.0-SNAPSHOT/sample-1.0-SNAPSHOT.pom
[info] Scheduling publish to http://svn./maven/com/twitter/sample/1.0-SNAPSHOT/ivy-1.0-SNAPSHOT.xml
published ivy to com/twitter/sample/1.0-SNAPSHOT/ivy-1.0-SNAPSHOT.xml
[info] Binary diff deleting com/twitter/sample/1.0-SNAPSHOT
[info] Commit finished r977 by 'mmcbride' at Wed Nov 24 10:26:47 PST 2010
[info] Copying from com/twitter/sample/.upload to com/twitter/sample/1.0-SNAPSHOT
[info] Binary diff finished : r978 by 'mmcbride' at Wed Nov 24 10:26:47 PST 2010
[info] == publish ==
[success] Successful.
[info] Total time: 4 s, completed Nov 24, :47 AM
然后(过一段时间),我们可以在binaries.:http://binaries./maven/com/twitter/sample/1.0-SNAPSHOT/下面看到我们发布的jar包。
任务都是Scala函数。添加任务最简单的方式是包含一个通过task方法定义的常量,例如:
lazy val print = task {(&a test action&); None}
如果你要添加依赖,同时添加一个描述,你可以按照下面的方式来添加:
lazy val print = task {(&a test action&); None}.dependsOn(compile) describedAs(&prints a line after compile&)
如果我们重新加载工程,然后运行print动作,就会看到下面的内容:
[info] == print ==
[info] a test action
[info] == print ==
[success] Successful.
[info] Total time: 0 s, completed Nov 24, :12 AM
这样确实可以的。如果你在一个单一的工程里创建这样的任务是没问题的。但是如果你在插件里这样定义的话,是非常不灵活的。我可能这样做
lazy val print = printAction
def printAction = printTask.dependsOn(compile) describedAs(&prints a line after compile&)
def printTask = task {(&a test action&); None}
这样使得用户可以自己重写任务,依赖,任务的描述,或是任务的行为。SBT大部分的内置行为都是这种模式的。作为范例,我们可以修改内置的package任务,让他在做下面的任务时打印出时间戳。
lazy val printTimestamp = task { (&current time is & + System.currentTimeMillis); None}
override def packageAction = super.packageAction.dependsOn(printTimestamp)
在StandarProject里有很多对于SBT默认配置的调整和自定义任务的示例。
actions – 显示对当前工程可用的命令
update – 下载依赖
compile – 编译代码
test – 运行测试代码
package – 创建一个可发布的jar包
publish-local – 把构建出来的jar包安装到本地的ivy缓存
publish – 把jar包发布到远程仓库(如果配置了的话)
test-failed – 运行失败的spec
test-quick – 运行所有失败的以及/或者是由依赖更新的spec
clean-cache – 清除所有的sbt缓存。类似于sbt的clean命令
clean-lib – 删除lib_managed下的所有内容
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
Java开发工程师,业余翻译
(集合中的元素要实现Comparable接口,并覆写Compartor函数才行) 这句有误。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNew1您所在的位置: &
Spark:利用Eclipse构建Spark集成开发环境(1)
Spark:利用Eclipse构建Spark集成开发环境(1)
dongxicheng.org
前一篇文章“Apache Spark学习:将Spark部署到Hadoop 2.2.0上”介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上,介绍如何利用Eclipse构建Spark集成开发环境。
前一篇文章&&介绍了如何使用Maven编译生成可直接运行在Hadoop 2.2.0上的Spark jar包,而本文则在此基础上,介绍如何利用Eclipse构建Spark集成开发环境。
(1) 准备工作
在正式介绍之前,先要以下软硬件准备:
软件准备:
,可以直接点击这里下载:
Scala 2.9.3版本,Window安装程序可以直接点击这里下载:
Eclipse Scala IDE插件,可直接点击这里下载:
装有Linux或者Windows操作系统的机器一台
(2) 构建Spark集成开发环境
我是在windows操作系统下操作的,流程如下:
步骤1:安装scala 2.9.3:直接点击安装即可。
步骤2:将Eclipse Scala IDE插件中features和plugins两个目录下的所有文件拷贝到Eclipse解压后对应的目录中
步骤3:重新启动Eclipse,点击eclipse右上角方框按钮,如下图所示,展开后,点击&Other&.&,查看是否有&Scala&一项,有的话,直接点击打开,否则进行步骤4操作。
步骤4:在Eclipse中,依次选择&Help& && &Install New Software&&,在打开的卡里填入,并按回车键,可看到以下内容,选择前两项进行安装即可。(由于步骤3已经将jar包拷贝到eclipse中,安装很快,只是疏通一下)安装完后,重复操作一遍步骤3便可。
(3) 使用Scala语言开发Spark程序
在eclipse中,依次选择&File&&&&&New&&&& &Other&&&&&& &Scala Wizard& &&&&Scala Project&,创建一个Scala工程,并命名为&SparkScala&。
右击&SaprkScala&工程,选择&Properties&,在弹出的框中,按照下图所示,依次选择&Java Build Path& &&&Libraties& &&&Add External JARs&&,导入文章&&中给出的
assembly/target/scala-2.9.3/目录下的spark-assembly-0.8.1-incubating- hadoop2.2.0.jar,这个jar包也可以自己编译spark生成,放在spark目录下的assembly/target/scala- 2.9.3/目录中。
内容导航&第 1 页: &第 2 页:
关于&&的更多文章
Apache Spark是立足于内存计算的一种快速数据分析方案。其性能已
网友评论TOP5
所以姑娘,让我们做一枚花见花开的程序媛。
讲师: 0人学习过讲师: 35人学习过讲师: 58人学习过
每年的一月份大约都是在看似忙忙碌碌中度过的。最近一
自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源
1314的的日子在,在忙忙碌碌中过去了。一周五天,中间
本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程管理、压缩与查询
51CTO旗下网站分别用Eclipse和IDEA搭建Scala+Spark开发环境_服务器应用_Linux公社-Linux系统门户网站
你好,游客
分别用Eclipse和IDEA搭建Scala+Spark开发环境
来源:Linux社区&
作者:simplestupid
开发机器上安装jdk1.7.0_60和scala2.10.4,配置好相关环境变量。网上资料很多,安装过程忽略。此外,Eclipse使用Luna4.4.1,IDEA使用14.0.2版本。
1. Eclipse开发环境搭建
1.1. 安装scala插件
安装eclipse-scala-plugin插件,下载地址
解压缩以后把plugins和features复制到eclipse目录,重启eclipse以后即可。
Window -& Open Perspective -& Other&,打开Scala,说明安装成功。
1.2. 创建maven工程
打开File -& New -& Other&,选择Maven Project:
点击Next,输入项目存放路径:
点击Next,选择org.scala-tools.archetypes:
点击Next,输入artifact相关信息:
点击Finish即可。默认创建好的工程目录结构如下:
修改pom.xml文件:
至此,一个默认的scala工程新建完成。
2. Spark开发环境搭建
2.1. 安装scala插件
开发机器使用的IDEA版本为IntelliJ IEDA 14.0.2。为了使IDEA支持scala开发,需要安装scala插件,如图:
插件安装完成后,IntelliJ IDEA会要求重启。
2.2. 创建maven工程
点击Create New Project,在Project SDK选择jdk安装目录(建议开发环境中的jdk版本与Spark集群上的jdk版本保持一致)。点击左侧的Maven,勾选Create from archetype,选择org.scala-tools.archetypes:scala-archetype-simple:
点击Next后,可根据需求自行填写GroupId,ArtifactId和Version(请保证之前已经安装maven)。点击Finish后,maven会自动生成pom.xml和下载依赖包。同1.2章节中eclipse下创建maven工程一样,需要修改pom.xml中scala版本。
至此,IDEA下的一个默认scala工程创建完毕。
3. WordCount示例程序
3.1. 修改pom文件
在pom文件中添加spark和相关依赖包:
&!-- Spark --&
&dependency&
&groupId&org.apache.spark&/groupId&
&artifactId&spark-core_2.10&/artifactId&
&version&1.1.0&/version&
&/dependency&
&!-- Spark Steaming--&
&dependency&
&groupId&org.apache.spark&/groupId&
&artifactId&spark-streaming_2.10&/artifactId&
&version&1.1.0&/version&
&/dependency&
&!-- HDFS --&
&dependency&
&groupId&org.apache.hadoop&/groupId&
&artifactId&hadoop-client&/artifactId&
&version&2.6.0&/version&
&/dependency&
在&build&&/build&中使用maven-assembly-plugin插件,目的是package时把依赖jar也打包。
&artifactId&maven-assembly-plugin&/artifactId&
&version&2.5.5&/version&
&configuration&
&appendAssemblyId&false&/appendAssemblyId&
&descriptorRefs&
&descriptorRef&jar-with-dependencies&/descriptorRef&
&/descriptorRefs&
&manifest&
&mainClass&com.ccb.WordCount&/mainClass&
&/manifest&
&/archive&
&/configuration&
&executions&
&execution&
&id&make-assembly&/id&
&phase&package&/phase&
&goal&assembly&/goal&
&/execution&
&/executions&
3.2. WordCount示例
WordCount用来统计输入文件中所有单词出现的次数,代码参考:
package com.ccb
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.SparkContext._
* 统计输入目录中所有单词出现的总次数
object WordCount {
def main(args: Array[String]) {
val dirIn = "hdfs://192.168.62.129:9000/user/vm/count_in"
val dirOut = "hdfs://192.168.62.129:9000/user/vm/count_out"
val conf = new SparkConf()
val sc = new SparkContext(conf)
val line = sc.textFile(dirIn)
val cnt = line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _) // 文件按空格拆分,统计单词次数
val sortedCnt = cnt.map(x =& (x._2, x._1)).sortByKey(ascending = false).map(x =& (x._2, x._1)) // 按出现次数由高到低排序
sortedCnt.collect().foreach(println) // 控制台输出
sortedCnt.saveAsTextFile(dirOut) // 写入文本文件
3.3. 提交spark执行
使用maven pacakge打包得到sparktest-1.0-SNAPSHOT.jar,并提交到spark集群运行。
执行命令参考:
./spark-submit --name WordCountDemo --class com.ccb.WordCount sparktest-1.0-SNAPSHOT.jar
即可得到统计结果。
安装 2.10.x版本的Scala&
Spark1.0.0部署指南
6.2(64位)下安装Spark0.8.0详细记录
Spark简介及其在Ubuntu下的安装使用
安装Spark集群(在CentOS上)
Hadoop vs Spark性能对比
Spark安装与学习
Spark 并行计算模型
Scala 的详细介绍:Scala 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (02月01日)
& (12/30/:17)
& (02月18日)
& (01月26日)
& (10/07/:25)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 eclipse 配置scala 的文章

 

随机推荐