在流式计算对比基线无数据告警场景中,利用基线数据对比来源数据,如果发现该时间窗口内的数据不在基线数据中则产生告警,因此基线数据和来源数据需要进行对比计算,基线数据去掉来源数据中已有的数据,余下的数据作为产生的告警数据。在数据量较小时直接进行集合运算取差集即可,但是但基线数据和来源数据量达百万甚至千万时则计算缓慢,出现延时,因此需要找到其它方式方法。
假设基线数据量为一百万条,窗口内来源数据为九十九万九千条,基线数据中移除来源数据即取差集后则只有一千条。
2.1 集合的取差集方法
1)List.removeAll(sublist)方法取差集
private static void testRemoveAll() {
List<String> listA = new ArrayList<>();
for(int i=0;i<OneMillion;i++){ //随机创建百万条基线数据
String key1="ip(192.168.199.10"+i+")#port("+i+")#service_name(orcl)#time(23:30:00)"+i;
listA.add(key1);
}
//从百万条基线数据中随机获取九十九万九千条作为来源数据
List<String> listB = createRandomList(listA,999000);
Date date = new Date();
listA.removeAll(listB);
Date date1 = new Date();
System.out.println("testRemoveAll:"+(date1.getTime()-date.getTime())/1000+"秒");
System.out.println(listA.size());
}
测试结果:
2)List.removeAll(new HashSet(sublist))方法取差集
private static void testRemoveAll() {
List<String> listA = new ArrayList<>();
for(int i=0;i<OneMillion;i++){ //随机创建百万条基线数据
String key1="ip(192.168.xxx.10"+i+")#port("+i+")#service_name(orcl)#time(23:30:00)"+i;
listA.add(key1);
}
//从百万条基线数据中随机获取九十九万九千条作为来源数据
List<String> listB = createRandomList(listA,999000);
Date date = new Date();
//listA.removeAll(listB);
listA.removeAll(new HashSet(listB));
Date date1 = new Date();
System.out.println("testRemoveAll:"+(date1.getTime()-date.getTime())/1000+"秒");
System.out.println(listA.size());
}
//0.3秒
测试结果:
2.2 BitMap的取差集方法
1)Java原生的BitSet
private static void testBitSet() {
List<String> listA = new ArrayList<>();
BitSet bitmap = new BitSet();
for(int i=0;i<OneMillion;i++){
String key1="ip(192.168.XXX.10"+i+")#port("+i+")#service_name(orcl)#time(23:30:00)"+i;
bitmap.set(Math.abs(key1.hashCode()));
listA.add(key1);
}
BitSet bitmap1 = new BitSet();
List<String> listB = createRandomList(listA,999000);
for(String s:listB){
bitmap1.set(Math.abs(s.hashCode()));
}
Date date = new Date();
bitmap.andNot(bitmap1);
Date date1 = new Date();
System.out.println("testBitSet:"+(double)(date1.getTime()-date.getTime())/1000+"秒");
}
//testBitSet:0.02秒
测试结果:
2)RoaingBitmap
private static void testRoaringBitmap() {
List<String> listA = new ArrayList<>();
RoaringBitmap bitmap = new RoaringBitmap();
for(int i=0;i<OneMillion;i++){
String key1="ip(192.168.xxx.10"+i+")#port("+i+")#service_name(orcl)#time(23:30:00)"+i;
bitmap.add(Math.abs(key1.hashCode()));
listA.add(key1);
}
RoaringBitmap bitmap1 = new RoaringBitmap();
List<String> listB = createRandomList(listA,999000);
for(String s:listB){
bitmap1.add(Math.abs(s.hashCode()));
}
Date date = new Date();
bitmap.andNot(bitmap1);
Date date1 = new Date();
System.out.println("testRoaringBitmap:"+(double)(date1.getTime()-date.getTime())/1000+"秒");
}
//testRoaringBitmap:0.022秒
测试结果:
总 结:

本文作者:长研架构小组(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




