假设,假设我在数据仓库设置中有一个星型模式。有一个非常非常长的事实表(想想数十亿到数万亿行)和几个低基数维度表(想想 100 个维度表)。每个指向维度表主键的事实表外键都被位图索引。每个维度表的主键也是位图索引的。这都是为了快速加入。都很标准。
假设数据仓库开始出现性能下降。从位图连接返回结果所需的时间越长,事实表越长。业务需求是事实表不断增长(我们不能将超过一年的数据移至归档存储)
我正在考虑以下解决方案:
- 哈希分区事实表,但这只是暂时阻止了不可避免的增长问题。
- 数据库将物理星型模式数据库划分为多个模式/数据库。1..N 个事实表及其维度副本,每个都保存通过 hash(1..N) 函数分配给它们的数据,该函数在单独的 ETL 暂存数据库中执行以确定事实行的数据库/模式(由 ETL 产生过程)将进入。如果任何维度发生更改,请将更改复制到其他数据库对应的维度。同样,这不会作为永久解决方案。
- 折叠维度并将所有维度值直接存储在事实表中。然后,将事实表导入到 HBASE on Hadoop。你得到一个巨大的 HBASE 表,没有维度表的键值存储。我会这样做是因为连接在 HBASE 中的成本过高(因此实际上没有维度连接,只需在维度列上强制执行维度值)。
以前有人做过吗?
有人对解决方案#3有任何提示吗?
就通过快速读取进行扩展而言,HBASE 解决方案是最优的吗?
就写入而言,我不关心快速写入,因为它们会在下班时间作为批处理过程完成。
如果有人选择了解决方案 1 或 2,是否有人使用了一致的散列算法(如果更多分区、散列键是动态创建的,以避免像在普通旧散列中那样重新映射)?没有完整重新映射的分区数量的动态增长可能不是一个选项(就分区表而言,我还没有看到它在实践中完成)所以在我看来,任何分区解决方案都会导致扩展问题。
将具有多维的巨型事实表(传统的 DW 星型模式)移动到 HBASE 巨型无量纲表有什么想法、建议和经验?
相关问题:
如何在数据中聚合传统上驻留在物化视图中的数据集合(或者作为链接到与最细粒度的事实表相同的维度的单独事实表 - 即每小时/每天/每周/每月,其中基本事实表是每小时一次)仓库映射到 HBASE?
我的想法是,由于 HBASE 中没有物化视图,因此聚合数据集合存储为 HBASE 表,这些表在最细粒度、最低级别的事实表发生更改时随时更新/插入。
对 HBASE 中的聚合表有什么想法吗?是否有人使用 Hive 脚本从本质上模仿物化视图的行为,以在更改最细粒度的事实表时更新存储在其中的聚合数据的辅助 HBASE 表中的聚合列数据(即daily_aggregates_fact_table、weekly_aggregates_fact_table、monthly_aggregates_fact_table)?