我检查了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")
到标准输出吗?
预先感谢
答案 0 :(得分:2)
来自HashJoin的Javadoc:
在实现上,哈希联接转换针对吞吐量进行了优化 这样每个计算成员都拥有所有丰富内容的本地副本 数据,存储在哈希表中(因此命名)。富流是 在从主流中提取任何数据之前已完全消耗掉。
在您的示例中,broker
列表中的所有项目将首先从所有成员中使用,然后trades
列表将被使用。
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();