除了上个操作生成的mainStream, 我们也可以在操作里生产任意数量的侧输出流. 每个侧输出流里的类型也不用和主流一样.
每个侧输出流需要定一个OutputTag
来标识.
提交数据给侧输出流可以通过很多function(operator), 输出到Context 里面
ProcessFunction
KeyedProcessFunction
CoProcessFunction
KeyedCoProcessFunction
ProcessWindowFunction
ProcessAllWindowFunction
// 使用
ctx.output(outputTag, val);
用的时候可以从主流里面拿: mainDataStream.getSideOutput(outputTag);
所有的Flink应用都需要依赖外部的配置参数, 用来指定Source和sink的地址信息, 系统并行度, 运行时参数, 还有其他乱七八糟的参数.
Flink给我们提供了简单基本的参数工具ParameterTool.clas
, 不一定要直接用这个tool, 其他框架的也适用.
tool里存储的是kv map. 可以从文件, 地址, 流里面, 从命令行里, 从系统参数里拿到配置, 用, 就像map用就好了.
ParameterTool parameter = ParameterTool.fromPropertiesFile(propertiesFile);
ParameterTool parameter = ParameterTool.fromArgs(args);
ParameterTool parameter = ParameterTool.fromSystemProperties();
env.getConfig().setGlobalJobParameters(parameters);
, 到时候也从env里拿就好了.
Flinke提供了集成的测试工具.
将预先分区过的stream转义成KeyedStream, 来避免shuffling. 前提是, 重新转义的流必须是按照明确的规则预先分区好的, 就像keyBy();
应用场景可以 放在两个job之间做materialized(固定) shuffle. 第一个job执行keyBy的shuffle 然后固化每个output到一个partition里, 第二个job从里面取, 每个并行度的实例去取对应的一个.
emmmm…
为了让公共的JavaAPI和ScalaAPI一致, 一些各自更好的处理的实现从标准API里单独出来了.
Scala扩展API使用了隐式转换实现了扩展. 下面是一些api列表.
Java引入了Lambda表达式. 这里的举例就是普通的使用了一下lambda
每个Flink应用都依赖一堆的FlinkLibraries, 下面就介绍Flink应用一般都使用什么lib
用户应用一般有两个大类的依赖:
flink-dist.jar
, 有点像JDK的rt.jar之类的.application.jar
.每个应用都至少需要core. flink-streaming-java_2.11
, scope是provided/
如果不设置成provided, 那么轻则jar变大, 重则版本冲突.
Adding Connector and Library Dependencies
Scala Versions
Hadoop Dependencies
Maven Quickstart