Hazelcast Jet内部优化

时间:2018-11-04 21:03:58

标签: hazelcast hazelcast-jet

我检查了Hazelcast Jet的项目需求,但是发现有关以下主题的文档确实含糊不清:

1)当我在两个列表流上执行数据连接时...例如:

BatchStage<Trade> trades = p.drawFrom(list("trades"));
BatchStage<Entry<Integer, Broker>> brokers =    
p.drawFrom(list("brokers"));
BatchStage<Tuple2<Trade, Broker>> joined = trades.hashJoin(brokers,
    joinMapEntries(Trade::brokerId),
    Tuple2::tuple2);
joined.drainTo(Sinks.logger());

那么我能以某种方式告诉Jet实际发生什么连接吗? 地图侧联接还是减少侧联接...?我的意思是,想象一下“经纪人”的规模很小,而交易却非常庞大。进行这两组连接的最佳技术是地图侧连接又称为广播连接。...当Jet进行连接时,哪些数据将通过网络传输?有基于尺寸的优化吗?

2)我正在测试以下情况:

简单的管道:

private Pipeline createPipeLine() {
    Pipeline p = Pipeline.create();
    BatchStage stage = p.drawFrom(Sources.<Date>list("master"));
    stage.drainTo(Sinks.logger());
    return p;
}

list("master")被集群中的另一个节点不断填充。现在,当我将此管道提交到集群时,仅列表(“ master”)的子集被耗尽到记录器。我可以通过某种方式将Jet作业设置为不断消耗list("master")到标准输出吗?

预先感谢

1 个答案:

答案 0 :(得分:2)

  1. 来自HashJoin的Javadoc:

    在实现上,哈希联接转换针对吞吐量进行了优化 这样每个计算成员都拥有所有丰富内容的本地副本 数据,存储在哈希表中(因此命名)。富流是 在从主流中提取任何数据之前已完全消耗掉。

    在您的示例中,broker列表中的所有项目将首先从所有成员中使用,然后trades列表将被使用。

  2. IList是批处理源,您需要流式源才能连续使用项目。您可以使用IQueue作为来源,这是为队列创建来源的一种简单方法:

    StreamSource<Trade> queueSource = SourceBuilder.<IQueue<Trade>>stream("queueStream", 
            c -> c.jetInstance().getHazelcastInstance().getQueue("trades"))
        .<Trade>fillBufferFn((queue, buf) -> buf.add(queue.poll()))
        .build();