知乎 Hive Metastore 实践:从 MySQL 到 TiDB
作者介绍
胡梦宇,知乎数据架构平台开发工程师
背景
数据的增长远比删除的要快,治标不治本;
在删除超大分区表(分区数上百万)的分区时,会对 MySQL 造成一定的压力,只能单线程去做,否则会影响其他正常的 Hive 查询,效率极其低下;
在知乎,元信息删除是伴随数据一起删除的(删除 HDFS 过期数据,节约成本),Hive 的用户可能存在建表不规范的情况,将分区路径挂错,导致误删数据。
技术选型
已有方案
最终方案
其实问题主要在于,当数据量增加时,MySQL 受限于单机性能,很难有较好的表现,而将单台 MySQL 扩展为集群,复杂度将会呈几何倍上升。如果能够找到一款兼容 MySQL 协议的分布式数据库,就能完美解决这个问题。因此,我们选择了TiDB(https://github.com/pingcap/tidb)。
TiDB 是 PingCAP 开源的分布式 NewSQL 数据库,它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适 OLAP 场景的混合数据库。
选用 TiDB 的理由如下:
1. TiDB 完全兼容 MySQL 的协议,经过测试,TiDB 支持 Hive Metastore 对元数据库的所有增删改查操作, 使用起来不存在兼容性相关的问题。因此,除了将 MySQL 的数据原样 dump 到 TiDB,几乎没有其他工作需要做;
2. TiDB 由于其分布式的架构,在大数据集的表现远远优于 MySQL;
3. TiDB 的可扩展性十分优秀,支持水平弹性扩展,不管是选用分库分表还是 Federation,都可能会再次遇到瓶颈,届时需要二次切分和扩容,TiDB 从根本上解决了这个问题;
4. TiDB 在知乎已经得到了十分广泛的应用,相关技术相对来说比较成熟,因此迁移风险可控。
Hive 架构
迁移前

迁移后

迁移流程
运行概况
ALTER TABLE '${table_name}' DROP IF EXISTS PARTITION(...);
ALTER TABLE '${table_name}' ADD IF NOT EXISTS PARTITION(...);
SELECT `A0`.`PART_NAME`,`A0`.`PART_NAME` AS `NUCORDER0` FROM `PARTITIONS` `A0` LEFT OUTER JOIN `TBLS` `B0` ON `A0`.`TBL_ID` = `B0`.`TBL_ID` LEFT OUTER JOIN `DBS` `C0` ON `B0`.`DB_ID` = `C0`.`DB_ID` WHERE `C0`.`NAME` = '${database_name}' AND `B0`.`TBL_NAME` = '${table_name}' ORDER BY `NUCORDER0`
展望
完整项目请查看:
https://github.com/pingcap-incubator
PingCAP Incubator 完整文档参考:
https://github.com/pingcap/community/tree/master/incubator


关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 让百姓过上好日子 总书记惦念在心 7904445
- 2 沪上阿姨推出子宫形玩偶引争议 7808267
- 3 泽连斯基穿上正装 特朗普:我很喜欢 7712092
- 4 拔节生长 中国制造锻造更强筋骨 7617822
- 5 男孩自查文献确诊罕见卟啉病 7522924
- 6 男子上下班途中把桥洞反光板擦干净 7423608
- 7 多名男女在草原上跳起“纸片舞” 7329500
- 8 印尼国防部长激动宣布要买中国歼10C 7235252
- 9 70岁大爷把跳楼机坐成摇摇椅 7140814
- 10 网红“柴怼怼”被正式逮捕 7039834