下面是用scala语言在单机Spark环境下进行单词计数的搭建和运行过程。
文章目录
1. IDEA创建scala项目
1.1 安装scala插件
1.2 新建scala的maven项目
我用的scala版本是2.12.13(Spark 3.1.1需要和Scala 2.12.x一起用),需要修改pom.xml中的如下位置:
<properties>
<scala.version>2.12.13</scala.version>
</properties>
注意最好添加下面两个依赖,以免后面的插件安装时报错:
<!-- 下面两个依赖是为了解决后面插件报错而添加的 -->
<dependency>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.11</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.5.1</version>
</dependency>
还需要修改IDEA中这个设置,File | Settings | Build, Execution, Deployment | Compiler | Scala Compiler
,将1.5改成1.8
我们运行下helloworld程序:
/**
* Hello world!
*
*/
object App {
def main(args: Array[String]): Unit = {
println( "Hello World!" )
}
}
至此,项目搭建完成
2. Spark单词计数
2.1 Spark依赖
根据自己的Spark版本进行选择
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.1</version>
</dependency>
2.2 测试日志
模拟处理日志的场景,将单词计数提升了一下处理复杂度
2021-01-01 01:30:45 INFO JAVA|PYTHON|C++
2021-01-01 01:30:45 INFO JAVA|PYTHON|SCALA
2021-01-01 01:30:45 INFO JAVA|GO|C++
2021-01-01 01:30:45 INFO JAVA|JAVASCRIPT|C++
2021-01-02 01:30:45 ERROR NOTHING
2021-01-02 01:30:45 INFO JAVA|PHP|C++
2021-01-02 01:30:45 INFO JAVA|PYTHON|C++
2021-01-02 01:30:45 INFO JAVA|PYTHON|SCALA
2021-01-03 01:30:45 INFO JAVA|GO|C++
2021-01-03 01:30:45 WARN JAVA|JAVASCRIPT|C++
2021-01-03 01:30:45 ERROR NOTHING
2021-01-03 01:30:45 INFO JAVA|PHP|C++
2.3 处理代码
package ace.gjh.rdd
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* Spark单词计数demo
*
* @author ACE_GJH
* @date 2021/5/5
*/
object WordCount {
def main(args: Array[String]): Unit = {
// 1. 创建Spark运行环境配置
val conf = new SparkConf()
.setAppName("word-count")
// 单机模式本机运行
.setMaster("local[*]")
// 2. 创建SparkContext
val context = new SparkContext(conf)
// 3. 生成RDD
val rdd: RDD[String] = context.textFile("file:///E:/spark/test.log", 2)
// 4. 数据处理
// 4.1 消息过滤
rdd.filter(log => "INFO".equals(log.split(" ")(2)))
// 4.2 数字计数
.flatMap(_.split(" ")(3).split("\\|"))
.map((_, 1))
.groupByKey()
.map(t => (t._1, t._2.size))
.sortBy(t => t._2, false, 1)
.saveAsTextFile("file:///E:/spark/result.log")
// 5. 释放资源
context.stop()
}
}
2.4 查看结果
查看part-00000
文件
(JAVA,9)
(C++,7)
(PYTHON,4)
(GO,2)
(SCALA,2)
(PHP,2)
(JAVASCRIPT,1)