Flink学习:从wordCount开始

一、代码实现

package com.geekbang.bigdata.hotitems_analysis

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

object wordCount {
  def main(args: Array[String]): Unit = {
    //创建执行环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //读取数据源,文件自行准备
    val text = env.readTextFile("D:///data/word.txt")
    //对数据集进行转换操作
    val count:DataStream[(String,Int)] = text.flatMap(line => line.toLowerCase.split(" "))
      .filter(word => word.nonEmpty)
      .map((_,1))
      .keyBy(0)
      .sum(1)
    
    count.print()

    env.execute("Streaming WordCount")

  }
}

二、代码讲解

1、Execution Environment
第一步就是获取相应的执行环境,执行环境决定了程序执行在什么环境(例如本地运行环境或者集群运行环境)中。同时不同的运行环境决定了应用的类型,批量处理作业和流式处理作业分别使用的是不同环境,StreamExecutionEnvironment是用来做流式数据处理环境;ExecutionEnvironment是批量数据处理环境,可以用三种方式获取Execution Environment,例如StreamExecution-Environment

//设定Flink运行环境,如果在本地启动则创建本地环境,如果集群上启动,则创建集群环境
StreamExecutionEnvironment.getExecutionEnvironment
//指定并行度并创建本地执行环境
StreamExecutionEnvironment.createLocalEnvironment(5)
//设定远程JobManagerIp和RPC端口以及运行程序所在Jar包及其依赖包
StreamExecutionEnvironment.createRemoteEnvironment("JobManagerHost",9999,5,"/user/application.jar")
//第三种方式可以直接从本地代码中创建与远程集群的Flink JobManager的RPC连接,通过指定应用程序所在的jar包,将运行程序远程拷贝到JobManager节点上,然后将Flink应用程序运行在远程的环境中,本地程序相当于一个客户端

开发批量应用只需把StreamExecutionEnvironment替换成ExecutionEnvironment即可

//设定Flink运行环境,如果在本地启动则创建本地环境,如果集群上启动,则创建集群环境
ExecutionEnvironment.getExecutionEnvironment
//指定并行度并创建本地执行环境
ExecutionEnvironment.createLocalEnvironment(5)
//设定远程JobManagerIp和RPC端口以及运行程序所在Jar包及其依赖包
ExecutionEnvironment.createRemoteEnvironment("JobManagerHost",9999,5,"/user/application.jar")

2、初始化
读取数据源并转化成DataStream

val text:DataStream[String] = env.readTextFile("文件路径")

3、执行转换操作
其间就是一些算子的使用,如map、flatmap等,
4、分区key指定
1)、按照字段位置指定

val result = dafaStream.keyBy(0).sum(1)

keyBy后跟的0表示按照字段位置索引0划分分区,sum后跟的1表示按照字段位置索引1进行求和
2)、按照字段名称指定,如果数据结构类型为tuple或者pojos类型,可以使用name来指定分区规则

val personDataSet = env.fromElements(new Presion("Alex",18),new Persion("Peter",43))
personDataSet.groupBy("name").max(1)

5、输出结果

//将数据输出到文件中
counts.writeAsText("file://path/savefile")
//将数据打印到控制台
counts.print()

6、程序触发
所有的计算逻辑全部操作定义好了之后,需要调用ExecutionEnvironment.execute()方法来触发应用程序的执行,需要注意的是,DataStream流式应用需要显性调用execute()方法运行程序,但对于DataSet算子如果已经包含对execute()方法的调用,则不需要调用execute()方法,否则会出现异常

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱夜来香A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值