使用hazelcast jet聚合来自文件的连续数字流

时间:2019-01-22 14:12:15

标签: hazelcast-jet

我正在尝试使用hazelcast jet对来自文件的连续数字流求和

pipe
    .drawFrom(Sources.fileWatcher)<dir>))
    .map(s->Integer.parseInt(s))
    .addTimestamps()
    .window(WindowDefinition.sliding(10000,1000))
    .aggregate(AggregateOperations.summingDouble(x->x))
    .drainTo(Sinks.logger());

几个问题

  1. 它没有提供预期的输出,我的期望是在文件中出现新数字后,应将其添加到现有的总和中
  2. 要执行此操作,为什么我需要提供window和addTimestamp方法,我只需要进行无限流求和
  3. 我们如何实现容错能力,即e。如果服务器重新启动,是否将保存汇总结果,并且在启动时将根据上一次计算的总和进行汇总?
  4. 如果服务器关闭,并且服务器启动时现在有少量数字输入文件,它将从服务器关闭时的最后一点开始读取,还是在服务器关闭时丢失数字,而仅读取该数字服务器启动后得到的。

1 个答案:

答案 0 :(得分:0)

回答第一和第二季度: 您正在寻找rollingAggregate,不需要时间戳或窗口。

pipe
    .drawFrom(Sources.fileWatcher(<dir>))
    .rollingAggregate(AggregateOperations.summingDouble(Double::parseDouble))
    .drainTo(Sinks.logger());

回答第三和第四季度:fileWatcher源不是容错的。原因是它读取本地文件,并且当成员去世时,本地文件将始终不可用。作业重新启动时,它将从当前位置开始读取,并且会丢失在作业停止时添加的数字。

此外,由于您使用全局聚合,因此来自所有文件的数据将被路由到单个群集成员,而其他成员将处于空闲状态。