在Eclipse中用scala语言写spark程序,需要安装scala,还需要在Eclipse中安装scala插件,便于新建scala project,scala object等,spark程序写完了还需要打包,普通的工程无法通过export方式打包,需要新建maven project.这里还需要让eclipse支持scala的maven工程。工程建立了就剩下编码和打包,打包需要借助maven-assembly-plugin。
这里介绍如何一步一步编写一个spark程序。
1、安装scala插件,这里不做过多的说明。
Help->Install New Software,拷贝http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site到Work with输入框中,一步一步安装。
2、安装maven-for-scala,让eclipse能够新建scala的maven工程。
同第一步安装插件一样,拷贝 http://alchim31.free.fr/m2e-scala/update-site/这个url到Work with输入框中,安装。
3、构建一个scala的maven工程
如果maven工程类型中没有scala-archetype-simple的项目,就在Window->Preferences->Maven->Archetypes增加一个Remote Catalog。
url:http://repo.maven.apache.org/maven2/archetype-catalog.xml
description:Remote Catalog
4、编辑pom.xml文件,这里是重点,spark依赖的jar包,然后就是最后构建时需要的插件。
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.1.0</spark.version>
<hadoop.version>2.6.0</hadoop.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>
这里指定scala的版本2.11.8,spark版本是2.1.0(spark2.1.0需要的scala是2.11+版本,所以这里选择scala2.11.8),hadoop版本是2.6.0。
按照官网的要求,编码spark需要引入spark-core,hadoop-client两个依赖,以及他们本身的依赖。
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.specs</groupId>
<artifactId>specs</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
这样编码不会出现编译问题。
重点的构建jar包插件在这里。
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-make:transitive</arg>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<useFile>false</useFile>
<disableXmlReport>true</disableXmlReport>
<!-- If you have classpath issue like NoDefClassError,... -->
<!-- useManifestOnlyJar>false</useManifestOnlyJar -->
<includes>
<include>**/*Test.*</include>
<include>**/*Suite.*</include>
</includes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
构建打包就需要最后的maven-assembly-plugin,这里可以将写得代码和依赖包都打入jar包,也可以生成一个只带代码的jar包。
5、编码WordCount.scala
package com.xxx.spark2
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
object WordCount {
def main(args: Array[String]): Unit = {
val inputFile = "/root/helloSpark.txt"
val conf = new SparkConf().setAppName("wordcount").setMaster("local[2]")
val sc = new SparkContext(conf)
val textFile = sc.textFile(inputFile)
val wordcount = textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey((a,b)=>(a+b))
wordcount.foreach(println)
}
}
代码大致意思:1、设置spark配置,给程序取名,并设置master为本地模式。
2、根据spark配置构建spark上下文环境。
3、读取一个指定文件。
4、将文件按空格分割,map阶段将每一个单词记录1次键值对为(word,1),reduce阶段将同一个单词累加,计算单词频率。
5、循环打印词频统计结果。
6、构建打包,选中项目,右键,Run As ->Maven build,在弹出的编译选项框中的Goals中写上:assembly:assembly,然后点击Run。等待构建完成。
构建成功:
成功之后生成的jar包在target目录下:
7、部署运行,这里就是向运行着的spark集群中提交作业,让spark来运行我们的程序,统计词频。
部署需要先启动master,再启动worker,最后才是提交作业。
准备文本:
启动master
./sbin/start-master.sh
启动worker
./bin/spark-class org.apache.spark.deploy.worker.Worker spark://server:7077
执行以上语句截图:
提交任务:
./bin/spark-submit --master spark://server:7077 --class "com.xxx.spark2.WordCount" /home/ApacheHadoop/spark-2.1.0/spark2-0.0.1-SNAPSHOT.jar
运行结果如图: