使用Flink-批处理和流处理分别实现WordCount

1,712 阅读1分钟

Flink作为一个非常优秀的大数据实时计算框架,在很多从事大数据开发的公司都是必备的技能,接下来我将通过Flink以批处理和流处理这两种方式来实现入门案例WordCount

一、开发环境准备

  • scala-sdk-2.12
  • jdk-1.8.0_201
  • idea安装Scala插件

二、Idea创建maven项目

跟创建普通的maven项目一样,最终创建的maven项目结构如下:

说明:

  • data : 存放模拟的数据源文件
  • src/main/scala:存放主要代码
  • pom.xml:依赖的pom依赖

三、批处理实现

1、首先在data下面创建需要使用的源文件,然后在里面写一些单词,我模拟的数据源如下:

2、编写代码

package batch.wc

import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment}
import org.apache.flink.api.scala._

/**
 * @Author: zxb
 * @Date : 2020/12/21 10:32 下午
 */
object WordCount {
  def main(args: Array[String]): Unit = {
    val env = ExecutionEnvironment.getExecutionEnvironment
    val inputDS: DataSet[String] = env.readTextFile("data/wc/wordcount.txt")
    val wordCountDS = inputDS.flatMap(_.split(" ")).map((_, 1)).groupBy(0).sum(1)
    wordCountDS.print()
  }
}

3、打印结果:

四、流处理实现

1、终端执行 nc -lk 7777模拟数据源实时输入

2、编写代码:

package streaming.wc

import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
import org.apache.flink.streaming.api.scala._

/**
 * @Author: zxb
 * @Date : 2020/12/21 10:57 下午
 */
object StreamWordCount {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val inputDataStream: DataStream[String] = env.socketTextStream("localhost", 7777)
    val wordCountStream: DataStream[(String, Int)] = inputDataStream.flatMap(_.split(" "))
      .filter(_.nonEmpty)
      .map((_, 1))
      .keyBy(0)
      .sum(1)
    wordCountStream.print()
    env.execute("stream word count")
  }
}

3、输出结果: