elasticsearch中的分析

ef1yzkbh  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(371)

我正在处理事件分析,我使用hadoop处理日志并将一些结果存储在mysql中。由于日志每天都会出现,所以现在无法工作,因为存在可伸缩性问题。
我们需要显示统计每年,每月,每周,每天,每小时随着过滤能力我们的样本可以为10万用户增长,每小时使用20个网站
100000(用户)*20(唯一网站)*2(地点)*24(小时)=96000000(每天最多记录9600万条)
我们的table看起来像
事件,时间,用户,网站,地点,一些统计信息
一些查询示例如下

1) select website, sum(stats), count(distinct(user_id)) from table group by website;
2) select website, sum(stats), count(distinct(user_id)) from table where YEAR(Time) = 2009 group by website, MONTH(Time);
3) select website, sum(stats), count(distinct(user_id)) from table group by website where event_src_id=XXXXXXXXXXX;
4) select website, sum(stats), count(distinct(user_id)) from table group by website where time > 1 jan 2014 and time <=31 jan 2014;
5) select website, location, sum(stats), count(distinct(user_id)) from table group by website, location;
6) select website, sum(stats) as stats_val from table group by website order by stats_val desc limit 10;
   select location, sum(stats) as stats_val from table group by location order by stats_val desc limit 10;
7) delete from table where event_src_id=XXXXXXXXXXX; (may delete all 96M records)

我尝试了hadoopElasticSearch,它的插入部分似乎可以用这个来修复,我更担心的是阅读部分。聚合框架似乎给了我一些希望,但我不能按照查询1工作。如何既分组又求和又区分?如何在给定可伸缩性和性能的情况下将elasticsearch与hadoop结合使用,以满足基于olap的需求。任何帮助都将不胜感激。

zwghvu4y

zwghvu4y1#

如何既分组又求和又区分
聚合可以有子聚合。
首先,组功能对应于术语聚合和(有时)顶级聚合。其次,有一个sum聚合,一个简单的stats度量聚合。最后,在本例中使用distinct是执行count(distinct),它对应于基数聚合,根据需要可以是近似的或精确的。
7) 从表中删除event\u src\u id=x(可能会删除所有96m记录)
有一个delete by query api,您可以使用它,但是要注意删除文档的百分比很高;lucene和elasticsearch并没有为此进行优化,而且由于删除数据中的标记,您将产生开销。
示例
按网站从表组中选择网站、总和(stats)、计数(distinct(user\ id))

GET /_search
{
   "aggs": {
      "website_stats": {
        "terms": {
           "field": "website"
        },
        "aggs": {
           "sum_stats": {
             "sum": {
               "field": "stats"
             }
           },
           "count_users": {
             "cardinality": {
               "field": "user_id"
            }
          }
        }
      }
   }
}

从表中选择网站,sum(stats),count(distinct(user\ id)),其中year(time)=2009 group by website,month(time)

GET /_search
{
   "query": {
     "filter": {
       "range": {
           "Time": {
              "gt": "2009-01-01 00:00:00",
              "lt": "2010-01-01 00:00:00"
           }
       }
     }
   },
   "aggs": {
      "monthly_stats" {
        "terms": {
           "field": "website"
        },
        "aggs": {
           "months": {
              "date_histogram": {
                "field": "Time",
                "interval": "month"
              },
              "aggs" : {
                "sum_stats": {
                  "sum": {
                    "field": "stats"
                  }
                },
                "count_users": {
                  "cardinality": {
                    "field": "user_id"
                }
              }
            }
          }
        }
      }
   }
}
55ooxyrt

55ooxyrt2#

首先,我不认为使用elasticsearch进行类似olap的查询是一个好主意。我建议您使用一些类似dremel的技术(impala、tez、storm等),它们支持您指定的sql。它有一些优点,如:
您不必将数据从hadoop传输到elasticsearch。
您可以使用sql
您不必关心从elasticsearch查询答案解析json。
别误会我的意思,我喜欢elasticsearch/logstash/kibana,但我喜欢日志收集和可视化。当然可以进行一些高级查询,但它有一些局限性,这是我在个人项目中发现的。
还可以考虑使用kibana,它是elasticsearch中数据统计的一个很好的工具,您可以用它做很多事情。
以下是您要求的一些查询示例(我没有对其进行测试):
1)

{
  "aggs": {
    "website": {
      "terms": {
        "field": "website"
      },
      "aggs": {
        "sum_stats": {
          "sum": {
            "field": "stats"
          },
          "aggs": {
            "distinct_user": {
              "cardinality": {
                "field": "user_id",
                "precision_threshold": 100
              }
            }
          }          
        }
      }
    }
  }
}

2-6是相似的,使用1)中的内容和不同的过滤器,如:

{
  "aggs": {
    "your_filter": {
      "filter": {
        "term": {"event_src_id" : "XXXXXXXXXXX"}
      }
    },
    "aggs": {
      "website": {
        "terms": {
          "field": "website"
        },
        "aggs": {
          "sum_stats": {
            "sum": {
              "field": "stats"
            },
            "aggs": {
              "distinct_user": {
                "cardinality": {
                  "field": "user_id",
                  "precision_threshold": 100
                }
              }
            }
          }
        }
      }
    }
  }
}

7) 删除很容易

"query" : {
        "term" : { "event_src_id" : "XXXXXXXXXXX" }
    }
}

相关问题