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

news2024/11/19 3:59:51

目录

说明

医疗场景下数据特点

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql什么情况下行锁(表锁)(锁的概念)

1:数据表aa的设计结构 2: 使用navicat编写手动控制事务 3:先选择开启事务和执行更新操作,where b1(表锁)b不是索引,不提交事务,(如果where b1,b是索引就行锁&…

本地Nginx部署React前端项目浅尝

目录 nginx [下载](http://nginx.org/en/download.html)nginx命令react打包文件放置nginx 配置 运行效果nginx踩坑根目录配置 nginx 下载 根据上面的版本找到适合自己的 nginx版本,我目前是环境是 windows,所以下载 稳定版本。 nginx命令 在下载的ngin…

数学建模-判断数据是否服从正态分布

大样本用qq图 >1000 皮尔逊相关系数需要正态性检验,利用上面三种方法其中一种 斯皮尔曼相关系数不用正态性检验

Claude2轻松解决代码Bug的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

GPT-4最新细节曝光:从架构、基础设施、训练数据集、成本、视觉到MoE

OpenAI保持GPT-4架构封闭,不是因为对人类的某种存在风险,而是因为他们所构建的内容是可复制的。实际上,我们预计Google、Meta、Anthropic、Inflection、Character、Tencent、ByteDance、Baidu等公司在短期内将拥有与GPT-4一样甚至更强大的模型…

T100简易的查询作业功能开发

一、自定义作业维护 首先打开作业【azzi310】,进行作业的新增。 这是一个空白的作业界面,我们需要填写的地方也就那么几个。 查询单id:注册一个查询单 【四个字母三个数字】比如这里我们cxmq101.查询单名称:给这个查询起一个名字最大查询笔数:可以自己定义报表是否自己录…

数据库,数据仓库,数据湖

数据仓库四层分层 ODS——原始数据层:存放原始数据 ODS层即操作数据存储,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的ETL之后,装入本层;一般来说ODS层的数…

JavaScript初识

ECMAScript和JavaScript到底是什么关系? 简单来说,ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现。 一、第一个程序:hello word 二、JavaScript的几种常见写法: 1、将JavaScript写在标签上 2、…

应用上下文能否获取-spring13

我们能否通过web层通过spring容器去获得serive,然后serive内部Dao再去注入 这句话的意思是去加载xml配置文件,去加载spring容器,每次都要创建,太麻烦了,影响性能 最好的方法:应用上下文或者spring容器创建一…

DCL与延迟初始化(单例)

前言 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。 第一种(存在问题) public class UnsafeLazyInitialization {private static Instance instance;public static Instance getInstance() {if (instance …

零基础如何自学成为网络安全工程师

前言 一份网络攻防渗透测试的学习路线,不藏私了! 👉 【一帮助安全学习一】👈这里自取256G网络安全自学资料 1、学习编程语言(phpmysqljshtml) 原因: phpmysql可以帮助你快速的理解B/S架构是怎样运行的&#xff0c…

【AI底层逻辑】——篇章5(上):机器学习算法之回归分类

目录 引入 一、何为机器学习 1、定规则和学规则 2、算法的定义 二、机器学习算法 1、常见学习方法 2、回归 3、分类 续下篇... 往期精彩: 引入 计算机发明初,专家通过将专业知识和经验梳理成规则输入计算机程序,但是这样跟不上知识…

IT技术培训班:搭乘学习快车的抉择

引言: 在IT技术学习的道路上,我们常常会被推荐各种五花八门的技术培训班。它们通过各种宣传手段向我们展示着美好的未来和无限的机会。然而,我们又应该如何看待这些培训班呢?在培训班里学技术真的有用吗?本文将从不同角…

【Java进阶之路】HashMap源码分析(JDK1.8)

概述 JDK 1.8 对 HashMap 进行了比较大的优化,底层实现由之前的 “数组链表” 改为 “数组链表红黑树”,本文就 HashMap 的几个常用的重要方法和 JDK 1.8 之前的死循环问题展开学习讨论。 JDK 1.8 的 HashMap 的数据结构如下图所示,当链表节…

Docker 替代方案:适用于 SaaS 应用程序的 10 种 Docker 替代方案

Docker技术已经在基础设施管理领域引起了革命性的变化,以至于Docker现在已经成为容器的代名词。重要的是要理解,所有的Docker都是容器,但并非所有的容器都是Docker。虽然Docker是最常用的容器技术,但还有其他几种替代Docker的选择…

积分兑换小程序项目总结

1. 项目概述 背景:中标项目,第三方公司做会员福利,以积分的形式发放。目标:给固定的钱,积分兑完,周期两个月。需求:固定会员能及时线上兑换积分。解决方案:开发微信小程序在线兑换。…

Nexpose v6.6.203 for Linux Windows - 漏洞扫描

Nexpose v6.6.203 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release Jul 05, 2023 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.o…

【吴恩达】prompt engineering(原则 迭代 文本概括 推断、订餐机器人)

简介 Introduction 基础的LLM训练的模型,问法国的首都什么,可能会将答案预测为“法国最大的城市是什么,法国的人口是多少”许多 LLMs 的研究和实践的动力正在指令调整的 LLMs 上。指令调整的 LLMs 已经被训练来遵循指令。因此,如…

(EMQX)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到EMQX

1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡,天线 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内(注意不要弄错方向) 同时接入天线 2.2 连接ST-Link仿真…

Android VNDK/VSDK Snapshot编译框架

1.背景 背景一: 为解决Android版本碎片化问题,引入Treble架构,它提供了稳定的新SoC供应商接口,引入HAL 接口定义语言(HIDL/Stable AIDL,技术栈依然是Binder),它指定了 vendor HAL 和system fram…