我正在寻找有关我的要求的建议。以下是我的要求的描述。请随时与我联系以获取任何详细信息。甚至对如何更清楚地描述我的问题的一些建议也非常感谢:)
需求描述
我有一些数据,格式如下:router, interface,timestamp, src_ip, dst_ip, src_port, dst_port, protocol, bitsr1, 1, 1453016443, 10.0.0.1, 10.0.0.2, 100, 200, tcp, 108r2, 1, 1453016448, 10.0.0.3, 10.0.0.8, 200, 200, udp, 100
如您所见,它是一些网络原始数据。我省略了一些列,只是为了使其看起来更加清晰。数据量很大。而且它的生成速度非常快,每5分钟就有10亿行...
我想要对这些数据进行一些实时分析。
例如:
使用时间戳记画一条线
找出哪个3 src_ip为一个接口(interface)发送最多的数据
我已经尝试了一些解决方案,但每个解决方案都不适合。例如 :
数据库
MySQL看起来不错,除了一些问题:
openTSDB
OpenTSDB是一个很好的时间序列数据库。而且也不适合我的要求。
Spark
flex 搜寻
所以...我被困在这里。有人可以给点建议吗?
最佳答案
我不明白为什么ES无法满足您的要求。我想你误会了这部分
您的第一个要求使用时间戳绘制一条线可以通过如下查询/聚合轻松实现:
{
"query": {
"bool": {
"must": [
{
"term": {
"interface": 1
}
},
{
"term": {
"router": "r1"
}
}
]
}
},
"aggs": {
"by_minute": {
"date_histogram": {
"field": "timestamp",
"interval": "1m"
},
"aggs": {
"sum_bits": {
"sum": {
"field": "bits"
}
}
}
}
}
}
至于您的第二个要求,找出哪个3 src_ip为一个接口(interface)发送最多的数据,也可以通过这样的查询/聚合轻松实现:
{
"query": {
"bool": {
"must": [
{
"term": {
"interface": 2
}
},
{
"term": {
"router": "r1"
}
}
]
}
},
"aggs": {
"by_src_ip": {
"terms": {
"field": "src_ip",
"size": 3,
"order": {
"sum_bits": "desc"
}
},
"aggs": {
"sum_bits": {
"sum": {
"field": "bits"
}
}
}
}
}
}
更新
根据您的评论,您上面的第二个要求可能会更改为找到src_ip / dst_ip的前3个组合。这可以通过使用
terms
而不是将建立src / dest组合并为每对夫妇提供位总和的术语的script
聚合来实现,如下所示:{
"query": {
"bool": {
"must": [
{
"term": {
"interface": 2
}
},
{
"term": {
"router": "r1"
}
}
]
}
},
"aggs": {
"by_src_ip": {
"terms": {
"script": "[doc.src_ip.value, doc.dst_ip.value].join('-')",
"size": 3,
"order": {
"sum_bits": "desc"
}
},
"aggs": {
"sum_bits": {
"sum": {
"field": "bits"
}
}
}
}
}
}
请注意,为了运行最后一个查询,您需要enable dynamic scripting。同样,由于您将拥有数十亿个文档,因此脚本编写可能不是最佳解决方案,但是值得尝试一下,然后再进行进一步研究。另一种可能的解决方案是在建立索引时添加
combination
字段(src_ip-dst_ip
),以便您可以将其用作术语聚合中的字段,而不必诉诸脚本。关于mysql - 能否为大型关系数据分析器提出解决方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34847668/