下沉到目的地后的流程元素

Posted

技术标签:

【中文标题】下沉到目的地后的流程元素【英文标题】:Process elements after sinking to Destination 【发布时间】:2019-01-08 15:14:38 【问题描述】:

我正在设置一个从 Kafka 读取并下沉到 HDFS 的 flink 管道。我想在 addSink() 步骤之后处理元素。这是因为我想设置触发文件,指示某个分区/小时的数据写入(到接收器)已完成。如何做到这一点?目前我正在使用 Bucketing 接收器。

    数据流消息流 = 环境 .addSource(flinkKafkaConsumer011);

    //一些将消息流转换为keyedStream的聚合

    keyedStream.addSink(sink);

//3.之后的元素如何处理?

【问题讨论】:

【参考方案1】:

Flink API 不支持将作业图扩展到接收器之外。 (但是,您可以分叉流并在写入接收器的同时进行额外的处理。)

使用Streaming File Sink,您可以观察零件文件在完成时转换到完成状态。请参阅JavaDoc 了解更多信息。

State 存在于单个操作符中——只有那个操作符(例如 ProcessFunction)可以修改它。如果您想在接收器完成后修改键值状态,则没有直接的方法可以做到这一点。一种想法是在 ProcessFunction 中添加一个处理时间计时器,该计时器具有定期唤醒并检查新完成的零件文件的键控状态,并根据它们的存在修改状态。或者,如果这是错误的粒度,请编写一个自定义源来执行类似的操作,并将信息流式传输或广播到 ProcessFunction(然后必须是 CoProcessFunction 或 KeyedBroadcastProcessFunction),它可以使用它来执行必要的状态更新。

【讨论】:

感谢您的回答!鉴于我对这个用例有强烈的要求,你建议我如何实现这一目标? (我需要的不仅仅是零件文件转换的更多信息)例如,我想使用值状态。 我不理解——你说的“使用价值状态”是什么意思? 我的建议是,如有必要,您可以定义自定义滚动策略,并在文件不再具有“.in_progress”或“.pending”的名称时(外部)观察。 写入接收器(对于键控流)后,我想要一个读取/更新键控值状态的过程函数。完成对接收器的写入后,我想存储某种缓存/状态以进行额外处理。 我已经重写了我的答案,现在我(希望)理解了你的问题。如果您提供有关您的用例的更多信息,可能会提供更好的建议。

以上是关于下沉到目的地后的流程元素的主要内容,如果未能解决你的问题,请参考以下文章

小程序-用户授权/授权后的信息读取流程

HTTPS执行流程解析

Maven 发布流程阶段

性能测试---流程篇

性能测试--测试流程篇

Redis中的AOF工作流程