From 00baca93d543c4d865053fb534a7cd3de3b032d0 Mon Sep 17 00:00:00 2001 From: kimi Date: Wed, 21 Nov 2018 00:33:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AC=AC=E5=9B=9B=E5=B0=8F?= =?UTF-8?q?=E8=8A=82=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../第十八章_后端架构选型、离线及实时计算.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ch18_后端架构选型、离线及实时计算/第十八章_后端架构选型、离线及实时计算.md b/ch18_后端架构选型、离线及实时计算/第十八章_后端架构选型、离线及实时计算.md index 002f1a0..eab8099 100644 --- a/ch18_后端架构选型、离线及实时计算/第十八章_后端架构选型、离线及实时计算.md +++ b/ch18_后端架构选型、离线及实时计算/第十八章_后端架构选型、离线及实时计算.md @@ -403,6 +403,7 @@ public static boolean isTick(Tuple tuple) { ![](./img/18-4-2.png) Topology + ''' String spoutId = "wordGenerator"; String counterId = "counter"; @@ -418,12 +419,14 @@ Topology // TotalRankingsBolt, 将完成完整聚合,统计出top-n的话题 builder.setBolt(totalRankerId, new TotalRankingsBolt(TOP_N)).globalGrouping(intermediateRankerId); ``` + 上面的topology设计如下: ![](./img/18-4-3.png) 将聚合计算与时间结合起来 前文,我们叙述了tick事件,回调中会触发bolt的execute方法,那可以这么做: + ``` RollingCountBolt: @Override @@ -459,6 +462,7 @@ RollingCountBolt: emit(counts, actualWindowLengthInSeconds); } ``` + 上面的代码可能有点抽象,看下这个图就明白了,tick一到,窗口就滚动: ![](./img/18-4-4.png) @@ -480,6 +484,7 @@ IntermediateRankingsBolt & TotalRankingsBolt:   其中,IntermediateRankingsBolt和TotalRankingsBolt的聚合排序方法略有不同: IntermediateRankingsBolt的聚合排序方法: + ``` @Override void updateRankingsWithTuple(Tuple tuple) { @@ -489,7 +494,9 @@ IntermediateRankingsBolt的聚合排序方法: super.getRankings().updateWith(rankable); } ``` + TotalRankingsBolt的聚合排序方法: + ``` @Override void updateRankingsWithTuple(Tuple tuple) { @@ -501,13 +508,16 @@ TotalRankingsBolt的聚合排序方法: super.getRankings().pruneZeroCounts(); } ``` + 而重排序方法比较简单粗暴,因为只求前N个,N不会很大: + ``` private void rerank() { Collections.sort(rankedItems); Collections.reverse(rankedItems); } ``` +   结语   下图可能就是我们想要的结果,我们完成了t0 - t1时刻之间的热点话题统计.