Apache Kylin中对上亿字符串的精确Count_Distinct示例

如果业务中能接受1.22%的误差,那么肯定首选近似算法,因为它能节省很多资源和时间。如果业务中必须使用精确去重,那么就看看本文的例子(针对上亿字符串的精确去重)。

事实表


  1. hive> desc test_t_pbs_uv_fact; 
  2. OK 
  3. ad_id                   string  //维度 
  4. material_id             string   //维度 
  5. city_code               string  //维度 
  6. user_id                 string   //指标,需要精确Count Distinct 
  7. bid_request             bigint  //指标,SUM 
  8. device_bid_request      bigint      //指标,SUM 
  9. win                     bigint  //指标,SUM  
  10. ck                      bigint  //指标,SUM  
  11. pt                      string  //维度,日期,yyyy-MM-dd 
  12.   

该事实表一天的数据记录大概1.5亿+,其中user_id为字符串,类似MD5后的字符串。

创建Model

在Kylin中创建名为lxw1234_uv_model的模型。

选择维度和指标字段:

创建Cube

创建名为lxw1234_uv_cube的Cube,其中,指标定义如下:

其他请按实际业务需求配置。

手动修改Cube(JSON)

如果不修改,精确Count Distinct使用了Default dictionary来保存编码后的user_id,而Default dictionary的最大容量为500万,并且,会为每个Segment生成一个Default dictionary,这样的话,跨天进行UV分析的时候,便会产生错误的结果,如果每天不重复的user_id超过500万,那么build的时候会报错:


  1. java.lang.IllegalArgumentException: Too high cardinality is not suitable for dictionary — cardinality: 43377845  
  2. at org.apache.kylin.dict.DictionaryGenerator.buildDictionary(DictionaryGenerator.java:96) 
  3. at org.apache.kylin.dict.DictionaryGenerator.buildDictionary(DictionaryGenerator.java:73) 

该值由参数 kylin.dictionary.max.cardinality 来控制,当然,你可以修改该值为1亿,但是Build时候可能会因为内存溢出而导致Kylin Server挂掉:


  1. # java.lang.OutOfMemoryError: Requested array size exceeds VM limit  
  2. # -XX:OnOutOfMemoryError=”kill -9 %p”  
  3. # Executing /bin/sh -c “kill -9 16193″… 

因此,这种需求我们需要手动使用Global Dictionary,顾名思义,它是一个全局的字典,不分Segments,同一个user_id,在全局字典中只有一个ID。

目前Kylin的UI中没有可以直接配置Global Dictionary的地方,需要手动修改Cube的JSON描述:

在状态为DISABLED的Cube列表中,点击”Admins”菜单下的”Edit(JSON)”,进入Cube JSON描述的编辑页面,

添加下面的JSON

其中,在override_kylin_properties 中增加了两个Cube的配置参数,用于增加Mapper的运行内存。


  1. "dictionaries": [ 
  2.     { 
  3.       "column": "USER_ID", 
  4.       "builder": "org.apache.kylin.dict.GlobalDictionaryBuilder" 
  5.     } 
  6.   ] 

定义了对USER_ID字段使用全局字典。

之后,保存JSON。

Build与查询

Build完成后,在Hive和Kylin中执行下面的查询:

SELECT city_code,SUM(bid_request) AS bid_request,COUNT(DISTINCT user_id) AS uvFROM liuxiaowen.TEST_T_PBS_UV_FACTGROUP BY city_codeORDER BY uv DESC limit 30;

Hive中耗时:181.134 seconds

Kylin中耗时:9 seconds

查询结果完全一致:

Global Dictionary存在问题

由于Global Dictionary 底层基于bitmap,其最大容量为Integer.MAX_VALUE,即21亿多,如果全局字典中,累计值超过Integer.MAX_VALUE,那么在Build时候便会报错。

因此,使用全局字典还是有容量的限制。

本文作者:佚名

来源:51CTO

时间: 2024-10-26 14:55:20

Apache Kylin中对上亿字符串的精确Count_Distinct示例的相关文章

美团Apache Kylin精确去重指标优化历程

康凯森,美团点评大数据工程师,Apache Kylin commiter,目前主要负责Apache Kylin在美团点评的平台化建设. 问题背景 本文记录了我将Apache Kylin超高基数的精确去重指标查询提速数十倍的过程,大家有任何建议或者疑问欢迎讨论. 某业务方的cube有12个维度,35个指标,其中13个是精确去重指标,并且有一半以上的精确去重指标单天基数在千万级别,cube单天数据量1.5亿行左右.业务方一个结果仅有21行的精确去重查询竟然耗时12秒多,其中HBase端耗时6秒多,K

如何在eclipse中跑apache kylin;

问题描述 如何在eclipse中跑apache kylin: 用eclipse导入kylin的jar包,然后通过eclipse生成cube,而且能够在web端检测到,能做到吗? 解决方案 http://www.mamicode.com/info-detail-936729.html

Apache Kylin权威指南2.2 在Hive中准备数据

2.2 在Hive中准备数据 2.1节介绍了Kylin中的常见概念.本节将介绍准备Hive数据的一些注意事项.需要被分析的数据必须先保存为Hive表的形式,然后Kylin才能从Hive中导入数据,创建Cube. Apache Hive是一个基于Hadoop的数据仓库工具,最初由Facebook开发并贡献到Apache软件基金会.Hive可以将结构化的数据文件映射为数据库表,并可以将SQL语句转换为MapReduce或Tez任务进行运行,从而让用户以类SQL(HiveQL,也称HQL)的方式管理和

Apache Kylin权威指南1.5 Apache Kylin的主要特点

1.5 Apache Kylin的主要特点 Apache Kylin的主要特点包括支持SQL接口.支持超大数据集.秒级响应.可伸缩性.高吞吐率.BI工具集成等. 1.5.1 标准SQL接口 Apache Kylin以标准SQL作为对外服务的主要接口.因为SQL是绝大多数分析人员最熟悉的工具,同时也是大多数应用程序使用的编程接口.尽管Kylin内部以Cube技术为核心,对外却没有选用MDX(MultiDimensional eXpressions)作为接口.虽然MDX作为OLAP查询语言,从学术上

Apache Kylin权威指南导读

前 言 "麒麟出没,必有祥瑞." --中国古谚语 "于我而言,与Apache Kylin团队一起合作使Kylin通过孵化成为顶级项目是非常激动人心的,诚然,Kylin在技术方面非常振奋人心,但同样令人兴奋的是Kylin代表了亚洲国家,特别是中国,在开源社区中越来越高的参与度." --Ted Dunning Apache孵化项目副总裁,MapR首席应用架构师 今天,随着移动互联网.物联网.AI等技术的快速兴起,数据成为了所有这些技术背后最重要,也是最有价值的"

Apache Kylin:基于Hadoop的OLAP引擎

传统上,Hadoop(包括MapReduce,Pig以及Hive)通常用于外部私有OLAP Cube引擎准备数据.如今,Zaloni的客户基于Apache Kylin的OLAP技术实现了实时查询的能力,这些Cube的事实表包含了400亿条以上的原始数据.我们正在帮助客户统一归集来自于多个独立系统的账单数据,并构建OLAP Cube以支持实时分析,这是以前系统所无法实现的.现在,Hadoop集群都可以做到了. 基于Hadoop的分析演化 Hadoop已经从通用计算能力(MapReduce)的分布式

Apache 基金会宣布 Apache Kylin 成为顶级项目

Apache Kylin 是可扩展到PB规模的开源分布式大数据分析引擎,已被应用在eBay,Exponential, 京东,美团,明略数据,网易及其他公司. 马里兰州 Forest Hill - 2015年12月8日 -由超过350个开源项目及创新计划,全部由开发志愿者,治理志愿者及孵化志愿者组成的 Apache软件基金会(ASF),今天宣布Apache Kylin已经从Apache孵化器项目毕业,正式升级成为顶级项目(TLP),这标志着该项目的社区和产品依照ASF精英管理的流程和原则顺利运作.

Apache Kylin发布新版流处理引擎

Apache Kylin在 1.5.0 推出了从流数据进行准实时(Near Real Time)处理功能,可以直接从Apache Kafka的主题(Topic)中消费数据来构建Cube.Apache Kylin 1.5.0的流处理是一次实验性的探索,它打破了以往只能从Apache Hive表构建Cube的局限,将数据从产生到可查询的延迟从小时级降低到了分钟级,满足了一些对实时性要求比较高的场景:但它在实现上存在一些局限︰ 不可扩展︰ 由于是利用单个 Java 进程(而不是利用某种计算框架)对数据

Apache Kylin权威指南1.3 Apache Kylin的工作原理

1.3 Apache Kylin的工作原理 Apache Kylin的工作原理本质上是MOLAP(Multidimensional Online Analytical Processing)Cube,也就是多维立方体分析.这是数据分析中相当经典的理论,在关系数据库年代就已经有了广泛的应用,下面将对其做简要介绍. 1.3.1 维度和度量简介 在说明MOLAP Cube之前需要先介绍一下维度(Dimension)和度量(Measure)这两个 概念. 简单来讲,维度就是观察数据的角度.比如电商的销售