Flink:在CoFlatMapFunction中共享状态

时间:2015-11-17 11:23:27

标签: apache-flink flink-streaming

CoFlatMapFunction陷入困境。如果我把它放在DataStream之前的窗口,但是如果放在窗口的“应用”功能之后就失败了,似乎工作正常。

我正在测试两个流,flatMap1上的主要“功能”不断地在flatMap2上提取数据和控制流“模型”,根据请求更改模型。

我可以在flatMap2中设置并查看正确设置的b0 / b1,但是flatMap1总是看到b0和b1在初始化时设置为0。

我错过了一些明显的东西吗?

public static class applyModel implements CoFlatMapFunction<Features, Model, EnrichedFeatures> {
    private static final long serialVersionUID = 1L;

    Double b0;
    Double b1;

    public applyModel(){
        b0=0.0;
        b1=0.0;
    }

    @Override
    public void flatMap1(Features value, Collector<EnrichedFeatures> out) {
        System.out.print("Main: " + this + "\n");
    }

    @Override
    public void flatMap2(Model value, Collector<EnrichedFeatures> out) {
        System.out.print("Old Model: " + this + "\n");
        b0 = value.getB0();
        b1 = value.getB1();
        System.out.print("New Model: " + this + "\n");
    }

    @Override
    public String toString(){
        return "CoFlatMapFunction: {b0: " + b0 + ", b1: " + b1 + "}";
    }
}

1 个答案:

答案 0 :(得分:4)

以下是邮件列表中的答案......

  

CoFlatMapFunction是否打算并行执行?

     

如果是,您需要某种方法来确定性地分配哪条记录   去哪个并行实例。在某种程度上CoFlatMapFunction   在模型和结果之间进行并行(分区)连接   会话窗口,所以你需要某种形式的密钥来选择哪个   分区元素去。这有意义吗?

     

如果没有,请尝试明确地将其设置为并行1。

     

问候,斯蒂芬

           

所有可以只读访问的全局状态都可以通过   广播()。

     

所有人都可以阅读和更新的全局状态是   当前不可用。对此的一致操作将是相当的   代价高昂,需要某种形式的分布式沟通/共识。

     

相反,我鼓励您使用以下内容:

     

1)如果你可以对状态进行分区,请使用keyBy()。mapWithState() - 那   本地化国家行动并使其非常快。

     

2)如果您的州没有按键组织,您的州可能非常   很小,你可能可以使用非并行操作。

     

3)如果某些操作更新状态而另一个操作访问它,   您通常可以使用迭代和CoFlatMapFunction实现它   (一边是原始输入,另一边是反馈输入)。

     

最终所有方法都会对状态访问和修改进行本地化,   如果可能的话,这是一个很好的模式。

     

问候,斯蒂芬