以下内容,都经过本人实践验证过。
若转发,请在标题上标记[转],并注明原文链接:http://www.cnblogs.com/robinjava77/p/6285747.html,作者名称:robin。
并在文章首行附上本段话。否则,作者保留追究的权利。
术语定义:
1.片:本周、本月、本年、近两月、近三月、近半年、近一年和至今八个维度
诉求:基于**年的日数据,进行计算汇总,分别以本周、本月、本年、近两月、近三月、近半年、近一年和至今八个维度进行统计精准性修复,时间消耗越低越好。
场景:
1.日数据是每日都会进行各类综合计算,形成的业务基础数据。
2.每日只会保留当日的片数据。
3.当日片数据是根据当日日数据、昨日片数据和需要去掉的日数据,综合计算而保存下来。
4.日数据,在未发现错误前,都是可靠的。
5.日数据,少量错误,修复少量key的片数据。
6.某日的日数据,出现大量甚至是全量key的数据错误,则需进行全量精准性修复。
应对第六个场景,就出现了我们上文提到的诉求。
两年的基础日数据大约在***亿多条,由于系统现在仍然处于第一代架构:单进程java+oracle的原始架构。无法使用后续升级的架构:①zk+多进程java去中心化分布式计算;②mongo+spark;③hadoop+spark等等来更优地去解决现在的诉求。
因此本文仅针对:单进程java+oracle解决上述诉求来进行说明。如果有同类诉求的场景,最好是在项目架构时,根据实际情况,直接选择更好的架构去进行开发。这样能避免一些让人十分尴尬的场景。本人所负责的项目,启动之初,由于没有业务大神参与,领导只能选择简单易掌控的架构,好让所有开发人员,都能将主要精力投入业务规则的摸索和熟悉。
废话说太多,直接上主菜。
针对这个诉求,自己前前后后花了一定的时间才解决。现在按实践的时间前后顺序,分别是:①集团作战方案;②一锅乱炖方案;③分而治之方案。
所有日数据,都是基于key进行唯一性标识,片的日数据量=key数量*8。
Key的数量仅是***万级。
以下是一些基础类定义和变量说明
1 // List<String> keys集团线程的1万个key 2 //List<Unit> units 片定义数据集合 3 Class Unit{ 4 String name;//片标识 5 Integer startDay;//片起始日期 6 Integer endDay;//片截止日期 7 Integer indexDay;//片的索引日期 8 } 9 Class DayData{ 10 Integer day;//日期 11 Number data;//日数据 12 String key;// 13 }