我有一个storm bolt,它从某些元组将键和值写入hashmap,并使用存储在其他元组中的键从hashmap读取值。当任务数设置为1时,它可以正常工作,但是当我增加这个数字时,键开始返回null值,而它们不应该返回null值。我假设这是因为每个bolt任务都在创建自己的hashmap示例,所以数据不共享。如何让所有bolt任务共享一个hashmap?
我目前正在prepare方法中创建hashmap,如下所示:
protected Map<String, JsonObject> hashMap;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector)
{
_collector = collector;
hashMap = Collections.synchronizedMap(new ConcurrentHashMap<String, JsonObject>());
}
我还尝试在拓扑级别定义hashmap,并将其作为一个变量提供给我的bolt,但这没有起作用。
1条答案
按热度按时间smdncfj31#
任务可以部署到不同的工作者(即,不同的机器),因此,任务之间不能共享内存中的任何内容。
任务作为“独立的工作单元”必须完全依赖于他们的投入。