0
点赞
收藏
分享

微信扫一扫

IntelliJ IDEA开发Spark案例之WordCount

624c95384278 2022-02-23 阅读 76



教程目录


  • ​​0x00 教程内容​​
  • ​​0x01 新建Maven项目​​

  • ​​1. 新建Maven项目​​
  • ​​2. 项目配置​​
  • ​​3. 引入项目的依赖​​

  • ​​0x02 编写WordCount代码​​

  • ​​1. 新建包​​
  • ​​2. 编写scala代码​​

  • ​​0x03 本地测试​​

  • ​​1. 统计文件准备​​
  • ​​2. 统计结果​​
  • ​​3. 问题解决​​

  • ​​0x04 打包到集群中执行​​

  • ​​1. 执行代码的修改​​
  • ​​2. 打包相关的修改​​
  • ​​3. HDFS数据准备​​
  • ​​4. 查看执行结果​​

  • ​​0xFF 总结​​


0x00 教程内容


  1. 新建Maven项目
  2. 编写WordCount代码
  3. 校验结果

实验前提:

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​​:

IntelliJ IDEA开发Spark案例之WordCount_maven

d. 引入Scala的SDK

IntelliJ IDEA开发Spark案例之WordCount_大数据_02

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,是建不了的)

IntelliJ IDEA开发Spark案例之WordCount_maven_03

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. 执行,可以看到正确的结果:

IntelliJ IDEA开发Spark案例之WordCount_scala_04

3. 问题解决

在操作的过程中,可能会遇到下面两个报错:

IntelliJ IDEA开发Spark案例之WordCount_maven_05

IntelliJ IDEA开发Spark案例之WordCount_大数据_06

原因是因为Windows本地没有运行环境引起的,此时可以参考教程:​​Windows本地安装Hadoop​​,搞定之后重新执行即可。当然,如果不想在Windows本地执行,我们可以将此项目打包到集群中运行。

0x04 打包到集群中执行

1. 执行代码的修改

a. 教程中,我复制了一份代码出来,类为:WordCount。

b. 因为我们是要打包到集群中执行,所以需要将执行的方式修改掉,此处注释掉 ​​conf.setMaster("local")​​ 这行代码:

IntelliJ IDEA开发Spark案例之WordCount_spark_07

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>

插件解释:


  1. ​maven-compiler-plugin​​ 插件可以指定我们源码的版本和编译后的版本,因为集群中使用的是 JDK8,所以这里写1.8,如果是1.7,需要指定为1.7,不然会报错。
  2. ​scala-maven-plugin​​ 插件是编译、测试、运行Scala代码所需要的,不然Scala代码不会打包进来。goal标签也可以加上:testCompile,指编译测试的代码。

参考教程:​​maven-compiler-plugin说明​​

b. 除了加入插件,我们还可以将 Spark 相关的依赖设置成 ​​provided​​,因为集群上已经有了 Spark 相关的jar包,所以我们是不需要将它们打进我们需要生成的 jar 包的。(这里加上是为了养成好习惯,虽然这里加不加都不影响),然后就可以打包了,直接双击 package 即可:

IntelliJ IDEA开发Spark案例之WordCount_hadoop_08

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 上的统计结果:

IntelliJ IDEA开发Spark案例之WordCount_scala_09

0xFF 总结


  1. 本教程比较简单,实现了Windows本地的WordCount例子,需要学习Scala编程语言
  2. 编写Scala语言,还需要在IDEA里面安装好Scala插件。

作者简介:​​邵奈一​​

全栈工程师、市场洞察者、专栏编辑

| ​​公众号​​ | ​​微信​​ | ​​微博​​ | ​ | ​​简书​​ |

福利:

​​邵奈一的技术博客导航​​

​​邵奈一​​ 原创不易,如转载请标明出处。


举报

相关推荐

0 条评论