在实时数仓中,维度表的建模方式通常是采用雪花模型,而非离线数仓的星型模型。
这是因为离线数仓的维度数据每日全量存储在HDFS中,每日全量关联一次即可。
而实时数仓假如也这样全量关联的话,每一张维度表的数据变化都需要关联维度表的历史数据,历史数据如何获取是个问题。
因此,在实时数仓中,我们不再对业务数据库中的维度表进行合并,仅对一些不需要的字段进行过滤,然后将维度数据写入 HBase 的维度表中,业务数据库的维度表和 HBase 的维度表是一一对应的。
事实表和维度表的关联,使用flink sql时,采用lookup join进行维度表的关联。
在使用flink api时,直接访问外部存储去获得维度数据然后补充到事实表。
这里关于维表表外部存储到选型,建议选用HBase,因为维度关联一般使用主键关联,所以kv类型数据库比较合适,HBase在查询性能,存储能力和性价比上都比较合适。如果维度数据比较少,也可以选择redis。
实际上,最好的方式是Hbase+Redis结合使用。由于flink是流式处理,如果每条数据都去访问Hbase,flink的处理性能不会太好,所以建议使用缓存,将热数据缓存在redis中是一种不错的方式。
如果缓存的方式,flink程序性能还是不够好的话,可以使用flink提供的异步IO功能,用异步的方式去访问HBase和Redis,此时流中的数据可以异步的与外部系统进行交互。注意,访问外部系统的连接要使用支持异步的客户端连接。