微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使HashMap处于Flink状态的最佳方法是什么

如何解决使HashMap处于Flink状态的最佳方法是什么

我有一个Flink作业,一个全状态运算符需要将包含HashMap作为属性的类保持在状态中,因为此hasMap对用户保持不同的亲和力,例如:

public class Affinity {
public String id;
public String colorTriggered;
public Map<String,Integer> affinities;
/*this object keeps the affinity for a user to a different colors for example: 
affinities.put(green,5);
affinities.put(blue,9);
affinities.put(white,2);

to calculate then what is the color's affinity of this user,in this case the answer will be blue
*/
}

此hashMap用于跟踪这些亲和力,并在特定时刻询问用户颜色的亲和力,并获取具有最高亲和力值的键,该键将是值9的蓝色。

由于hashMaps不是Flink序列化的一部分,因此我需要在类中加入implement Serializable

是个坏主意还是有更好的方法来做到这一点并使对象保持状态?

一个完整的示例中,我或多或少需要做些什么,但不确定是否将HashMap用于Flink运算符和状态是否是一个好主意:

public class AffinityFlatMapFunction extends RichFlatMapFunction<Event,Affinity> implements MapOperations {

  @Override
  public void flatMap(Event event,Collector<Affinity> collector) throws Exception {
   Affinity prevIoUs = state.value();
    if(prevIoUs.hashMap.contains(event.color)){
        prevIoUs.hashMap.replace(event.color,value + 1);
    }else prevIoUs.hashMap.put(event.color,1);
   /*something like this*/
  String match = prevIoUs.hashMap.stream.filter(x -> 
              x.getKey().contains(event.color)).max(Map.Entry.comparingByValue())
                .map(Map.Entry::getKey).orElse("empty");
   if(!match.equals(prevIoUs.colorTriggered){
       prevIoUs.colorTriggered = match;
       state.update(prevIoUs);
       collector.collect(prevIoUs);
   }
 }
}

亲切的问候!

解决方法

根据文档,有一个名为MapState<UK,UV>的状态构造,它执行以下操作:

MapState :这保留了映射列表。您可以将键值对放入状态,并在所有当前存储的映射上检索Iterable。使用put(UK,UV)或putAll(Map )添加映射。可以使用get(UK)检索与用户密钥关联的值。可以分别使用entrys(),keys()和values()来检索映射,键和值的可迭代视图。您还可以使用isEmpty()来检查此映射是否包含任何键值映射。

几天前,我曾经在Flink线程中读到,所提供的StateDescriptors是经过优化的,几乎总是首选的选择,而不是实现自己的机制。

如果您不以不需要的方式分流(使用keyBy(color)应该没问题),那么您应该始终保持地图的最新状态。我不知道您对RocksDB延迟的担心是否成立,因为Flink状态保持在堆上,并且仅检查点指向RocksDB,因此所有当前值都可以即时获得;但我可能误会了这一点。回想起来,我什至怀疑您是否需要一个映射,但是用一个简单的ValueState来保存您的整数,因为在这种情况下,keyBy()将负责映射的“键”部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。