0x00 教程内容
- 新建Maven项目
- 编写WordCount代码
- 校验结果
实验前提:
a. 安装好了windows本地的Scala,直接解压安装包也行
b. 安装好了IDEA的scala插件,教程:IntelliJ IDEA编写Scala代码(安装Scala插件)
c. 安装好了JDK与Maven,直接使用IDEA内置的Maven也可以
0x01 新建Maven项目
1. 新建Maven项目
a. 新建一个Maven项目,选择好JDK,然后其他的默认或者自己决定
2. 项目配置
a. 设置编写scala代码的文件夹
打开src/main,建一个scala文件夹(与java同级)
b. 标记scala文件夹为资源文件夹
右击scala文件夹,选择Mark Directory as,选择第一个Sources Root,然后文件夹变成了蓝色。
c. 将Language level改为8(我使用的JDK为8,所以为8,如果是7则用7)
点击IDEA右上角放大镜左边的按钮(Project Structure),或者快捷键ctrl + shift + alt + S,点击Modules:
d. 引入Scala的SDK
3. 引入项目的依赖
a. 在pom.xml文件中添加依赖并Reimport
一下:
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.2.0</version> </dependency> </dependencies>
0x02 编写WordCount代码
1. 新建包
a. 在scala
文件夹建com.shaonaiyi
包
2. 编写scala代码
a. 右击包名,选择New一个Scala Class(如果没有引入Scala的SDK,是建不了的)
b. 完整代码:
package com.shaonaiyi import org.apache.spark.{SparkConf, SparkContext} /** * @Auther: 邵奈一 * @Date: 2019/03/28 下午 3:16 * @Description: IntelliJ IDEA开发Spark案例之WordCount */ object WordCountLocal { def main(args: Array[String]): Unit = { val conf = new SparkConf() conf.setAppName("WordCountLocal") conf.setMaster("local") val sparkContext = new SparkContext(conf) val textFileRDD = sparkContext.textFile("src/main/resources/word.txt") val wordRDD = textFileRDD.flatMap(line => line.split(" ")) val pairWordRDD = wordRDD.map(word => (word, 1)) val wordCountRDD = pairWordRDD.reduceByKey((a, b) => a + b) wordCountRDD.saveAsTextFile("src/main/resources/wordcount") } }
0x03 本地测试
1. 统计文件准备
a. 新建word.txt文件放于src/main/resources/路径下
shao shao shao
nai yi yi nai
hello hello hi
b. 根据文本内容,如果没有错误的话,结果应该是:
shao=>3次,
nai=>2次,
yi=>2次,
hello=>3次,
hi=>1次,
2. 统计结果
a. 执行,可以看到正确的结果:
3. 问题解决
在操作的过程中,可能会遇到下面两个报错:
原因是因为Windows本地没有运行环境引起的,此时可以参考教程:Windows本地安装Hadoop,搞定之后重新执行即可。当然,如果不想在Windows本地执行,我们可以将此项目打包到集群中运行。
0x04 打包到集群中执行
1. 执行代码的修改
a. 教程中,我复制了一份代码出来,类为:WordCount。
b. 因为我们是要打包到集群中执行,所以需要将执行的方式修改掉,此处注释掉 conf.setMaster("local")
这行代码:
c. 输入输出路径设置成了以参数的方式传进来,所以修改原本的两句代码为:
... val textFileRDD = sparkContext.textFile(args(0)) ... wordCountRDD.saveAsTextFile(args(1))
2. 打包相关的修改
a. 添加Maven编译的插件和打包Scala代码的插件,添加在</project>
标签里,根据实际情况,要放对位置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <testExcludes> <testExclude>/src/test/**</testExclude> </testExcludes> <encoding>utf-8</encoding> </configuration> </plugin> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.1.6</version> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
插件解释:
maven-compiler-plugin 插件可以指定我们源码的版本和编译后的版本,因为集群中使用的是 JDK8,所以这里写1.8,如果是1.7,需要指定为1.7,不然会报错。
scala-maven-plugin 插件是编译、测试、运行Scala代码所需要的,不然Scala代码不会打包进来。goal标签也可以加上:testCompile,指编译测试的代码。
参考教程:maven-compiler-plugin说明
b. 除了加入插件,我们还可以将 Spark 相关的依赖设置成 provided,因为集群上已经有了 Spark 相关的jar包,所以我们是不需要将它们打进我们需要生成的 jar 包的。(这里加上是为了养成好习惯,虽然这里加不加都不影响),然后就可以打包了,直接双击 package 即可:
3. HDFS数据准备
a. 如果是想要测试服务器本地的文件,需要将文件放到所有机器节点上去。
比如可以这样执行:
spark-submit \ --master spark://master:7077 \ --class com.shaonaiyi.WordCount \ ~/jar/spark-wordcount-1.0-SNAPSHOT.jar \ ~/datas/word.txt \ ~/wc
说明:\
表示换行的意思,注意\
右边不能有空格。如果需要重新跑的话,需要将所有机器节点的输出路径都删除。
b. 此处演示统计 HDFS 上的数据,并且统计结果也是存放到 HDFS ,比如现在我的数据在 HDFS上是 /files/put.txt
,内容为:
shao nai yi nai nai yi yi shao nai nai
c. 执行:
spark-submit \ --master spark://master:7077 \ --class com.shaonaiyi.WordCount \ ~/jar/spark-wordcount-1.0-SNAPSHOT.jar \ hdfs://master:9999/files/put.txt \ hdfs://master:9999/wc
注意:hdfs://master:9999 为 HDFS 的 core-site.xml 文件中配置的端口。
4. 查看执行结果
a. 执行后可以查看到 HDFS 上的统计结果:
0xFF 总结
- 本教程比较简单,实现了Windows本地的WordCount例子,需要学习Scala编程语言
- 编写Scala语言,还需要在IDEA里面安装好Scala插件。