Apache Kudu 在**医疗科技的生产实践

目录

说明

医疗场景下数据特点

KUDU 的介绍

 kudu 架构

kudu 文件组织形式

kudu的生产实践

技术选型

整体的架构

项目遇到的问题

参考资料


说明

本文主要介绍APACHE KUDU 在**医疗科技数据实时分析场景下的实践,内容包括:

医疗场景下数据特点

kudu的介绍

kudu在**医疗科技的应用

医疗场景下数据特点

EAV(实体属性值)模型存储数据时每一行代表一个属性,多行能代表不同的属性,在添加新的属性时,只需要向存储中添加新的一行的即可,而不必像ER(实体关系)模型需要频繁修改的整个表结构,因此在数据录入、字段属性修改频繁的场景下带来了极大的便利性。

在医疗数据存储过程中,由于病人数据临床指标录入口径不一,且这些指标属性具有随意修改,关联复杂、属性波动大等特点,常常采用典型的EAV模型存储。如下图EAV模型所示:

image2022-4-6_17-15-31.png

                                                           (图1 EAV模型示例图)

     

由于EAV模型每次查询都必须关联多个表,数据存储在关系型数据库中,在数据体量大的情况下,查询分析性能非常差。

KUDU 的介绍

GOOGLE BIGFILE 解决了大数据批量写入、扫描分析的问题,但对于数据的随机写,修改等流式数据写入显得力不从心。BIGTABLE 弥补了BIGFILE 在流式数据写入更新能力的不足,但同时却缺乏BIGFILE 类似的数据快速分析扫描能力。

折中的方案是提供一个实时模块与批处理模块,实时模块实时接收批次数据流的随机写入,批处理模块则提供数据的快速扫描分析。实时模块实时接收数据写入,在内存中排序并达到一定阈值后,触发compaction,将数据压缩成可快速扫描分析的列式存储文件块,列式存储的文件块再以partition文件的形式添加至历史基础数据中供外部系统查询,这样的系统就可以同时具有数据的高吞吐写入修改,同时又具备高分析扫描性能,但这样的架构会很复杂,既要处理流式数据的写入,还要小心的处理流式数据flush成列式文件以及分区合并之间的衔接,这样的架构如下图2所示:

image.png

                                                            (图2 一种将流批拼接的架构示例图)

 kudu 架构

kudu为了应对上述的问题应运而生,如下图3所示,kudu集群由master和tablet server(简称tserver)组成,每个tserver有包含多个tablet,kudu使用raft 算法来解决数据一致性问题,tablet master与follow之间互为副本,数据每次写入首先写入leader 然后复制给followers,master一旦受到大多数副本(半数以上)的数据写完成反馈,就认为这次写操作成功。如下所示,tserver上的tablet 既可能是其他tablet的leader,又可能是其他tablest的follower。

image.png

                                                                (图3 kudu架构)

kudu 文件组织形式

值得注意的是,在kudu中,强调主键的概念,因为所有row变更都基于主键进行的,这也影响了kudu如何存储和管理数据。数据写入kudu后就会根据数据操作类型(insert,update,delete)写成不同的操作文件格式,其中当 update、delete类型的更新数据在memrowset中,还未刷入磁盘时,所有操作类型数据都写入memrowset中,memrowset中的数据会在达到一定阈值后会刷入磁盘形成base data;当 update、delete类型的更新数据在diskrowset中时,由于更新已经编码的数据成本很大,考虑数据更新的性能,会在内存中形成deltamemstore文件,其后会flush到磁盘以deltafile存在。为了追溯历史数据,delta数据的所有变更后的操作被记录在redo records文件中,而合并形成base file的变更操作记录在undo records中。文件形成过程如下图4所示:

image.png

                                                (图4 kudu文件组织形式) 

tablet 会产生很多diskrowsets,并伴随行数的更新会产生很多的redo 文件,每次写入一条记录都会查询这条记录是否已经存在,都会扫描rowset的bloom filters,零碎的bloomfilter查询与diskrowset扫描若不加以处理会导致写性能问题。同时因为每个rowset文件有会有多个redo delta文件,这也会对文件查询扫描产生影响。 kudu通过不断的合并处理这些问题,在kudu中有3中类型的合并:

(1)minor delta 合并,这种操作就是不需要与base文件打交道,直接合并delta小文件成大文件,这使得只有扫描少数delta文件就可以获取单行记录的版本数据。

(2)major delta 合并。这种操作会将redo 记录迁移至undo中,同时更新base文件,期间redo记录被合并至base文件中,先前的undo记录也会被本次替换掉。

(3)rowset合并,这种操作师将rowset合并,这会大量的减少bloomfilter、索引文件,提升写性能。

kudu的生产实践

公司业务数据主要是各个药企、医院、病人的采集数据,这些数据的特点是数据维度变更频繁,同时药企,医院基于这些数据分析的客户在平台上以随机查询分析为主,没有固定的数据分析模式,且数据主要存储在关系型数据库mysql当中。在架构早期,公司数据录入以EAV模型存储在mysql数据库中,客户通过公司报表平台自助查询分析数据,随着公司业务的扩张,这种架构导致的问题是数据分析查询慢,直接查询mysql 数据库,常常因为一个复杂的sql导致整个mysql宕机,不可用等,DBA运维工作量大,同时也影响上游数据的录入,客户体验差,于是对架构升级。

技术选型

结合公司应用场景,组件应具备如下特点和要求:

频繁更新能力:根据医疗场景,数据源中数据更新非常频繁,有时甚至更新行大于了写入行,因此要求该组件具备快速更新,使用资源尽量小,更新代价低等特点。

实时性:作为盈利的关键组件,需要数据录入与分析的时间差小,最好是数据录入即可分析,客户对于中间链路完全无感知,最好在秒级别。

高可用,维护性强:需要组件具有高可用能力,当某个节点出现事故时,能快速恢复,客户无感知,极端场景下,通过人工干预简单操作即可快速恢复。

具备上述功能的产品只有kudu和hudi,其中后者是基于kudu架构参考的实现,并经过数据测试后发现。读性能上,在批量扫描场景下发现hudi性能优于kudu,其他场景下查询性能均比kudu要差,如下图5所示kudu 与hudi读性能测试对比:

程序结果图.png

                                      (图5 APACHE KUDU 与APACHE HUDI查询性能对比)

其中Q10,Q11在批量全表非主键扫描下,hudi比kudu要优越,其他场景下均慢些。

频繁实时更新能力上,hudi实时更新性能在分钟级别,kudu在单秒左右,hudi实时更新能力往往表的数据量成反比,时间具有不可预测性,kudu具有更稳定性。

可维护性上,kudu以服务的形式运行,几乎或很少需要人为手动处理,而hudi的读写需要更多客户端操作支持。

整体的架构

                                                            (图6 使用kudu后的架构)

如上图所6示,改造后的架构,数据源通过flink cdc接入mysql binlog,将数据写入kafka,kafka中的数据会被立刻消费同步至kudu集群,数据应用端可以通过impala、spark、flink实现数据的自主分析,BI表报产出等。由于数据取数放在了kudu集群,数据分析查询响应时间大大缩短,提升了客户的体验,同时数据源的录入更加稳定,事件也大幅度降低。

项目遇到的问题

  • 当tserver上tablet数量过多时,集群任务过重,过多时,出现心跳超时情况,加大raft_heartbeat_interval_ms 的时间
  • 当处理任务过多的场景下,出现服务队列已满,提高rpc_service_queue_length 的大小

参考资料

https://kudu.apache.org/kudu.pdf

Apache Kudu Read & Write Paths - Cloudera Blog

https://boss.dima.tu-berlin.de/presentations/boss19.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LCD—STM32液晶显示(4.液晶控制代码讲解)

目录 STM32液晶控制代码讲解 液晶接口封装介绍 使用LCD的配置步骤 内存操作要使用volatile进行修饰 图形绘制实现 绘制矩形 重点补充 STM32液晶控制代码讲解 液晶接口封装介绍 指南者液晶接口原理图 左边DB00—DB15表示液晶屏的数据线引脚,分别对应STM32的F…

【无线通信模块】什么是PCB板载天线,PCB板载天线UART/USB接口WiFi模块

基于射频技术的无线模块需要通过天线来发射和接收电磁波信号,市场上常见的天线类型有陶瓷天线、板载天线、棒状天线以及外接天线,外接天线是通过在PCB板上预留IPEX座子,可选天线类型就比较多。本篇SKYLAB小编带大家了解一下板载天线的UART接口…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时,可以在安装更少的预装应用程序情况下,获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

MVVM 实现记录文本

1. MVVM 框架说明: Model - 数据层 View - 视图层 ViewModel - 管理模型的视图 2. 资源文件 2.1 启动图标: AppIconhttps://img-blog.csdnimg.cn/8fa1031489f544ef9757b6b3ab0eddbe.png 2.2 Display Name: Do Stuff 2.2 颜色图: 2.3 项目结构图: 3. Model 层实现&a…

设计模式——享元模式

享元模式 定义 享元模式(Flyweight Pattern)是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优缺点、应用场景 优点 可以大大减少应用程序创建对象的数量,降低程序内存占用。 缺点 提高了系统的复杂度&…

F#奇妙游(14):F#实现WPF的绑定

WPF中的绑定 绑定在UI开发中是一个非常重要的概念,它可以让我们的UI界面和数据模型之间建立起联系,当数据模型发生变化时,UI界面也会随之变化,反之亦然。这样的好处是显而易见的,我们不需要手动去更新UI界面&#xff…

React native 已有项目升级兼容web

基础 概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网 深入理解Webpack及Babel的使用 - 掘金 Introduction to React Native for Web // React Native for Web Webpack 是一个现代的 JavaScript 应用程序的静态模块打包工具,它将应用程序所依赖的各…

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数)

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数) 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出(不调用工具箱函数)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 GRU神经网络是LSTM神经网络的一种变体,LSTM 神经网 …

opencv 基础学习08-图像通道操作

opencv 基础学习08-图像通道操作 什么是图像通道?通道操作:**1 通过索引拆分**2 通过opencv 函数拆分通道合并 什么是图像通道? OpenCV的通道拆分功能可用于将多通道图像拆分成单独的通道,这在图像处理和计算机视觉任务中具有许多…

电子锁语音芯片方案,低功耗声音提示ic,WT588F02B-8S

随着科技的不断发展,电子锁已成为现代社会中,安全性和便利性并存的必备设备。如何为电子锁行业增添智能化、人性化的功能已成为行业内的热门话题。 在这个迅速发展的市场中,深圳唯创知音推出了一款语音交互方案——WT588F02B-8S 低功耗声音提…

【云原生】Docker的初步认识,安装与基本操作

一、Docker的相关知识 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的…

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 | MATLAB实现Hamilton滤波AR时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的预测方法,就像它们依赖于过滤器提取的周期一样。标准 Hodrick-P…

Bard:Google AI开始支持中文对话和看图说话了

说起时下火爆的生成式AI,并不是只有ChatGPT。Bard也是一个很优秀的产品,并且刚刚发布的很多有趣的新功能。文末告诉你如何访问Bard。 Google AI在最近的更新中发布了Bard,一个新的语言模型。Bard支持多种语言,包括中文&#xff0…

华为模拟器eNSP过程中所遇问题(40错误)与解决办法

1. 版本 2.打开ensp开启AR2204,报错40 3.弹出文档,挨着试一遍先 安装eNSP的PC上是否存在名为“VirtualBox Host-Only Network”的虚拟网卡 需要启用。虚拟网卡的设置是否符合以下要求:IP地址为192.168.56.1,子网掩码为255.255.2…

LCD-STM32液晶显示中英文-(6.unicode字符集)

目录 Unicode字符集和编码 UTF-32 UTF-16 UTF-8(重点:必须掌握) BOM ANSI Unicode字符集和编码 由于各个国家或地区都根据使用自己的文字系统制定标准,同一个编码在不同的标准里表示不一样的字符,各个标准互不兼容…

诚迈科技子公司智达诚远精耕智能驾驶,为商用落地注入创新力量

近期,工业和信息化部副部长辛国斌在新闻发布会上表示,将启动智能网联汽车准入和上路通行试点,组织开展城市级“车路云一体化”示范应用,将支持L3级及更高级别的自动驾驶功能商业化应用。根据工信部最新消息,《智能网联…

<C语言> 自定义类型

1.结构体 结构体是一种用户自定义的数据类型,允许将不同类型的数据项组合在一起,形成一个更大的数据结构。结构体可以包含多个成员变量,每个成员变量可以是不同的数据类型,如整数、字符、浮点数等,甚至可以包含其他结构…

数据可视化——根据提供的数据,将数据经过处理后以折线图的形式展现

文章目录 前言处理数据获取数据筛选数据将JSON数据转换为Python数据筛选出横坐标数据和纵坐标数据 根据处理后的数据绘制折线图整体代码展示 前言 前面我们学习了如何使用 pyecharts 模块绘制简单的折线图,那么今天我将为大家分享,如何根据提供的数据将…

Python+Qt窗体或Django网页支付宝收款码-扫码付款实例

程序示例精选 PythonQt窗体或Django网页支付宝收款码-扫码付款实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt窗体或Django网页支付宝收款码-扫码付款实例>>编写代…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…