WordCount程序
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 端口号。