面试题答案
一键面试数据迁移策略
- 按范围拆分:HBase 会根据 Region 的 RowKey 范围对数据进行拆分。当一个 Region 达到设定的大小阈值(如默认10GB),就会在中间某个 RowKey 位置将 Region 一分为二。原 Region 停止服务,新的两个子 Region 会被分配到不同的 RegionServer 上。这样可以大致均匀地分布数据,适用于有序的 RowKey 数据。
- 预拆分:在创建表时,用户可以指定预拆分的键值。通过预先定义拆分点,HBase 会在创建表时就将数据按照这些拆分点分布到不同的 Region 中。这种方式适合已知数据分布规律的场景,能避免 Region 热点问题,在数据导入初期就均匀分布数据。
确保数据一致性和完整性
- WAL(Write-Ahead Log):在写入数据时,数据首先会被写入 WAL 日志,只有 WAL 日志写入成功后,数据才会被写入 MemStore。当 Region 迁移时,WAL 日志也会被迁移到新的 RegionServer。在新的 RegionServer 上,会重放 WAL 日志来恢复数据,确保数据不会丢失,保证了数据的完整性。
- 原子性操作:HBase 的写入操作是原子性的,要么全部成功,要么全部失败。对于单个 Row 的操作,HBase 会保证其在整个迁移过程中的一致性。即使在迁移过程中出现故障,也可以通过 WAL 日志和 Region 的恢复机制来确保数据最终的一致性。
不同规模数据下的表现
- 小规模数据:
- 按范围拆分:拆分成本相对较低,由于数据量少,迁移速度快。但如果数据分布不均匀,可能导致新拆分的 Region 数据量不均衡。
- 预拆分:预拆分的优势不太明显,因为创建预拆分 Region 本身会有一定开销,而小规模数据下热点问题不突出。
- 大规模数据:
- 按范围拆分:随着数据量增大,拆分和迁移过程可能会对系统性能产生较大影响,因为数据迁移量较大。如果拆分点选择不当,可能导致 Region 热点问题。但对于有序数据,按范围拆分能较好地适应数据增长。
- 预拆分:在大规模数据场景下,预拆分能有效避免 Region 热点问题,通过合理设置拆分点,数据能均匀分布在各个 Region 上,提高系统的整体读写性能。预拆分在数据导入初期就规划好数据分布,能减少后期动态拆分带来的性能波动。