Apache Druid(二、架构设计)

介绍一下Druild,并从Twitter大数据团队分析如何应用 Druid 分析 ZB 级实时数据? 或许很多同学都还没有用过Druid,那么我们先简单介绍一下Druid,然后由浅入深的进行分析! Druild Druid 是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid 仍能够保持 100% 正常运行。 官网地址:https://druid.apache.o... 阅读详情

回顾

上一篇提供druid的安装是很早的版本了 https://blog.youkuaiyun.com/yyoc97/article/details/88411429,目前druid的安装使用会更简洁些快速入门。因为现在接触的业务有使用到这个组件,今天我们再来学习下它整体的架构。

架构

整体设计

这个是Druid的架构图,可以整体可以分为两大块。上面蓝色部分为Druid自身的服务,分为master,query 和data节点。下面橘色的部分为Druid的外部依赖。主要是元数据存储,deep storage常用的就有hdfs, zk用于集群协调。
节点间相互不影响,都通过zk交互数据。
在这里插入图片描述

进程服务作用

  • 进程
    Coordinator 协调器进程管理集群上的数据可用性。
    Overlord 进程控制数据摄取工作负载的分配。
    Broker 代理进程处理来自外部客户端的查询。
    Router 路由进程是可选进程,可以将请求路由到 Brokers、Coordinator 和 Overlords。
    Historical 历史进程存储可查询的数据。
    MiddleManager 进程负责摄取数据。
  • 服务
    Master:运行 Coordinator 和 Overlord 进程,管理数据可用性和摄取。
    Query:运行 Broker 和可选的 Router 进程,处理来自外部客户端的查询。
    Data:运行历史和 MiddleManager 进程,执行摄取工作负载并存储所有可查询的数据。

数据流

数据生产

master下overlords负责接收生产请求,然后把任务写入zk里面去,然后由data部分的middler managers去zk拉取消息,进行数据生产,完成生产后会将数据写入deep storage中。再回写完成标致。coordinator 是个协调节点负责数据的负载均衡,他会在data historicals中找寻压力比较小的节点,原理也是将标致写入zk中,去影响数据通过哪个historicals写入deep storage

数据查询

首先客户端会发送查询请求到Query部分,会根据routers选择之后,其中 Broker 将识别哪些段具有可能与该查询有关的数据。段列表总是按时间修剪,也可能由其他属性修剪,具体取决于数据源的分区方式。然后,Broker 将识别哪些Historian和 MiddleManager正在为这些段提供服务,并向这些进程中的每一个发送重写的子查询。Historical/MiddleManager 进程将接收查询、处理它们并返回结果。Broker 接收结果并将它们合并在一起以获得最终答案,并将其返回给原始调用者。

查询的优化

  • 修剪每个查询访问哪些段。
  • 在每个段内,使用索引来标识必须访问哪些行。
  • 在每个段内,仅读取与特定查询相关的特定行和列。

索引服务

Druid提供一组支持索引服务(Indexing Service)的组件,也就是Overload和MiddleManager节点。索引服务是一种高可用的分布式服务,用于运行跟索引相关的任务,索引服务是数据摄入创建和销毁Segment的主要方式(还有一种是采用实时节点的方式,但是现在已经废弃了)。索引服务支持以pull或push的方式摄入外部数据。
索引服务采用的是主从架构,Overload为主节点,MiddleManager是从节点。索引服务架构图如下图所示:
在这里插入图片描述

存储设计

Datasrouces and segments

Druid 数据存储在“数据源”中,类似于传统 RDBMS 中的表。每个数据源都按时间分区,并且可以选择按其他属性进一步分区。每个时间范围称为一个“块”(例如,一天,如果您的数据源按天分区)。在一个块内,数据被分成一个或多个 “段”。每个段都是一个文件,通常包含多达几百万行的数据。
在这里插入图片描述
一个数据源可能只有几个段,也可能有数十万甚至数百万个段。每个段都是在 MiddleManager 上创建的,在这一点上,它是可变的且未提交的。段构建过程包括以下步骤,旨在生成紧凑且支持快速查询的数据文件:
1.转换为柱状格式
2.使用位图索引进行索引
3.使用各种算法进行压缩
定期提交和发布段。此时,它们被写入深存储,变得不可变,并从 MiddleManagers 移动到历史进程。有关该段的条目也被写入元数据存储。此条目是关于段的自描述元数据,包括段的架构、其大小及其在深度存储中的位置等内容。这些条目是协调器用来了解集群上应该提供哪些数据的条目。

segment设计

Segment是数据存储、复制、均衡(Historical的负载均衡)和计算的基本单元了。Segment具有不可变性,一个Segment一旦创建完成后(MiddleManager节点发布后)就无法被修改,只能通过生成一个新的Segment来代替旧版本的Segment。
在这里插入图片描述

特殊数据结构

对于时间戳列和指标列,实际存储是一个数组,Druid采用LZ4压缩每列的整数或浮点数。当收到查询请求后,会拉出所需的行数据(对于不需要的列不会拉出来),并且对其进行解压缩。解压缩完之后,在应用具体的聚合函数。
对于维度列不会像指标列和时间戳这么简单,因为它需要支持filter和group by,所以Druid使用了字典编码(Dictionary Encoding)和位图索引(Bitmap Index)来存储每个维度列。每个维度列需要三个数据结构:

  • 需要一个字典数据结构,将维值(维度列值都会被认为是字符串类型)映射成一个整数ID。
  • 使用上面的字典编码,将该列所有维值放在一个列表中。
  • 对于列中不同的值,使用bitmap数据结构标识哪些行包含这些值。

Druid针对维度列之所以使用这三个数据结构,是因为:

  • 使用字典将字符串映射成整数ID,可以紧凑的表示结构2和结构3中的值。
  • 使用Bitmap位图索引可以执行快速过滤操作(找到符合条件的行号,以减少读取的数据量),因为Bitmap可以快速执行AND和OR操作。
  • 对于group by和TopN操作需要使用结构2中的列值列表。

我们以上面"Page"维度列为例,可以具体看下Druid是如何使用这三种数据结构存储维度列:

1. 使用字典将列值映射为整数
{
"Justin Bieher":0,
"ke$ha":1
}
2. 使用1中的编码,将列值放到一个列表中
[0,0,1,1]
3. 使用bitmap来标识不同列值
value = 0: [1,1,0,0] //1代表该行含有该值,0标识不含有
value = 1: [0,0,1,1]

下图是以advertiser列为例,描述了advertiser列的实际存储结构:
在这里插入图片描述

命名设计

高效的数据查询,不仅仅体现在文件内容的存储结构上,还有一点很重要,就是文件的命名上。试想一下,如果一个Datasource下有几百万个Segment文件,我们又如何快速找出我们所需要的文件呢?答案就是通过文件名称快速索引查找。
Segment的命名包含四部分:数据源(Datasource)、时间间隔(包含开始时间和结束时间两部分)、版本号和分区(Segment有分片的情况下才会有)。

test-datasource_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T16:00:00.000Z_1
# 数据源名称_开始时间_结束时间_版本号_分区

分片号是从0开始,如果分区号为0,则可以省略:test-datasource_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T16:00:00.000Z
还需要注意如果一个时间间隔segment由多个分片组成,则在查询该segment的时候,需要等到所有分片都被加载完成后,才能够查询(除非使用线性分片规范(linear shard spec),允许在未加载完成时查询)

实际物理存储

下面我们以一个实例来看下Segment到底以什么形式存储的,我们以本地导入方式将下面rollup-tutorial.json数据导入到Druid中。

{"timestamp":"2018-01-01T01:01:35Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":20,"bytes":9024}
{"timestamp":"2018-01-01T01:01:51Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":255,"bytes":21133}
{"timestamp":"2018-01-01T01:01:59Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":11,"bytes":5780}
{"timestamp":"2018-01-01T01:02:14Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":38,"bytes":6289}
{"timestamp":"2018-01-01T01:02:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":377,"bytes":359971}
{"timestamp":"2018-01-01T01:03:29Z","srcIP":"1.1.1.1", "dstIP":"2.2.2.2","packets":49,"bytes":10204}
{"timestamp":"2018-01-02T21:33:14Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":38,"bytes":6289}
{"timestamp":"2018-01-02T21:33:45Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":123,"bytes":93999}
{"timestamp":"2018-01-02T21:35:45Z","srcIP":"7.7.7.7", "dstIP":"8.8.8.8","packets":12,"bytes":2818}

我们以单机形式运行Druid,这样Druid生成的Segment文件都在${DRUID_HOME}/var/druid/segments目录下。
segment通过datasource_beginTime_endTime_version_shard用于唯一标识,在实际存储中是以目录的形式表现的。
在这里插入图片描述
可以看到Segment中包含了Segment描述文件(descriptor.json)和压缩后的索引数据文件(index.zip),我们主要看的也是index.zip这个文件,对其进行解压缩。
在这里插入图片描述
首先看下factory.json这个文件,这个文件并不是segment具体存储段数据的文件。因为Druid通过使用MMap(一种内存映射文件的方式)的方式访问Segment文件,通过查看这个文件内容来看,貌似是用于MMap读取文件所使用的(不太了解MMap)?

#factory.json文件内容
{"type":"mMapSegmentFactory"}

Druid实际存储Segment数据文件是:version.bin、meta.smoosh和xxxxx.smoosh这三个文件,下面分别看下这三个文件的内容。
version.bin是一个存储了4个字节的二进制文件,它是Segment内部版本号(随着Druid发展,Segment的格式也在发展),目前是V9,以Sublime打开该文件可以看到:

0000 0009 

meta.smoosh里面存储了关于其它smoosh文件(xxxxx.smoosh)的元数据,里面记录了每一列对应文件和在文件的偏移量。除了列信息外,smoosh文件还包含了index.drd和metadata.drd,这部分是关于Segment的一些额外元数据信息。

#版本号,该文件所能存储的最大值(2G),smooth文件数
v1,2147483647,1
# 列名,文件名,起始偏移量,结束偏移量
__time,0,0,167
bytes,0,167,331
count,0,331,482
dstIP,0,982,1322
index.drd,0,1322,1507
metadata.drd,0,1507,1875
packets,0,482,642
srcIP,0,642,982

再看00000.smoosh文件前,我们先想一下为什么这个文件被命名为这种样式?因为Druid为了最小化减少打开文件的句柄数,它会将一个Segment的所有列数据都存储在一个smoosh文件中,也就是xxxxx.smoosh这个文件。但是由于Druid使用MMap来读取Segment文件,而MMap需要保证每个文件大小不能超过2G(Java中的MMapByteBuffer限制),所以当一个smoosh文件大于2G时,Druid会将新数据写入到下一个smoosh文件中。这也就是为什么这些文件命名是这样的,这里也对应上了meta文件中为什么还要标识列所在的文件名。
通过meta.smoosh的偏移量也能看出,00000.smoosh文件中数据是按列进行存储的,从上到下分别存储的是时间列、指标列、维度列。对于每列主要包会含两部分信息:ColumnDescriptor和binary数据。columnDescriptor是一个使用Jackson序列化的对象,它包含了该列的一些元数据信息,比如数据类型、是否是多值等。而binary则是根据不同数据类型进行压缩存储的二进制数据。

在smooth文件最后还包含了两部分数据,分别是index.drd和metadata.drd。其中index.drd中包含了Segment中包含哪些度量、维度、时间范围、以及使用哪种bitmap。metadata.drd中存储了指标聚合函数、查询粒度、时间戳配置等(上面内容的最后部分)。
下图是物理存储结构图(样例),存储未压缩和编码的数据就是最右边的内容。
在这里插入图片描述

Segment创建过程

Segment都是在MiddleManager节点中创建的,并且处在MiddleManager中的Segment在状态上都是可变的并且未提交的(提交到DeepStorage之后,数据就不可改变)。
Segment从在MiddleManager中创建到传播到Historical中,会经历以下几个步骤:

  • MiddleManager中创建Segment文件,并将其发布到Deep Storage。
  • Segment相关的元数据信息被存储到MetaStore中。
  • Coordinator进程根据MetaStore中得知Segment相关的元数据信息后,根据规则的设置分配给复合条件的Historical节点。
  • Historical节点得到Coordinator指令后,自动从DeepStorage中拉取Segment数据文件,并通过Zookeeper向集群声明负责提供该Segment数据相关的查询服务。
  • MiddleManager在得知Historical负责该Segment后,会丢弃该Segment文件,并向集群声明不在负责该Segment相关的查询。

参考

https://druid.apache.org/docs/latest/design/architecture.html
https://www.jianshu.com/p/7a26d9153455

Druid概述 1.Apache Druid简介 Apache Druid是一个分布式的、面向列的、实时分析数据库,旨在快速获取大量数据并将其编入索引,并对大型数据集进行快速的切片和切分分析(“OLAP查询),常用于实时摄取、快速查询和对时间依赖性很高的数据库用户。因此,Druid可以为可视化的分析应用程序提供强力的数据源支持,或用作需要快速聚合的高并发API的后端。Druid最适合面向事件的数据。 Apache Druid通常位于存储或处理层与最终用户之间,并充当查询层以服务于分析工作负载。 常见应用领域. 阅读详情

相关推荐

Apache Druid

Apache Druid 官方文档:https://druid.apache.org/docs/latest/design/index.html Apache Druid 介绍 Apache Druid 是一个实时分析数据库 real-time analytics database,用于对大型数据集进行快速切片分析(OLAP 查询)。在实时摄入(数据)、快查询表现、长时间正常运行(high uptime)等方面要求很高的场景,Druid 发挥作用。 Druid 通常作为分析系统的 GUI、需要快速聚合的高并

weixin_44595582的博客 1726

【Druid】(二)Apache Druid 原理与架构剖析

Druid 是多进程架构,每种进程类型都可以独立配置,独立扩展。这样可以为集群提供最大的灵活度。这种设计还提供了强失效容忍:一个失效的组件不会立即影响另外的组件。下面我们来深入了解 Druid 有哪些进程类型,每种进程又在整个集群中扮演什么角色。

云祁QI 2592

Apache Druid入门系列(二): 安装配置

Druid入门-安装环境需求下载并解压启动Druid服务 参考自:http://druid.io/docs/latest/tutorials/index.html 本文的例子是0.14.0版本,请参考:https://druid.apache.org/docs/0.14.0-incubating/tutorials/index.html 在本文示例中,我们将下载druid并将其配置在一台机器上。完...

qq_26860451的博客 1088

Apache Druid分析型数据库设计-架构

Druid具有分布式的架构,旨在对云友好且易于操作。您能够对服务独立进行配置和扩展,从而在集群操作上面拥有最大的灵活性。这样的设计具有增强的容错能力,一个组件的中断不会立即影响其它的组件。 本文先从Druid的整体架构(architecture)开始介绍,然后介绍组成Druid的多种服务(Service),最后讲述Druid的三个外部依赖,包括深度存储(Deep storage)、元数据存储(Metadata storage)和Zookeeper。

JH Lan的博客 605

Apache Druid源码导读--Google guice DI框架

缘起 在大数据应用组件中,有两款OLAP引擎应用广泛,一款是偏离线处理的Kylin,另一个是偏实时的Druid。Kylin是一款国人开源的优秀离线OLAP引擎,基本上是Hadoop领域离线OLAP事实标准,在离线报表,指标分析领域应用广泛。而Apache Druid则在实时OLAP领域独领风骚,优异的性能、高可用、易扩展。Kylin的实现细节网上资料很多,而Druid很少,最近打算研究下源码,写几...

Skycrab 4230

大数据Apache Druid(二):Druid数据结构及架构原理

Druid中的数据存储在datasource中,类似RDBMS中的table,每个datasource中按照时间划分,每个时间范围称为一个chunk(一般一天为一个chunk),在一个chunk中数据根据维度的Hash或者范围被分成一个或者多个segment,每个segment都是一个单独的文件,通常包含几百万行数据,这些segment是按照时间组织成的,所以在按照时间查询数据时,效率非常高。我们要过滤找到“北京”并且“电脑”的数据,那么只需要在位图索引中找到北京对应的行和广州对应的行做与运算即可。...

Lansonli(蓝深李)的博客 2089

Apache Druid单机环境搭建及基本使用

Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查询分析。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景。

积跬步,至千里。 2523

【JAVA高级】——Druid连接池和Apache的DBUtils使用

Apache DBUtils是java编程中的数据库操作实用工具,小巧简单实用,主要特征有: 1)对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作; 2)对于数据表的写操作,也变得很简单(只需写sql语句) 3)可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象,而不像php,asp那样,费时费力的不断重复的构建和析构这样的对象。

不迁怒,不贰过。小知识,大智慧。 4082

architecture-decision-record 仓库高信任团队协作 ADR 示例:从决策描述到行动项的完整实战解读

本指南以 architecture-decision-record 开源仓库中的 [高信任团队协作决策记录示例](https://link.gitcode.com/i/c69cf0b3beff332c1c7fd310a393c85c) 为骨架,逐节拆解一份完整 ADR(Architecture Decision Record)的标准写法:从决策头部元信息、决策描述、备选方案、收益与风险,到决策结果

gitblog_00042的博客 979

大数据Apache Druid(三):Druid集群搭建

由于将Segment和索引数据存放在HDFS中,Druid需要连接HDFS,需要Hadoop中相关配置文件,在node3“/software/apache-druid-0.21.1/conf/druid/cluster/_common”目录下创建目录“hadoop-xml”,将Hadoop中core-site.xml、hdfs-site.xml复制到“hadoop-xml”目录中。进入“/software/apache-druid-0.21.1/conf/druid/cluster/_common”...

Lansonli(蓝深李)的博客 1774

Apache Druid:高性能实时分析数据库-开源

Druid 专为快速临时分析、即时数据可见性或支持高并发性很重要的工作流而设计。 因此,Druid 通常用于为需要交互式、一致用户体验的 UI 提供动力。 Druid 从 Kafka 和 Amazon Kinesis 等消息总线流式传输数据,并从 HDFS 和 Amazon S3 等数据湖批量加载文件。 Druid 支持最流行的结构化和半结构化数据文件格式。 Druid 已经过基准测试,其性能大大优于传统解决方案。 Druid 结合了新颖的存储思想、索引结构以及精确和近似查询,可在一秒内返回大多数结果。 Druid 为点击流、APM、供应链、网络遥测、数字营销、风险/欺诈和许多其他类型的数据解锁了新型查询和工作流程。 Druid 专为对实时和历史数据进行快速、即席查询而构建。

Apache Druid设计原理

Apache Druid设计原理 一、架构 1、设计 Druid具有多进程,分布式架构,旨在实现云友好且易于操作。每种Druid进程类型都可以独立配置和扩展,从而为您的集群提供最大的灵活性。这种设计还提高了容错能力:一个组件的故障不会立即影响其他组件。 2、进程和服务器 Druid有几种进程类型,下面简要描述: Coordinator协调器进程管理群集上的数据可用性。 Ove...

哈喽天方方 1248

WS2812呼吸灯效果实战:用STM32的PWM+DMA实现流畅渐变(附完整代码)

本文详细介绍了如何使用STM32的PWM+DMA技术实现WS2812呼吸灯效果,提供完整的代码示例和调试技巧。通过PWM波形编码和DMA传输机制,解决了传统IO模拟控制方式的高CPU占用问题,实现了流畅的LED渐变效果,适用于各种嵌入式开发场景。

weixin_30566063的博客 452

Apache druid 配置项

jvm配置 -Duser.timezone=UTC 时区设置,默认的,更改可能会有问题,跟北京时间有8小时差。换算为北京时间要+8小时 -Dfile.encoding=UTF-8 文件的字符集,默认为UTF-8 -Djava.io.tmpdir=/tmp 默认的临时文件路径 -Djava.util.logging.manager=org.apache.logging.log4j.jul....

baichi1616的博客 1703

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 293

eMMC FFU固件更新实战:从协议解析到设备修复

本文详细解析eMMC FFU固件更新技术,从协议原理到实战操作,涵盖EXT_CSD寄存器操作、命令流状态机解析及专业工具使用指南。通过真实维修案例,展示如何利用FFU机制修复设备故障,并提供高级优化技巧与安全注意事项,是硬件工程师和维修技术人员的实用参考。

weixin_29191761的博客 378

apache druid 与kafka整合使用

前言 在上一篇,我们了解了apache druid的搭建,以及如何快速导入外部数据源到apache druid中进行数据分析和使用 本篇,我们结合一个实际的简单的应用场景,来说说apache druid如何在实际项目中进行使用 业务场景 如下所示,是一个很常见的数据分析的业务,通常来说,很多实时或准实时的数据(这里理解为外部数据源)需要通过kafka进行中转,即发送到kafka中, apache druid提供了导入外部数据源的功能,可以接收来自kafka指定topic的数据,然后支持数据分析,将kafka

congge 4974

PaddleOCRv5训练自己的模型-微调文字识别模型

本文介绍了使用PaddleOCR微调文字识别模型的具体步骤。首先需要按照官方格式准备数据集,包括图片和标注文件。然后进行模型训练,包括环境安装、预训练模型下载、配置文件修改等关键环节,特别针对训练中可能出现的类别数不匹配问题提供了三种解决方案。文章还详细说明了模型导出为静态图格式的方法,以及如何调用训练好的模型进行推理。整个过程涉及多个技术细节,如早停机制设置、断点续训方法等,为需要提升OCR识别精度的开发者提供了实用指导。

weixin_43827982的博客 3176

apache druid 单机部署

因需要接触到apache druid,从0开始学习,做一个记录。 先去官网了解基础的信息:官网链接如下: https://druid.apache.org/docs/latest/design/index.html 了解一些druid的基础知识后,开始搭建druid的环境。先获取到druid,可以在https://druid.apache.org/downloads.html官网处下载,点击...

qq_34404512的博客 1298

CUDA详细安装及环境配置——环境配置指南 – CUDA+cuDNN+PyTorch 安装

本文详细介绍了如何确定显卡支持的CUDA版本、选择对应的cuDNN版本,并逐步安装CUDA、cuDNN和PyTorch。首先,通过命令行输入nvidia-smi.exe查看显卡支持的CUDA版本。接着,根据CUDA版本选择对应的cuDNN版本并下载。然后,从NVIDIA官方网站下载CUDA安装包,按照提示进行安装,并检查是否安装成功。同样地,下载cuDNN安装包,解压后将文件拷贝到CUDA安装目录中,并通过命令行验证安装是否成功。最后,根据PyTorch官网的指引,选择合适的安装命令进行PyTorch的安装

2501_90350274的博客 5098

华为od机试|华为od机试真题2025|华为od题库|华为od机考|2025C卷B卷

华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|B卷C卷

u014481728的博客 10万+

Apache Druid 安装与配置指南

Apache Druid 是一个高性能的实时分析数据库,专为需要快速查询和摄入数据的场景设计。它适用于为用户界面提供支持、运行运营(即席)查询或处理高并发的场景。Druid 可以作为数据仓库的开放源代码替代品,适用于多种用途。 主要编程语言:Java ## 2. 项目使用的关键技术和框架 - **存储引擎**:Druid 使用列式存储引擎,优化了读操作,特别是在执行聚合查询时。 - **实时...

gitblog_00089的博客 665

pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]‘ is not a valid editable requirement解决方案

本文主要介绍了pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]’ is not a valid editable requirement解决方案,希望能对使用markitdown的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 2万+

PlayIntegrityFix:从 Root 到认证通过的 3 步操作

Play 商店一直提示"设备未通过认证",好应用装不了?PlayIntegrityFix 是个 Zygisk 模块,能把 Root 设备的 Play Integrity 判定刷回通过。照着装完,5 分钟跑通。 ## 先花 30 秒确认设备够不够格 动手前把这张表过一遍,哪行不满足就先补哪行,否则模块要么装不上,要么装了不生效。 | 条件 | 怎么确认 | 不满足怎么办 | | --- | -

gitblog_00290的博客 714

计算机组成原理(第三版)唐朔飞-第八章CPU的结构和功能-课后习题

8.1CPU有哪些功能?画出其结构框图并简要说明每个部件的作用。

weixin_45735391的博客 6万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

10分钟搞懂DeepSeek-V4-Flash-0731-singprobe:无需额外安全模型的LLM内在式流式护栏

**DeepSeek-V4-Flash-0731-singprobe**(SingProbe)是一个构建在 DeepSeek-V4-Flash-0731 之上的 **LLM 内在式流式护栏(intrinsic streaming guardrail)** 模型。它不需要你额外部署一个独立的安全检测模型,而是直接复用基座模型生成过程中的隐藏状态(hidden states),在**每生成一个 tok

gitblog_01064的博客 753

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: scala dataframe添加一列行号到开头
下一篇: Debezium指定binlog位置初始化异常排查修复
yyoc97
博客等级 码龄12年 272粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值