Hive元数据上亿级别存储方案的实践

2023-10-27

问题导读

1.什么是元数据 Federation 方案?
2.怎样引入 Federation 方案?
3.怎样改造现有服务?


▍背景
Apache Hive 是基于 Apache Hadoop 之上构建的数据仓库,提供了简单易用的类 SQL 查询语言,适合对大规模数据进行存储、查询操作,被广泛使用。

Hive 元数据 Metadata 包含用 Hive 创建的 Database、Table、Partition 等的元信息。此类元信息一般存储在关系型数据库中,如 Derby、MySQL 等。

在滴滴,我们是将元数据存储在MySQL 里,随着业务的不断增长,Hive 元数据越来越庞大,出现单表存储超过上亿条记录的情况,这种情况下会导致 MySQL查询压力过大,而且在高峰期间,经常导致机器 CPU 使用率达到 100%,影响服务稳定性。

为此,我们开始调研元数据 Federation 方案,实现元数据水平扩展能力,为 MySQL 解压,提升 Hive 稳定性。

▍Federation 方案介绍
 

  • 2.1 Hive 架构体系演变

引入 Federation 之前的 Hive 架构体系:

 

该架构体系中用户使用的 Hive 客户端或者 Hivesever2 服务、Spark 引擎、Presto 引擎等都是访问统一 Hive Metastore 服务获取 Hive 元数据。

Hive Metastore 服务主要是使用 LVS + 多个 Hive Metastore 实例组成。所有的 Hive Metastore 实例共享一套主从 MySQL 环境作为 Hive 元数据存储 DB。

前期工作

为了缓解 Hive 元数据存储 DB(MySQL)查询压力,我们做了很多元数据治理工作,包括长时间无用的库、表、分区清理等。元数据访问限制包括查询分区表分区限制等功能,但这些并没有从根本上解决 MySQL 压力问题。

方案调研
 

  • MySQL 机器查询压力大的问题主要由于 Hive 元数据结构中只存在一个库,库中存在单表超过上亿条记录的情况。那为什么不考虑 MySQL 分库,分表等方案?如果采用 MySQL 分库,分表等方案,需要大量更改 Hive Metastore 接口,这样风险及成本较高,而且后期涉及 Hive 版本升级也会带来更多工作量。

 

  • 基于 Hive Metastore 层实现 Federation(waggle_dance),实现思路主要是以 Hive DB 切分,在 Hive DB 层面将元数据分布多套 MySQL 环境存储,这样对 Hive Metastore 本身不需要做任何修改,这种方案也较好维护。

基于 Hive Metastore Federation 实现后的 Hive 架构体系:

 
 

  • 2.2 waggle_dance 介绍


waggle-dance 是由 Hotels.com 公司开源的一个项目,该项目主要是联合多个 Hive Metastore 数据查询的服务,实现了一个统一的路由接口解决多套 Hive Metastore 环境间的元数据共享问题。

2.2.1 架构流程图
 

从架构图来看, waggle_dance 服务其实是承担 Router 路由的角色,后端配置多个 Hive Metastore 环境,接收客户端的元数据请求,通过 DB 与 Hive Metastore 路由关系将请求具体转发到相应的 Hive Metastore 环境执行操作。

这些操作对于客户端来说完全透明,对于客户端只是访问一套 Hive Metastore 的环境。

2.2.2 内部组件解析

waggle_dance 基于 Spring-boot 框架实现,主要包括如下几个模块:

 
 

  • WaggleDance容器


服务启动类,主要初始化容器 Spring boot,加载 Listener,每个关键的类通过注解方式加载,初始化。
 

  • YamlFederatedMetaStoreStorage 模块


维护需要依赖 Hive Metastore 环境的配置信息及 Hive Database 名字到 Hive Metastore 服务之间的路由信息。

当前支持配置一个主 Hive Metastore 及多个从 Hive Metastore 策略。

主 Hive Metastore 与从 Hive Metastore 配置主要区分的属性 access-control-type。

 

主 Hive Metastore 定义属性 access-control-type:对当前环境的 Hive 元数据操作支持以上 4 种策略。

从 Hive Metastore 定义属性 access-control-type:对当前环境的 Hive 元数据操作只支持 READ_ONLY 只读策略。
 

  • 文件配置管理模块



WaggleDanceConfiguration: ThriftServer 服务属性配置
GraphiteConfiguration: Graphite 监控属性配置
 

  • ThriftServer 模块


实现 ThriftServer 服务,基于 Hive ThriftHiveMetastore API 对外提供 RPC 服务。接口包括 create_database、drop_database、create_table 以及汇总信息查询如 get_all_databases、set_ugi 等操作。

这样可以做到完全兼容 Hive 客户端,Hivesever2 等服务请求协议,最终通过路由解析至对应的 Hive Metastore 建立连接并调用同名方法执行操作。

几个需要注意的地方:

接口的操作是区分只读和读写等策略,会根据路配置文件中定义的 Hive Metastore 的 access-control-type 属性决定。


对于那些无法通过库名来路由的接口,都是转发至主 Hive Metastore 环境执行操作。
 

  • Monitor 模块



MonitoringConfiguration、MonitoredAspect:服务监控逻辑,主要采用 Java 监控类库 Metrics 实现(项目官网 http://metrics.dropwizard.io/ ),该库支持将相关监控信息通过 Ganglia 和 Graphite 等工具进行展示,主要对 JVM 内存,线程执行状态,Hive 元数据相关操作等监控。
 

  • FederationsAdmin 管理模块



FederationsAdminController:restful 接口实现,供管理员使用,可动态完成对 Federation Metastore 注册、注销及 Hive Database 名字与 Metastore 路由信息修改。

▍滴滴实践
 

  • 3.1 服务改造

当前 waggle_dance 功能不能完全满足我们的使用要求,需要进行扩展。改进点如下:
 

  • 目标是需要支持对多套 Hive Metastore 环境进行读写元数据操作,所以扩展 waggle-dance-federation.yml 文件模板支持配置多个主 Hive Metastore。
  • MappingEventListener 增加 MULTI_PRIMARY 策略。根据多个主 Hive Metastore 模式实现对应的 Hive Database 名字->Metastore mapping 路由信息类。
  • 修改 FederatedHMSHandler 等类相关处理逻辑(兼容 Hive 1.2.1 与 2.x 版本 Hive ThriftHiveMetastore API)。这样做的好处是在客户端保持 Hive 1.2.1 版本的情况下可以完全兼容后端多个 Hive 版本 Metastore 服务,方便后期对 Metastore 服务版本升级。
  • 修改监控模块,由于公司内部是使用 Ganglia 工具进行监控,将 Graphite 改造为 Ganglia 并优化监控指标。
  • 相关性能优化,为了避免每个客户端连接过程中都需要建立一个 Database->Metastore mapping 路由信息耗费的内存操作,每个 waggle_dance 实例启动的时候缓存一个 Hive Database->Metastore mapping 路由信息,该信息会被每个客户端连接请求的线程共用。
    对于 Database->Metastore mapping 路由信息的维护,每个 waggle_dance 实例会定期请求后端多套 Hive Metastore 服务进行数据更新。


改造后 waggle_dance 架构流程图:

 
 

  • 3.2 部署情况

为了将线上 MySQL 中的 Hive 元数据逐步分布到多套 MySQL 环境存储,需要部署一套新的 MySQL 环境(对应新的 Hive Metastore环境)。

经过内部压力测试,我们得出结论,一个 waggle_dance 实例可以对接于一套 Hive Metastore 环境。考虑 Hive Metastore 环境横向扩展及保证服务的稳定性,部署了一套 waggle_dance 集群由 LVS+4 个 waggle_dance 实例组成。

后续会将已有 MySQL 中存储的 Hive 库,表元数据信息逐步迁移到新的 MySQL 环境,为了迁移过程中减少对用户使用的影响,未来还需要开发 waggle-dance 按表路由等功能。

▍总结

当前方案上线已经稳定运行几个月,新的体系架构会支持横向扩展多套 MySQL 环境,从根本上解决由于一套 MySQL 环境带来的性能及服务稳定问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive元数据上亿级别存储方案的实践 的相关文章

随机推荐

  • 软件测试需要学什么?软件测试技能图谱

    很多新手 不知道软件测试学习该如何开始 软件测试需要掌握哪些知识 下面是根据本人的理解 粗略整理的一个学习大纲 基本上涵盖了软件测试工程师需要掌握的全部技能 希望对刚入行或者准备学习测试的朋友提供一点指引 1 测试基础理论 不管有没有计算机
  • docker 搭建 Jenkins 容器 ,拉取git代码

    Docker 搭建 Jenkins 容器 拉取git代码 一 安装jenkins 前提条件 宿主机安装docker 1 拉取镜像 docker pull jenkins jenkins 2 查看镜像 docker images 列表中有je
  • C++ 引用作为函数返回值

    1 以引用返回函数值 定义函数时需要在函数名前加 2 用引用返回一个函数值的最大好处是 在内存中不产生被返回值的副本 引用作为返回值 必须遵守以下规则 1 不能返回局部变量的引用 主要原因是局部变量会在函数返回后被销毁 因此被返回的引用就成
  • unity音效添加

    音频资源AudioClip 播放的音频通过摄像头上的Audio Listener监听 Audio Listener有且只有一个 否则会报警告 创建一个空对象 重命名为Music Player 音频源 为其添加上Audio Souce组件 将
  • Mysql - 直接查询存储的Json字符串中的数据

    我们平时使用mysql 出于项目需求 可能需要直接将Java对象或者一个大json 直接存到表中的某个字段中 使用的时候再查出来 反序列化到对象或者一个Map中 方便我们操作 大多时候 我们可能并不需要所有的数据 只想使用这个对象或者jso
  • 详解synchronized与Lock的区别与使用

    引言 昨天在学习别人分享的面试经验时 看到Lock的使用 想起自己在上次面试也遇到了synchronized与Lock的区别与使用 于是 我整理了两者的区别和使用情况 同时 对synchronized的使用过程一些常见问题的总结 最后是参照
  • 关于easyExcel实体字段对应日期类型格式化问题

    可以写一个实体转换器来实现easyExcl中的Converter接口 可参考easyExcel官方文档中的 Alibaba Easy Excel 简单 省内存的Java解析Excel工具 读Excel
  • MATLAB实现传递函数

    1 简单的传递函数模型 num 1 10 den 1 5 4 3 2 G tf num den 2 零极点模型 KGain K 系统增益K Z 1 2 3 零点 P 4 5 6 极点 G zpk Z P KGain 3 反馈系统 G1 tf
  • 阿里马涛:重新定义云时代的开源操作系统

    作者 Just 出品 CSDN ID CSDNnews 随着云计算的发展 以及Linux平台的不断发展和生态系统的不断完善 越来越多的企业 云服务提供商都将Linux作为其数据中心的首选操作系统 不过 作为云基础设施的底座 针对云上产品和环
  • HyperLedger Fabric链码开发及测试

    https blog csdn net TripleS X article details 80550401 https blog csdn net weixin 44676392 article details 87938451 http
  • C# 实现多种语言切换,通过VS实现

    步骤 1 在要更换语言的界面 如Form1界面 选择属性 Language 选择要使用的语言 如下图 2 添加完语言之后VS会自动生成对应语言的 resx文件 通过该文件可以编辑语言 由于VS已经给我们添加了该界面的所有字段和变量 所以我们
  • 海思his35xx安防芯片音视频媒控驱动基础篇MIPI RX模块(一)

    先给自己打个广告 本人的微信公众号正式上线了 搜索 张笑生的地盘 主要关注嵌入式软件开发 股票基金定投 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 二维码如下 一 背景介绍 海思芯片的应用方向大致分为如下
  • python安装库出现retrying-Python之retrying

    retrying是一个很好用的关于重试的Python包 可以用来自动重试一些可能会运行失败的程序段 为什么选择retrying 我们在写一些程序的时候 会去调用一些外部资源 组件 这些外部程序对我们来说是不可控的 所以它们不可用 运行失败都
  • SqlServer数据库删除数据

    数据库删除数据的三种代码方式 1 删除表结构及所有数据 drop table table name 2 恢复表格出厂设置 id清空 truncate table table name 3 删除表数据 delete from table na
  • 期货怎么满仓(期货为什么不能满仓操作)

    期货满仓怎么bao cang q 您是想问期货满仓爆仓怎么处理吗 满仓交易的风险就是会强制平仓 也就是所谓的爆仓 爆仓是指 1 投资者帐户权益为负数 表明投资者不仅输光了全部保证金而且还倒欠期货经纪公司债务 2 发生爆仓时 投资者必须及时将
  • 红帽认证主要考哪些内容呢

    红帽认证考试主要考以下内容 RH124 红帽系统管理I 主要涉及访问命令行 从命令行访问文件 获取RHCEL7帮助信息 创建及查看编辑文件 管理用户和用户组 管理文件和目录权限 监视和管理Linux进程 控制服务和后台进程 管理OpenSS
  • Android自定义自动换行LinearLayout探索与实现

    Android自定义自动换行LinearLayout探索与实现 在Android开发中 我们经常需求实现一些特定的布局效果以满足用户的需求 其中之一就是自动换行布局 即当容器内的子视图数量超过一行时 自动将多余的子视图放到下一行进行显示 本
  • go语言试用标准c 库,Go语言开发(十三)、Go语言常用标准库三

    Go语言开发 十三 Go语言常用标准库三 一 sync 1 sync简介 sync提供基本的同步原语 如sync Mutex sync RWMutex sync Once sync Cond sync Waitgroup 除了Once和Wa
  • Vue Collapse 中嵌套 Collapse 折叠板在tab切换后打不开了

    name也要改成indx 监听tab改变 清空vModel 在给vModel赋值 这样就解决了
  • Hive元数据上亿级别存储方案的实践

    问题导读1 什么是元数据 Federation 方案 2 怎样引入 Federation 方案 3 怎样改造现有服务 背景Apache Hive 是基于 Apache Hadoop 之上构建的数据仓库 提供了简单易用的类 SQL 查询语言