使用scala实现批处理和流处理的wordcount示例
编写scala版本批处理wordcount
1.新建maven项目
2.导入pom坐标
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.10_2.11</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table_2.10</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.10</artifactId>
<version>1.3.2</version>
</dependency>
3.编写scala版本批处理wordcount代码
package com.qcj.wc_demo
import org.apache.flink.api.scala._
/**
* 简单的批处理word count例子
*/
object WordCount {
def main(args: Array[String]) {
//批处理程序,需要创建ExecutionEnvironment
val env = ExecutionEnvironment.getExecutionEnvironment
//fromElements(elements:_*) --- 从一个给定的对象序列中创建一个数据流,所有的对象必须是相同类型的。
val text = env.fromElements(
"Who's there?",
"I think I hear them. Stand, ho! Who's there?","hah")
val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
.map { (_, 1) }
.groupBy(0)//根据第一个元素分组
.sum(1)
//打印
counts.print()
}
}
4.运行结果
编写scala版本流处理wordcount
1.安装nc
a.下载netcat。下载地址这里
b.解压压缩包到指定路径下
c.配置path环境变量
我的path变量:
E:\software\netcat-1.11
d.打开命令界面:Windows+R cmd。输入nc 命令即可.
2.编写scala版本流处理wordcount
package com.qcj.wc_demo
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
/**
* 实时接收word count例子
*
* 运行准备
* 1.windows上安装netcat,下载解压,配置路径path就行了:
* 参考博客: https://blog.csdn.net/qq_37585545/article/details/82250984
* 2.运行前先cmd启动nc:就可以输入数据了
* nc -lL -p 9999
* 3.之后运行此程序,记住要先启动nc.后运行程序,不然会报错
*/
object WordCount2 {
def main(args: Array[String]) {
/*
在Flink程序中首先需要创建一个StreamExecutionEnvironment
(如果你在编写的是批处理程序,需要创建ExecutionEnvironment),它被用来设置运行参数。
当从外部系统读取数据的时候,它也被用来创建源(sources)。
*/
val env = StreamExecutionEnvironment.getExecutionEnvironment
val text = env.socketTextStream("localhost", 9999)
val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }//nonEmpty非空的
.map { (_, 1) }
.keyBy(0)//通过Tuple的第一个元素进行分组
.timeWindow(Time.seconds(5))//Windows 根据某些特性将每个key的数据进行分组 (例如:在5秒内到达的数据).
.sum(1)
//将结果流在终端输出
counts.print
//开始执行计算
env.execute("Window Stream WordCount")
}
}
3.cmd窗口运行nc
输入命令:nc -lL -p 9999 回车等待启动程序
4.运行程序,输入测试数据