流处理实现WordCount

这篇文章介绍了如何使用ApacheFlink的ScalaAPI,通过socket接收文本流,对输入数据进行单词分割、过滤空字符串、计数,并展示了一个简单的实时单词计数流处理程序的实现过程。
摘要由CSDN通过智能技术生成

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

object ffff {

      def main(args: Array[String]): Unit = {

    //创建执行环境

    val env = StreamExecutionEnvironment.getExecutionEnvironment

    //接受socket文本流

    val inputdatastream = env.socketTextStream(hostname = "bigdata1",port = 7777)

    //对数据进行转换处理

    val resultdatastream = inputdatastream

      .flatMap(_.split(" "))

      .filter(_.nonEmpty)

      .map((_,1))//.setParallelism(2)

      .keyBy(0)

      .sum(1)

    //打印输出

    resultdatastream.print()

    //触发程序,启动任务执行程序

    env.execute()

  }

}

注意:在运行的代码前,在终端输入:

nc -lk 7777

如果报 -bash:nc:command not found

可以使用yum安装,安装完成再输入 nc -lk 7777

终端输入

idea输出

  1. val resultdatastream = inputdatastream: 定义了一个新的 DataStream 变量 resultdatastream,并将其初始化为 inputdatastream。inputdatastream 是一个已经存在的 Flink DataStream。

  2. .flatMap(_.split(" ")): 使用 flatMap 操作符对 inputdatastream 中的每个元素应用一个函数,该函数通过空格(" ")分割元素(假设元素是字符串),然后返回分割后的单词的迭代器。这会将所有的单词平坦化成一个连续的单词流。

  3. .filter(_.nonEmpty): 使用 filter 操作符过滤掉上一步中产生的所有空字符串。只有非空字符串才会被保留在数据流中。

  4. .map((_,1)): 使用 map 操作符将每个非空字符串映射为一个元组,该元组的第一个元素是字符串本身,第二个元素是数字 1。这通常是为了进行后续的聚合操作,比如计算每个单词的出现次数。

    注意:这里原本有一行注释掉的代码 //.setParallelism(2),如果取消注释,它会设置该 DataStream 的并行度为 2,意味着 Flink 会尝试在两个并行任务上处理这个数据流。但是,由于它被注释掉了,所以不会影响当前的数据流。

  5. .keyBy(0): 使用 keyBy 操作符根据元组的第一个元素(即单词)对流进行逻辑分区,以确保所有相同的单词都进入同一个分区,从而可以在后续操作中进行聚合。

  6. .sum(1): 使用 sum 操作符对每个单词的所有数字 1 进行求和,从而计算出每个单词的出现次数。

最终,resultdatastream 会是一个新的 DataStream,其中包含元组 (word, count),其中 word 是输入流中的单词,count 是该单词在输入流中的出现次数。注意,这段代码是一个流处理应用程序的一部分,它需要嵌入在一个更大的 Flink 应用程序中才能运行。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值