java可以使用Apache Storm处理具有动态属性集的元组吗?
我目前正在评估Apache Storm以处理来自多个数据源的异构数据。虽然所有数据可能共享一些公共属性(即“类型”属性),但我希望能够处理许多不同的元组“类”,并且能够处理新的数据类型,而对拓扑的更改最小。举例说明这些数据类型可能是什么样的:
{type=LogTransaction,timestamp=...,user=...,duration=...}
{type=LogEvent,timestamp=...,user=...,message=...}
Storm页面上的示例主要处理简单的元组,这些元组是预先定义好的,这样喷咀/螺栓就可以静态地声明输出字段
我最初的想法是声明类型并将所有其他属性存储在Map<String,Object>
中,然后可以声明:
public void declareOutputFields(OutputFieldsDeclarer ofd) {
ofd.declare(new Fields("type", "attributes"));
}
然而,我相信到那时,Storm的许多更高级的功能将不再正常工作。例如,据我所知,我不能再使用Trident对任何属性执行groupBy
有没有更好的方法来处理我在ApacheStorm中丢失的此类数据?我确实发现this post描述了一个类似的问题,但是我希望避免为每种数据类型创建Java类
# 1 楼答案
您可以使用自己的自定义字段,只要该字段是可序列化的,就可以在有多个主管的情况下正常工作
由于storm是一种分布式数据处理工具,并且当存在多个监控器时,基于分组,某些螺栓将向运行在不同监控器上的螺栓发出字段。在这种情况下,输出字段将被序列化并通过网络发送。此序列化可以是常规java序列化或Kryo序列化(以避免网络延迟)
因此,如果jvm无法序列化输出字段,您可能会遇到异常