基于 Impala 构建实时用户行为分析引擎可以实现对用户行为的实时监控、产品改进、商业决策等需求。选择 Impala 作为查询引擎是因为其足够灵活、足够快、较髙的查询效率和较低的容错性。然而,Impala 的内存需求较高。基于 Impala 的系统架构包括客户端操作、服务端日志、订单数据、注册数据、其他业务数据、SDK / 导入工具等。数据模型包括用户行为表、用户表、客户端操作、服务端日志、订单数据、注册数据、其他业务数据等。实时导⼊入通过 Parquet 和 Kudu 的融合实现,可以同时使⽤用两种存储格式,Kudu 存储实时数据、Parquet 存储历史数据,定时进⾏行行数据转储 Kudu -> Parquet,使⽤用视图进⾏行无缝融合,对查询层完全透明,优化 UNION ALL 的实现,消除不不必要的数据拷贝。查询优化需要合理理的硬件配置,包括 CPU、IO、⽹络、内存等,性能要求3 节点,10秒内完成 10 亿条⾏行行为数据的分组聚合。实现复杂分析模型需要从用户行为表抽取需要的事件数据,事件数据按照用户 ID 分组,每个分组内按照时间排序,进⾏行行具体的转化逻辑计算,实现方式是实现⾃自定义的分析函数(UDTF ),需要对 Impala 进⾏行行深层改造,优化最耗时的步骤:全局排序 -> 预排序 + 归并排序。实现抽样查询是为了节约成本、提⾼高效率,查询抽样 vs 采集抽样:存储便便宜,应该尽量量存储最全的数据,抽样分析的局限性,例例如细分维度的分析。抽样逻辑是按照用户抽样,以保证⼀一个⽤用户的⾏行行为的完整性。抽样实现是根据⽤用户 ID 的 Hash 值得到抽样编号,Parquet / Kudu 数据按照抽样编号排序,Impala 进⾏行行查询扫描时根据需要只扫描需要部分的数据。