Apache flink 使用ApacheFlink流处理缓冲转换的消息(例如,1000个)

Apache flink 使用ApacheFlink流处理缓冲转换的消息(例如,1000个),apache-flink,stream-processing,Apache Flink,Stream Processing,我正在使用ApacheFlink进行流处理 订阅源消息(例如:Kafka、AWS Kinesis数据流)后,然后使用Flink操作符对流数据应用转换、聚合等,我希望缓冲最终消息(例如:1000个),并在单个请求中将每个批发布到外部REST API 如何在ApacheFlink中实现缓冲机制(将每1000条记录创建为一个批) Flink PipiLine:流源-->使用运算符转换/减少-->缓冲区1000条消息-->post-to-REST API 谢谢你的帮助 我将创建一个具有状态的接收器,该状

我正在使用ApacheFlink进行流处理

订阅源消息(例如:Kafka、AWS Kinesis数据流)后,然后使用Flink操作符对流数据应用转换、聚合等,我希望缓冲最终消息(例如:1000个),并在单个请求中将每个批发布到外部REST API

如何在ApacheFlink中实现缓冲机制(将每1000条记录创建为一个批)

Flink PipiLine:流源-->使用运算符转换/减少-->缓冲区1000条消息-->post-to-REST API


谢谢你的帮助

我将创建一个具有状态的接收器,该状态将保留传入的消息。当计数足够高(1000)时,接收器发送批处理。状态可以在内存中(例如,一个实例变量包含一个消息的ArrayList),但是您应该使用检查点,以便在出现某种故障时可以恢复该状态

当您的接收器具有检查点状态时,它需要实现CheckpointedFunction(在org.apache.flink.streaming.api.checkpoint中),这意味着您需要向接收器添加两种方法:

@Override
public void snapshotState(FunctionSnapshotContext context) throws Exception {

    checkpointedState.clear();

    // HttpSinkStateItem is a user-written class 
    // that just holds a collection of messages (Strings, in this case)
    //
    // Buffer is declared as ArrayList<String>

    checkpointedState.add(new HttpSinkStateItem(buffer));

}

@Override
public void initializeState(FunctionInitializationContext context) throws Exception {

    // Mix and match different kinds of states as needed:
    //   - Use context.getOperatorStateStore() to get basic (non-keyed) operator state
    //        - types are list and union        
    //   - Use context.getKeyedStateStore() to get state for the current key (only for processing keyed streams)
    //        - types are value, list, reducing, aggregating and map
    //   - Distinguish between state data using state name (e.g. "HttpSink-State")      

    ListStateDescriptor<HttpSinkStateItem> descriptor =
        new ListStateDescriptor<>(
            "HttpSink-State",
            HttpSinkStateItem.class);

    checkpointedState = context.getOperatorStateStore().getListState(descriptor);

    if (context.isRestored()) {

        for (HttpSinkStateItem item: checkpointedState.get()) {
            buffer = new ArrayList<>(item.getPending());  
        }

    }       

}
@覆盖
公共void快照状态(FunctionSnapshotContext上下文)引发异常{
checkpointedState.clear();
//HttpSinkStateItem是用户编写的类
//只保存一组消息(本例中为字符串)
//
//缓冲区声明为ArrayList
添加(新的HttpSinkStateItem(缓冲区));
}
@凌驾
public void initializeState(FunctionInitializationContext上下文)引发异常{
//根据需要混合和匹配不同类型的状态:
//-使用context.getOperatorStateStore()获取基本(非键控)运算符状态
//-类型为列表和并集
//-使用context.getKeyedStateStore()获取当前键的状态(仅用于处理键控流)
//-类型包括值、列表、减少、聚合和映射
//-使用状态名称区分状态数据(例如“HttpSink状态”)
ListStateDescriptor描述符=
新ListStateDescriptor(
“HttpSink状态”,
HttpSinkStateItem.class);
checkpointedState=context.getOperatorStateStore().getListState(描述符);
if(context.isRestored()){
对于(HttpSinkStateItem:checkpointedState.get()){
buffer=newarraylist(item.getPending());
}
}       
}

如果计数未达到阈值,还可以使用接收器中的计时器(如果输入流已设置关键帧/分区)定期发送

Chris,你是说“键控状态”就是状态,用来创建sinc并保留消息吗?如果你有一个参考例子,请链接,我是新的弗林克,但无论如何,我会阅读文件。谢谢大家!@我看看能想出什么主意谢谢你,克里斯!您的答案有助于使用ApacheFlink实现基于会话的流处理和将消息发布到REST