flink笔记1 使用Scala实现WordCount程序(批处理和流处理)

WordCount程序

 

1.批处理(DataSet API)实现

1.1代码讲解

1.2附完整代码

2.流处理实现

2.1代码讲解

2.2附完整代码


1.批处理(DataSet API)实现

1.1代码讲解

1.创建执行环境(Obtain an execution environment)

val env = ExecutionEnvironment.getExecutionEnvironment

创建一个批处理的执行环境(根据环境判断是本地环境还是集群环境,来创建运行环境),主要注意引用的包应该是org.apache.flink.api.scala.ExecutionEnvironment

2.加载/创建初始数据(Load/create the initial data)

val inputPath = "D:\\IdeaProjects\\Flink_example\\src\\main\\resources\\word.txt"
val inputDataSet = env.readTextFile(inputPath)

readTextFile(path):逐行读取文本文件,即遵守文本输入格式规范的文件,并将它们作为字符串返回。

3.数据进行指定转换(Specify transformations on this data)

Flink具有特殊类DataStream与DataSet,这两者是flink中主要的数据源,根据数据源可分为有界源和无界源,而DataStream则是无界源,DataSet是有界源,也就是说DataStream常用于流处理,而DataSet用于批处理。

flatMap:将句子拆分成单词。flatmap是一个可迭代的方法,什么类型调用该方法,返回也是什么类型。输入一个数据,返回零个、一个、多个数据,中间可做相关处理

map:用来做转换处理的。map方法不允许缺少数据,也就是原来多少条数据,处理后依然是多少条数据,只是用来做转换。

groupby:用来将数据分组

4.指定将计算结果位置(Specify where to put the results of your computations)

resultDataSet.print()

print() :打印标准输出/标准错误流中每个元素的toString()值

1.2附完整代码

import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.api.scala._
//上一行或者是import org.apache.flink.api.scala.createTypeInformation

object WordCount {
  def main(args: Array[String]): Unit = {
    //创建执行环境
    val env = ExecutionEnvironment.getExecutionEnvironment
    //从文件中读取数据
    val inputPath = "D:\\IdeaProjects\\Flink_example\\src\\main\\resources\\word.txt"
    val inputDataSet = env.readTextFile(inputPath)
    //对数据进行转换处理统计,先分词,再将word进行分组,最后进行聚合统计
    val resultDataSet = inputDataSet
      .flatMap(_.split(" "))
      .map((_,1))
      .groupBy(0)
      .sum(1)
    //打印输出
    resultDataSet.print()
  }
}

2.流处理实现

2.1代码讲解

1.创建执行环境(Obtain an execution environment)

val env = StreamExecutionEnvironment.getExecutionEnvironment

StreamExecutionEnvironment是所有Flink程序的基础。StreamExecutionEnvironment调用静态方法getExecutionEnvironment(),得到一个执行环境,用于执行我们的程序。

getExecutionEnvironment创建执行环境时,如果程序是独立调用的,则此方法返回本地执行环境;如果命令行客户端调用程序以提交到集群,则此方法返回此集群的执行环境。也就是说,getExecutionEnvironment会根据查询运行的方式决定返回什么样的运行环境,是最常用的一种创建执行环境的方式。

也可以使用createLocalEnvironment创建本地执行环境,使用createRemoteEnvironment创建集群执行环境。

2.加载/创建初始数据(Load/create the initial data)

数据流最常用的数据结构就是DataStream,DataStream由多个相同的元素组成,每个元素是一个单独的事件。Scala使用泛型DataStream[T]来定义这种关系,T是这个数据流中每个元素对应的数据类型。

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

环境使用套接字连接数据源 。socketTextStream 从套接字读取,元素可以用分隔符分隔。

3.数据进行指定转换(Specify transformations on this data)

filter:用于筛选数据流中的事件。为每个元素计算一个布尔函数,并保留那些该函数返回真的元素。

keyby:在逻辑上将一个流划分成不相交的分区,每个分区包含相同关键字的元素,这个转换返回KeyedStream类型。

4.指定将计算结果位置(Specify where to put the results of your computations)

resultDataSet.print()

print() :打印标准输出/标准错误流中每个元素的toString()值

5.触发程序执行(Trigger the program execution)

env.execute()

execute:内部调用抽象方法execute,启动任务执行。若无,则直接运行结束任务。

2.2附完整代码

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

object StreamWordCount {

  def main(args: Array[String]): Unit = {
    //创建执行环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    //接受socket文本流
    val inputdatastream = env.socketTextStream(hostname = "localhost",port = 7777)
    //对数据进行转换处理
    val resultdatastream = inputdatastream
      .flatMap(_.split(" "))
      .filter(_.nonEmpty)
      .map((_,1))//.setParallelism(2)
      .keyBy(0)
      .sum(1)
    //打印输出
    resultdatastream.print()
    //触发程序,启动任务执行程序
    env.execute()
  }
}

注:运行该流处理程序前,必须先从终端(win+r cmd enter)用netcat启动输入流:nc -lp 端口号。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值