flink实战—编写流处理任务:入门

概述

本文讲述如何通过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文件中添加以下依赖项:

    
    
        org.apache.flink
        flink-scala_2.11
        1.7.1
        provided
    
    
        org.apache.flink
        flink-streaming-scala_2.11
        1.7.1
        provided
    
    

添加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流计算任务的全过程。通过本文的学习和实践,就可以编写更加复杂的流处理程序。

你可能感兴趣的:(flink,flink实战)