我正在寻找有关我的要求的建议。以下是我的要求的描述。请随时与我联系以获取任何详细信息。甚至对如何更清楚地描述我的问题的一些建议也非常感谢:)

需求描述

我有一些数据,格式如下: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/

10-12 21:56
查看更多