一、代码实现
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()方法,否则会出现异常