flink 之DataStream API编程

本文详细介绍了Apache Flink中的DataStream程序,包括获取执行环境、创建数据源、执行计算处理、设置输出Sink以及程序执行的基本步骤。示例展示了如何从文件读取数据并进行单词统计,最后将结果写入文件或输出到终端。Flink支持多种数据源和丰富的算子,适用于分布式流处理环境。
摘要由CSDN通过智能技术生成

DataStream程序是Flink中基于数据流实现计算的普通程序(例如过滤,更新状态,定义窗口,聚合等)。数据流来源于各种源(比如 消息队列,socket,文件等)。计算结果通过Sink进行输出,可以写入文件或者终端标准输出等。Flink程序可以运行在多种上下文环境中,比如独立运行或者嵌入其他程序中。可以在本地的JVM中运行,也可以在集群中多个机器上运行。

https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/datastream_api.html

一、DataStreams程序基本步骤

  1. 获取一个执行环境 execution environment
  2. 加载 / 创建 一个数据源 data source
  3. 对于数据源的处理计算 transformations
  4. 对计算结果的输出 sink
  5. 触发程序的执行

1.1 通过StreamExecutionEnvironment 类的静态方法获取执行环境

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

1.2 创建一个数据源

这里使用从文件中获取,flink支持多源(从文件中,从网络中,从各种中间件中【Kafka、redis等】)

DataStream<String> text = env.readTextFile("file:///path/to/file");

1.3 对数据流进行计算处理

这里以单词统计为例,将输入的text进行flatmap

 DataStream<Tuple2<String, Integer>> counts =
                // split up the lines in pairs (2-tuples) containing: (word,1)
                text.flatMap(new Tokenizer())
                        // group by the tuple field "0" and sum up tuple field "1"
                        .keyBy(value -> value.f0)
                        .sum(1);

1.4 结果输出

//写入文件
counts.writeAsText("file:///path/to/file");
        
//或者直接输出终端
//counts.print();

1.5 触发执行

正常情况,到这里代码是没有执行的,需要触发执行。

env.execute("Streaming WordCount");

二、简介

2.1 执行环境

StreamExecutionEnvironment 类是所有Flink程序的基础,可以通过StreamExecutionEnvironment 类的以下静态方法获取执行环境。

getExecutionEnvironment()

createLocalEnvironment()

createRemoteEnvironment(String host, int port, String ... jarFiles)

通常,我们只需要使用getExecutionEnvironment(), 此函数会自动根据当前环境上下文进行获取正确的执行环境。

           当使用IDE或者作为一个Java程序执行时,将创建一个本地的执行环境(createLocalEnvironment())。

2.2 数据源

数据源是指flink程序获取数据的地方,可以通过以下方式添加数据源

StreamExecutionEnvironment.addSource(sourceFunction)

flink支持丰富的数据源,并且也预先实现了一些数据源函数。

可以自己实现数据源函数,串行数据源实现 SourceFunction

                                          并行数据源实现RichParallelSourceFunction接口

如下是一些已经实现的数据源函数

  • 基于文件
readTextFile(path)

readFile(fileInputFormat, path)

readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)

  • 基于网络
socketTextStream()
  • 基于集合
fromCollection(Collection)

fromCollection(Iterator, Class)

fromElemets(T ...)

fromParalleCollection(SplittableIterator, Class)

generateSequence(from, to)
  • 用户自定义

2.3 算子

通过一系列的算子转换操作,将一个或多个流转换为另外的一个或多个流。

flink有丰富的内置算子函数,比如Map, FlatMap, Filter, KeyBy, Reduce, Aggregations, Window等等。

2.4 输出Sink

和数据源类似,一个是输入,一个是输出。输出可以输出到文件,socket, 外部系统,或者直接打印到终端等。

flink内置了一些输出函数如下

  • 基于文件
writeAsText()

writeAsCsv()

print()

printToErr()

writeUsingOutputFormat()
  • 基于网络
writeToSocket()
  • 自定义
addSink()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值