ES in BI

Posted 07H_JH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES in BI相关的知识,希望对你有一定的参考价值。

一直想找一个用于大数据平台实时OLAP(甚至是实时计算)的框架,之前调研的Druid(druid.io)太过复杂,整个Druid由5、6个服务组成,而且加载数据也不太方便,性能一般,亦或是我还不太会用它。后来发现使用ElasticSearch就可以满足海量数据实时OLAP的需求。
ElasticSearch相信大家都很熟悉了,它在搜索领域已经有了举足轻重的地位,而且也支持越来越多的聚合统计功能,还和YARN、Hadoop、Hive、Spark、Pig、Flume等大数据框架兼容的越来越好,比如:可以将ElasticSearch跑在YARN上,还可以在Hive中建立外部表映射到ElasticSearch的Index中,直接在Hive中执行INSERT语句,将数据加载进ElasticSearch。
所谓OLAP,其实就是从事实表中统计任意组合维度的指标,也就是过滤、分组、聚合,其中,聚合除了一般的SUM、COUNT、AVG、MAX、MIN等,还有一个重要的COUNT(DISTINCT),看上去这些操作在SQL中是非常简单的统计,但在海量数据、低延迟的要求下,并不是那么容易做的。
ElasticSearch本来就是做实时搜索的,过滤自然不是问题,现在也支持各种聚合以及Pipeline aggregations(相当于SQL子查询的功能),而且ElasticSearch的安装部署也非常简单,一个节点只有一个服务进程,关于安装配置可参考:http://lxw1234.com/archives/2015/12/582.htm
本文以两个业务场景的例子,看一下ElasticSearch是如何满足我们的需求的。

例子1:网站流量报告

在我们的报表平台有这样一张报表,用于查看每个网站每天的流量指标:

其中,维度有:天、小时、网站,指标有:PV、UV、访问次数、跳出率、平均停留时间、回访率等。另外,还有一张报表是地域报告,维度多了省份和城市,指标一样。目前的做法是将可选的维度组合及对应的指标先在Hive中分析好,再将结果同步至mysql,供报表展现。

真正意义上的OLAP做法,我是这样做的:在Hive分析好一张最细粒度为visit_id(session_id)的事实表,字段及数据如下:

然后将这张事实表的数据加载到ElasticSearch中的logs2/sitelog1211中。查看数据:

 
  1. curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?pretty'
  2. "took" : 1015,
  3. "timed_out" : false,
  4. "_shards" :
  5. "total" : 10,
  6. "successful" : 10,
  7. "failed" : 0
  8. ,
  9. "hits" :
  10. "total" : 3356328,
  11. "max_score" : 1.0,
  12. "hits" : [
  13. "_index" : "logs2",
  14. "_type" : "sitelog1211",
  15. "_id" : "AVGkoWowd8ibEMoyOhve",
  16. "_score" : 1.0,
  17. "_source":"cookieid" : "8F97E07300BC7655F6945A","siteid" : "633","visit_id" : "feaa25e6-3208-4801-b7ed-6fa45f11ff42","pv" : 2,"is_return_cookie" : 0,
  18. "is_bounce_visit" : 0,"visit_stay_times" : 34,"visit_view_page_cnt" : 2, "region" : "浙江","city" : "绍兴"
  19. ,
  20. ……

该天事实表中总记录数为3356328
接着使用下面的查询,完成了上图中网站ID为1127,日期为2015-12-11的流量报告:

 
  1. curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?search_type=count&q=siteid:1127&pretty' -d '
  2. "size": 0,
  3. "aggs" :
  4. "pv" : "sum" : "field" : "pv" ,
  5. "uv" : "cardinality" : "field" : "cookieid" ,"precision_threshold": 40000,
  6. "return_uv" :
  7. "filter" : "term" : "is_return_cookie" : 1,
  8. "aggs" :
  9. "total_return_uv" : "cardinality" : "field" : "cookieid" ,"precision_threshold": 40000
  10. ,
  11. "visits" : "cardinality" : "field" : "visit_id" ,"precision_threshold": 40000,
  12. "total_stay_times" : "sum" : "field" : "visit_stay_times" ,
  13. "bounce_visits" :
  14. "filter" : "term" : "is_bounce_visit" : 1,
  15. "aggs" :
  16. "total_bounce_visits" : "cardinality" : "field" : "visit_id" ,"precision_threshold": 40000
  17. '

基本上1~2秒就可以返回结果:

 
  1. "took" : 1887,
  2. "timed_out" : false,
  3. "_shards" :
  4. "total" : 10,
  5. "successful" : 10,
  6. "failed" : 0
  7. ,
  8. "hits" :
  9. "total" : 5888,
  10. "max_score" : 0.0,
  11. "hits" : [ ]
  12. ,
  13. "aggregations" :
  14. "uv" :
  15. "value" : 5859
  16. ,
  17. "visits" :
  18. "value" : 5889
  19. ,
  20. "return_uv" :
  21. "doc_count" : 122,
  22. "total_return_uv" :
  23. "value" : 119
  24. ,
  25. "bounce_visits" :
  26. "doc_count" : 5177,
  27. "total_bounce_visits" :
  28. "value" : 5177
  29. ,
  30. "pv" :
  31. "value" : 10820.0
  32. ,
  33. "total_stay_times" :
  34. "value" : 262810.0
  35.  

接着是地域报告中维度为省份的指标统计,查询语句为:

 
  1. curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?search_type=count&q=siteid:1127&pretty' -d '
  2. "size": 0,
  3. "aggs" :
  4. "area_count" :
  5. "terms" : "field" : "region","order" : "pv" : "desc" ,
  6. "aggs" :
  7. "pv" : "sum" : "field" : "pv" ,
  8. "uv" : "cardinality" : "field" : "cookieid" ,"precision_threshold": 40000,
  9. "return_uv" :
  10. "filter" : "term" : "is_return_cookie" : 1,
  11. "aggs" :
  12. "total_return_uv" : "cardinality" : "field" : "cookieid" ,"precision_threshold": 40000
  13. ,
  14. "visits" : "cardinality" : "field" : "visit_id" ,"precision_threshold": 40000,
  15. "total_stay_times" : "sum" : "field" : "visit_stay_times" ,
  16. "bounce_visits" :
  17. "filter" : "term" : "is_bounce_visit" : 1,
  18. "aggs" :
  19. "total_bounce_visits" : "cardinality" : "field" : "visit_id" ,"precision_threshold": 40000
  20. '

因为要根据省份分组,比之前的查询慢一点,但也是秒级返回:

 
  1. "took" : 4349,
  2. "timed_out" : false,
  3. "_shards" :
  4. "total" : 10,
  5. "successful" : 10,
  6. "failed" : 0
  7. ,
  8. "hits" :
  9. "total" : 5888,
  10. "max_score" : 0.0,
  11. "hits" : [ ]
  12. ,
  13. "aggregations" :
  14. "area_count" :
  15. "doc_count_error_upper_bound" : 0,
  16. "sum_other_doc_count" : 2456,
  17. "buckets" : [
  18. "key" : "北京",
  19. "doc_count" : 573,
  20. "uv" :
  21. "value" : 568
  22. ,
  23. "visits" :
  24. "value" : 573
  25. ,
  26. "return_uv" :
  27. "doc_count" : 9,
  28. "total_return_uv"以上是关于ES in BI的主要内容,如果未能解决你的问题,请参考以下文章

    奥威Power-BI 旅游业BI方案——按省份分析旅游情况

    BI:事实表设计/数据仓库建模

    BI - 具有不相容颗粒的事实表设计

    维度表, 事实表, 数据仓库, BI...

    SQL Server BI:单个多维数据集,多个事实表

    Speed-BI 多事实表与表间计算的应用:销售目标达成分析 另一种实现方法