作者 | 胡梦宇,知乎数据架构平台开发工程师

责编 | 屠敏

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

背景

ApacheHive 是基于 Apache Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并且提供了 Hive SQL 进行查询和分析,在离线数仓中被广泛使用。

HiveMetastore 是 Hive 的元信息管理工具,它提供了操作元数据的一系列接口,其后端存储一般选用关系型数据库如 Derby、 MySQL 等。现在很多除了Hive 之外计算框架都支持以 Hive Metastore 为元数据中心来查询底层 Hadoop 生态的数据,比如 Presto、Spark、Flink 等等。

在知乎,我们是将元信息存储在 MySQL 内的,随着业务数据的不断增长,MySQL 内已经出现单表数据量两千多万的情况,当用户的任务出现  Metastore 密集操作的情况时,往往会出现缓慢甚至超时的现象,极大影响了任务的稳定性。长此以往,MySQL 在未来的某一天一定会不堪重负,因此优化 Hive 的元数据库势在必行。

在去年,我们做过数据治理,Hive 表生命周期管理,定期去删除元数据,期望能够减少 MySQL 的数据量,缓解元数据库的压力。但是经过实践,发现该方案有以下缺点:

  1. 数据的增长远比删除的要快,治标不治本;

  2. 在删除超大分区表(分区数上百万)的分区时,会对 MySQL 造成一定的压力,只能单线程去做,否则会影响其他正常的 Hive 查询,效率极其低下;

  3. 在知乎,元信息删除是伴随数据一起删除的(删除HDFS 过期数据,节约成本),Hive 的用户可能存在建表不规范的情况,将分区路径挂错,导致误删数据。

因此,我们需要寻找新的技术方案来解决这个问题。

技术选型

▐  已有方案

业内目前有两种方案可供借鉴:

1. 对 MySQL 进行分库分表处理,将一台 MySQL 的压力分摊到 MySQL 集群;

2. 对 Hive Metastore 进行 Federation,采用多套 Hive Metastore + MySQL 的架构,在 Metastore 前方设置代理,按照一定的规则,对请求进行分发。

但是经过调研,我们发现两种方案都有一定的缺陷:

1. 对 MySQL 进行分库分表,首先面临的直接问题就是需要修改 Metastore 操作 MySQL 的接口,涉及到大量高风险的改动,后续对 Hive 的升级也会更加复杂;

2. 对 Hive Metastore 进行 Federation,尽管不需要对 Metastore 进行任何改动,但是需要额外维护一套路由组件,并且对路由规则的设置需要仔细考虑,切分现有的 MySQL 存储到不同的 MySQL 上,并且可能存在切分不均匀,导致各个子集群的负载不均衡的情况;

3. 我们每天都会同步一份 MySQL 的数据到 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 架构

▐  迁移前

其中,Zue是知乎内部使用的可视化查询界面。

▐  迁移后

在 Hive 的元数据库迁移到 TiDB 了以后,架构几乎没有任何变化,只不过查询的压力由单台 MySQL 节点分摊到了整个 TiDB 集群,集群越大,查询效率越高,性能提升越明显。

迁移流程

1. 将 TiDB 作为 MySQL 的从库,实时同步数据;

2.  Metastore 缩容至 1 个,防止多个 Metastore 分别向 MySQL 及 TiDB 写入,导致元数据不一致;

3. 选取业务低峰期,主从切换,将主切为TiDB,重启  Metastore ;

4.  Metastore 扩容。

此迁移过程对业务几乎无感,成功上线。

运行概况

1. 我们从 Hive 层面对数据库进行了测试,模拟业务高峰期,多并发对百万分区级别的表增删分区,所执行的 Hive SQL 如下:

   ALTER TABLE '${table_name}' DROP IF EXISTS PARTITION(...);ALTER TABLE '${table_name}' ADD IF NOT EXISTS PARTITION(...);

花费时间从 45s-75s 降低到了 10s 以下。

2. 我们从元数据库层面测试了一些  Metastore 提交的 SQL,尤其是那些会造成元数据库压力巨大的 SQL,例如:

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`

当某个 Hive 表的分区数量十分巨大时,这条 SQL 会给元数据库造成相当大的负担。迁移前,此类 SQL 在 MySQL 运行时间约为 30s - 40s,迁移后,在TiDB 运行仅需 6s - 7s,提升相当明显。

3. 数据同步平台上的Hive 元数据库内的 SDS 表的同步任务时间从 90s 降低到 15s。

展望

在 Hive Metastore 的场景下,我们已经感受到了 TiDB 在大数据应用场景下的魅力。后续我们希望 TiDB 能够成为跨数据中心的服务,通过数据副本的跨机房部署,打通离线与在线,让离线场景能够在对在线服务无压力的情况下为数据提供实时的ETL 能力,解决离线 ETL 任务实时性差的问题。为此,我们正在开发 TiBigData(https://github.com/pingcap-incubator/TiBigData)。

目前其作为PingCAP incubator 的孵化项目。由来自知乎的 TiKV Maintainer 孙晓光发起。PingCAP Incubator 旨在梳理一套相对完整的TiDB 生态开源项目孵化体系,将关于 TiDB 开源生态的想法与实际生产环境中的需求相关联,通过开源项目协作方式,共同将想法落地。力求想法项目化。从「我有一个想法」到「项目顺利毕业」,PingCAP提供一系列的资源支持,确保所有项目孵化的流程都有章可循,同时结合项目不同特征及孵化目的,将项目划分为 Feature 类和 Project 类,针对性地给出孵化流程建议。PingCAPIncubator 中的项目有:TiDB Dashboard、TiUP、TinyKV,TiDB wasm 等。

  • 完整项目请查看:https://github.com/pingcap-incubator

  • PingCAP incubator 完整文档参考https://github.com/pingcap/community/tree/master/incubator

目前TiBigData 项目已经为 TiDB 提供了 Presto 与 Flink 的只读支持。后续我们希望在 PingCAP Incubator 计划的扶持下同社区一起建设TiBigData 项目,力图为 TiDB 带来更加完整的大数据能力。

更多精彩推荐
☞国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?
☞无代码时代下,程序员不够用了!
☞漏答题、偏科、多次复读,30 位互联网大佬考上啥大学了?
☞云计算与星辰大海的结合——不要回答,来自百亿光年外的未知信号
☞用机器学习还原《隐秘的角落》那些被修改的台词
☞一文速览 Eth2.0 的 7 大客户端进展
点分享点点赞点在看

知乎 Hive Metastore 实践:从 MySQL 到 TiDB相关推荐

  1. hive metastore日志中报错message:Metastore contains multiple versions

    hive metastore日志中报错: Exception in thread "main" java.lang.RuntimeException: java.lang.Runt ...

  2. mysql 迁移到tidb_通过从MySQL迁移到TiDB来水平扩展Hive Metastore数据库

    mysql 迁移到tidb Industry: Knowledge Sharing 行业:知识共享 Author: Mengyu Hu (Platform Engineer at Zhihu) 作者: ...

  3. Hive MetaStore常用的元数据在Mysql中对应的表

    1.Hive中databases的信息->DBS 字段关联,以及表 TBL_ID(TBLS)-> SD_ID(SDS)-> CD_ID(CDS)-> SERDE_ID(SERD ...

  4. Hive metastore三种配置方式

    Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适合生产环境.Hive官方wiki详细介绍了这三种方式,链接为:Hive Metastore. 一.本地d ...

  5. hive to mysql_Hive And MySQL安装及设置

    安装MySQL服务端 [root@centos local]# rpm -i MySQL-server-5.5.31-2.el6.i686.rpm PLEASE REMEMBER TO SET A P ...

  6. Hive MetaStore 在快手遇到的挑战与优化

    分享嘉宾:王磊@快手 编辑整理:Frank 导读:快手基于Hive构建数据仓库,并把Hive的元数据信息存储在MySql中,随着业务发展和数据增长,一方面对于计算引擎提出了更高的要求,同时也给Hive ...

  7. 报错:org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.

    报错环境: CDH中集成的hive服务,启动报错,所以初始化一下元数据. 配置文件:/etc/hive/conf hive-site.xml 命令目录:/opt/cloudera/parcels/CD ...

  8. Hive学习和配置Mysql

    1.Hive简介  起源自facebook由Jeff Hammerbacher领导的团队  构建在Hadoop上的数据仓库框架  设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海 ...

  9. org.apache.hadoop.hive.metastore.api.MetaException: Get request failed :xxxx

    报错复现如下: Flink SQL> create database testdb; [ERROR] Could not execute SQL statement. Reason: org.a ...

最新文章

  1. TCP/IP总结(4)TCP 之最大消息长度
  2. HDU 3037 Saving Beans (Lucas法则)
  3. 订单库存是否与库存地有关
  4. Android异常总结---ActivityManager: Warning: Activity not started,its current task has been brought to th
  5. 《C#本质论(第4版)》一1.2 C#语法基础
  6. 基于梯度的权重更新优化迭代算法
  7. 举世闻名的 SQL 注入是什么?这个漫画告诉你!
  8. 2013年计算机试题(四),2013年计算机一级考试试题(精简版):第四套
  9. 用python写个脚本把QQ空间多年动态删了
  10. Educational Codeforces Round 60 (Rated for Div. 2) E. Decypher the String(构造)
  11. 怎样把两个表格合并成一个
  12. C# Chart之双Y轴图表实现
  13. 0.10版本后的kafka配置producer和comsumer的server参数
  14. 测试的发展前景怎么样?
  15. 怎么修改win8计算机用户名和密码忘了怎么办,win8怎么修改用户名 Win8修改用户名与目录名的办法...
  16. 用php爬取网页数据
  17. Sci-Fi 科幻迷们,爱死机第二季来啦 | Mixlab 科幻实验
  18. windows使用vnc连接ubuntu系统显示灰色
  19. win7 64位 安装tensorflow GPU版本
  20. 【压缩感知合集1】(背景知识)香农奈奎斯特采样定理的数学推导和图解分析

热门文章

  1. kaike的FLAGs
  2. 23-[模块]-logging
  3. Centos7的iso everything与DVD以及Live的区别
  4. git版本库的创建和yaf框架环境的部署
  5. C#,COM口,接收,发送数据
  6. ubuntu配置LAMP
  7. 美国智能机市场Android份额逼近苹果iOS
  8. 集成Jupyter notebook的工具或平台
  9. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】
  10. Pytorch register_forward_hook()简单用法