概述
本文讲述如何通过flink的scala接口来编写流处理任务。通过本文的描述,就可以通过简介的scala语言编写更加强大的流处理任务了。
环境准备
- IntelliJ IDEA
- scala-2.11
创建一个maven工程
在IDEA中创建一个maven工程,取一个名称:StreamingWordCount。步骤如下:
- 点击IDEA的"Create New Project",在下一个步骤选择"Maven",点击"Next"
- 填写以下的值:
- GoupId: com.Test
- ArtifactID: StreamingWordCount
- Version: 默认值
- 点击:“next”
- 填写
- Project Name: StreamingWordCount
- 选择一个保存工程的路径
- 点击: “finish”
对工程进行配置
修改pom.xml文件
在pom.xml文件中添加以下依赖项:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
添加scala的sdk依赖包
- 点击菜单:“File” -> “Project Structure …”
- 在"Project Settings"菜单中选择"Libraries",并点击中间栏目的"+“号,选择"Scala SDK”,在弹出的对话框中选择"Maven-2.11.8"这个一项,并点击"OK"。
- 回到菜单后,选择"Modules",在右边的"Dependencies"中勾选"scala-sdk-2.11.8"
- 点击“OK”
编写wordcount代码
-
右键点击"src->main->java",选择"New->Scala Class",选择"Object",填写类名:StreamingWordCount
-
编写代码
把以下代码复制到该scala文件中:
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
object StreamingWordCount {
def main(args: Array[String]) {
println("start word count")
val env = StreamExecutionEnvironment.getExecutionEnvironment
val text = env.socketTextStream("localhost", 9999)
val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
.map { (_, 1) }
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1)
counts.print()
println("end word count")
env.execute("Window Stream WordCount")
println("exit now!")
}
}
- 注意:若还有错误,可以IDEA在下面弹出的:“auto import”,就能纠正错误。
编译和打包
打包配置
- 点击菜单:“File” -> “Project Structure …”
- 在"Project Settings"菜单中选择"Artifacts",并点击中间栏目的"+“号,选择"JAR->From modules with dependencies…”"
- 在弹出的菜单中,点击“…”,选主类:StreamingWordCount
- 其他使用默认配置,点击"OK",回到"Artfacts"的面板。
- 我们不需要把依赖的scala的包都打进来,所以,要在最右边的"Output Layout"标签页减去依赖包,也就是减去以下两项:
Extracted 'scala-library-2.11.8.jar' ...
Extracted 'scala-reflect-2.11.8.jar' ...
- 点击"OK"
开始打包
- 依次点击菜单: “Build-> Build Artifacts”
- 选择刚才我们定义的打包名称,并点击箭头,选择"Action-> Build"
若没有任何错误,我们的包就打好了,此时就可以放到flink上去运行了。
在工程的out目录下,会有一个打好的jar包,目录如下:
StreamingWordCount/out/artifacts/StreamingWordCount_jar/StreamingWordCount.jar
把任务提交到flink
安装flink集群,并启动
按这篇文章安装好flink,并启动。
注意,我这里运行的是单机环境。
启动服务端口
在运行flink的机器上,开启一个新的终端,并输入命令:
$ nc -lk 9999
提交并运行流计算任务
把StreamingWordCount.jar包复制到运行flink机器的/home/ubuntu/taskpath/目录下:
$ ./bin/flink run /home/ubuntu/taskpath/StreamingWordCount.jar
- 在nc -lk 9999 的终端中输入一下文字:
this is a test
test is ok
- 查看计算结果
在flink的log目录下,查看输出:
cd log
$ cat flink-*-taskexecutor-1-*.out
(this : 1)
(ok : 1)
(test : 2)
(a : 1)
(is : 2)
说明,任务已经执行了。但注意:这个程序的时间窗口是5秒,也就是说每5秒统计一次流中的数据,对单词进行计数。
可以看出,该程序比storm的简介很多,通过flink提供的算子,写起来方便很多。
总结
本文描述了编写flink流计算任务的全过程。通过本文的学习和实践,就可以编写更加复杂的流处理程序。