当前位置: 首页 > news >正文

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建

  • 1.数据湖的解决方案 - Iceberg
    • 1.1 Iceberg 是什么
    • 1.2 Iceberg 的 Table Format 介绍
    • 1.3 Iceberg 的核心思想
    • 1.4 Iceberg 的元数据管理
    • 1.5 Iceberg 的重要特性
      • 1.5.1 丰富的计算引擎
      • 1.5.2 灵活的文件组织形式
      • 1.5.3 优化数据入湖流程
      • 1.5.4 增量读取处理能力
    • 1.6 数据文件结构
      • 1.6.1 元数据文件
        • 1.6.1.1 Table Metadata
        • 1.6.1.2 快照(Snapshot)
        • 1.6.1.3 清单文件(Manifest File)
      • 1.6.2 数据文件
  • 2.Apache Iceberg 的实现细节
    • 2.1 快照设计方式
      • 2.1.1 快照隔离
      • 2.1.2 增量读取数据
      • 2.1.3 原子性操作
    • 2.2 事务性提交
      • 2.2.1 写操作要求
      • 2.2.2 冲突解决 - 乐观锁
  • 3.Iceberg 结合 Flink 场景分享
    • 3.1 构建近实时 Data Pipeline
    • 3.2 CDC 数据实时摄入摄出
    • 3.3 从 Iceberg 历史数据启动 Flink 任务
    • 3.4 通过 Iceberg 数据来修正实时聚合结果
  • 4.Iceberg 0.11.1 源代码编译
    • 4.1 编译 Iceberg
      • 4.1.1 下载 Iceberg 0.11.1 软件包
      • 4.1.2 解压 Iceberg 0.11.1 软件包
      • 4.1.3 修改对应的版本
      • 4.1.4 编辑 build.gradle 文件,添加国内源
      • 4.1.5 下载依赖(可选)
      • 4.1.6 正式编译
      • 4.1.7 生成的目录
    • 4.2 Iceberg 环境部署
  • 5.总结

我们在使用不同的引擎进行大数据计算时,需要将数据根据计算引擎进行适配。这是一个相当棘手的问题,为此出现了一种新的解决方案:介于上层计算引擎和底层存储格式之间的一个中间层。这个中间层不是数据存储的方式,只是定义了数据的元数据组织方式,并向计算引擎提供统一的类似传统数据库中 “表” 的语义。它的底层仍然是 Parquet、ORC 等存储格式。

基于此,Netflix 开发了 Iceberg,目前已经是 Apache 的顶级项目,https://iceberg.apache.org/。

1.数据湖的解决方案 - Iceberg

1.1 Iceberg 是什么

Apache Iceberg is an open table format for huge analytic datasets. Iceberg adds tables to compute engines including Flink Trino Spark and Hive using a high-performance table format that works just like a SQL table.

Iceberg 是一种开放的数据湖表格式。可以简单理解为是基于计算层(Flink、Spark)和存储层(ORC,Parquet,Avro)的一个中间层,用 Flink 或者 Spark 将数据写入 Iceberg,然后再通过其他方式来读取这个表,比如 Spark,Flink,Presto 等。

在这里插入图片描述
在文件 Format(Parquet / Avro / ORC 等)之上实现 Table 语义:

  • 支持定义和变更 Schema
  • 支持 Hidden Partition 和 Partition 变更
  • ACID 语义
  • 历史版本回溯
  • 借助 Partition 和 Columns 统计信息实现分区裁剪
  • 不绑定任何存储引擎,可拓展到 HDFS / S3 / OSS
  • 容许多个 writer 并发写入,乐观锁机制解决冲突

1.2 Iceberg 的 Table Format 介绍

Iceberg 是为分析海量数据而设计的,被定义为 Table Format,Table Format 介于计算层和存储层之间。

Table Format 向下管理在存储系统上的文件,向上为计算层提供丰富的接口。存储系统上的文件存储都会采用一定的组织形式,譬如读一张 Hive 表的时候,HDFS 文件系统会带一些 Partition、数据存储格式、数据压缩格式、数据存储 HDFS 目录的信息等,这些信息都存在 Metastore 上,Metastore 就可以称之为一种文件组织格式。

一个优秀的 文件组织格式,如 Iceberg,可以更高效的支持上层的计算层访问磁盘上的文件,做一些 listrename 或者查找等操作。

表和表格式是两个概念。表是一个具象的概念,应用层面的概念,我们天天说的表是简单的行和列的组合。而 表格式 是数据库系统实现层面一个抽象的概念,它定义了一个表的 Scheme 定义:包含哪些字段,表下面文件的组织形式(Partition 方式)、元数据信息(表相关的统计信息,表索引信息以及表的读写 API),如下图左侧所示:

在这里插入图片描述
上图右侧是 Iceberg 在数据仓库生态中的位置,和它差不多相当的一个组件是 Metastore。不过 Metastore 是一个服务,而 Iceberg 就是一系列 jar 包。对于 Table Format,我认为主要包含 4 4 4 个层面的含义,分别是 表 Schema 定义(是否支持复杂数据类型),表中文件的组织形式表相关统计信息表索引信息以及表的读写 API 信息

  • 表 Schema 定义了一个表支持字段类型,比如 intstringlong 以及复杂数据类型等。
  • 表中文件组织形式最典型的是 Partition 模式,是 Range Partition 还是 Hash Partition。
  • Metadata 数据统计信息。
  • 表的读写 API。上层引擎通过对应的 API 读取或者写入表中的数据。

1.3 Iceberg 的核心思想

在这里插入图片描述

Iceberg 的核心思想,就是 在时间轴上跟踪表的所有变化

  • 快照 表示表数据文件的一个完整集合。
  • 每次更新操作会生成一个新的快照。

1.4 Iceberg 的元数据管理

在这里插入图片描述
从图中可以看到 Iceberg 将数据进行分层管理,主要分为 元数据管理层数据存储层。元数据管理层又可以细分为三层:

  • Metadata File
  • Snapshot
  • Manifest

Metadata File 存储当前版本的元数据信息(所有 Snapshot 信息);Snapshot 表示当前操作的一个快照,每次 commit 都会生成一个快照,一个快照中包含多个 Manifest。每个 Manifest 中记录了当前操作生成数据所对应的文件地址,也就是 data files 的地址。基于 Snapshot 的管理方式,Iceberg 能够进行 time travel(历史版本读取以及增量读取),并且提供了 serializable isolation

数据存储层支持不同的文件格式,目前支持 Parquet、ORC、AVRO。

1.5 Iceberg 的重要特性

Apache Iceberg 设计初衷是 为了解决 Hive 离线数仓计算慢的问题,经过多年迭代已经发展成为构建数据湖服务的表格式标准。关于 Apache Iceberg 的更多介绍,请参见 Apache Iceberg 官网。

目前 Iceberg 提供以下核心能力:

在这里插入图片描述

1.5.1 丰富的计算引擎

  • 优秀的内核抽象使之不绑定特定引擎,目前在支持的有 Spark、Flink、Presto、Hive。
  • Iceberg 提供了 Java Native API,不用特定引擎也可以访问 Iceberg 表。

1.5.2 灵活的文件组织形式

  • 提供了 基于流式的增量计算模型基于批处理的全量表计算模型,批任务和流任务可以使用相同的存储模型(HDFS、OZONE),数据不再孤立,以构建低成本的轻量级数据湖存储服务。
  • Iceberg 支持隐藏分区(Hidden Partitioning)和分区布局变更(Partition Evolution),方便业务进行数据分区策略更新。
  • 支持 Parquet、ORC、Avro 等存储格式。

1.5.3 优化数据入湖流程

  • Iceberg 提供 ACID 事务能力,上游数据写入即可见,不影响当前数据处理任务,这大大简化了 ETL。
  • Iceberg 提供 Upsert / Merge Into 行级别数据变更,可以极大地缩小数据入库延迟。

1.5.4 增量读取处理能力

  • Iceberg 支持通过流式方式读取增量数据,实现主流开源计算引擎入湖和分析场景的完善对接。
  • 支持 Spark Structed Streaming。
  • 支持 Flink Table Source。
  • 支持历史版本回溯。

1.6 数据文件结构

我们先了解一下 Iceberg 在文件系统中的布局,总体来讲 Iceberg 分为两部分数据。

  • 第一部分是 数据文件,如下图中的 .parquet 文件。
  • 第二部分是 表元数据文件(Metadata 文件),包含 Snapshot 文件(snap-*.avro)、Manifest 文件(.avro)、TableMetadata 文件(*.json)等。

在这里插入图片描述

1.6.1 元数据文件

其中 Metadata 目录存放元数据管理层的数据,表的元数据是不可修改的,并且始终向前迭代;当前的快照可以回退。

1.6.1.1 Table Metadata

version[number].metadata.json:存储每个版本的数据更改项。

1.6.1.2 快照(Snapshot)

snap-[snapshotID]-[attemptID]-[commitUUID].avro:存储快照 Snapshot 文件。

快照代表一张 Iceberg 表在某一时刻的状态,也被称为 清单列表Manifest List),里面存储的是清单文件列表,每个清单文件占用一行数据。清单列表文件以 snap 开头,以 avro 后缀结尾,每次更新都产生一个清单列表文件。每行中存储了清单文件的路径。

清单文件(Manifest Files)里面存储数据文件的分区范围、增加了几个数据文件、删除了几个数据文件等信息。数据文件(Data Files)存储在不同的 Manifest Files 里面,Manifest Files 存储在一个 Manifest List 文件里面,而一个 Manifest List 文件代表一个快照。

1.6.1.3 清单文件(Manifest File)

[commitUUID]-[attemptID]-[manifestCount].avro:Manifest 文件。

清单文件是以 avro 格式进行存储的,以 avro 后缀结尾,每次更新操作都会产生多个清单文件。其里面列出了组成某个快照(Snapshot)的数据文件列表。每行都是每个数据文件的详细描述,包括 数据文件的状态文件路径分区信息列级别的统计信息(比如每列的最大最小值、空值数等)、文件的大小 以及 文件里面数据的行数 等信息。其中列级别的统计信息在 Scan 的时候可以为算子下推提供数据,以便可以过滤掉不必要的文件。

1.6.2 数据文件

data 目录组织形式类似于 Hive,都是以分区进行目录组织(图中 dt 为分区列)。

Iceberg 的数据文件通常存放在 data 目录下。一共有三种存储格式(Avro、ORC 和 Parquet),主要是看你选择哪种存储格式,后缀分别对应 avroorc 或者 parquet。在一个目录,通常会产生多个数据文件。

2.Apache Iceberg 的实现细节

2.1 快照设计方式

2.1.1 快照隔离

  • 读操作仅适用当前已生成快照。
  • 写操作会生成新的隔离快照,并在写完成后原子性提交。

如下图所示,虚线框(Snapshot-1)表示正在进行写操作,但是还没有发生 commit 操作,这时候 Snapshot-1 是不可读的,用户只能读取已经 commit 之后的 Snapshot。同理,Snapshot-2,Snapshot-3 表示已经可读。

在这里插入图片描述
可以支持并发读,例如可以同时读取 S1、S2、S3 的快照数据,同时,可以回溯到 Snapshot-2 或者 Snapshot-3。在 Snapshot-4 commit 完成之后,这时候 Snapshot-4 已经变成实线,就可以读取数据了。

例如,现在 Current Snapshot 的指针移到 S3,用户对一张表的读操作,都是读 Current Snapshot 指针所指向的 Snapshot,但不会影响前面的 Snapshot 的读操作。

当一切准备完毕之后,会以原子操作的方式 commit 这个 Metadata 文件,这样一次 Iceberg 的数据写入就完成了。随着每次的写入,Iceberg 就生成了下图这样的一个文件组织模式。

2.1.2 增量读取数据

Iceberg 的每个 Snapshot 都包含前一个 Snapshot 的所有数据,每次都相当于全量读取数据,对于整个链路来说,读取数据的代价是非常高的。

如果我们只想读取当前时刻的增量数据,就可以根据 Iceberg 中 Snapshot 的回溯机制来实现,仅读取 Snapshot-1 到 Snapshot-2 的增量数据,也就是下图中的紫色数据部分。

同理,S3 也可以只读取红色部分的增量数据,也可以读取 S1 - S3 的增量数据。

Iceberg 支持读写分离,也就是说可以支持并发读和增量读。

在这里插入图片描述

2.1.3 原子性操作

对于文件列表的所有修改都是原子操作。

  • 在分区中追加数据。
  • 合并或是重写分区。

在这里插入图片描述

  • Iceberg 是以 文件 为粒度提交事务的,所以就没有办法做到以秒为单位提交事务,否则会造成文件数据量膨胀。
  • 比如 Flink 是以 CheckPoint 为写入单位,物理数据在写入 Iceberg 之后并不能被直接查询,只有当触发了 CheckPoint 时才会写 Metadata,这时数据才会由不可见变成可见。而每次 CheckPoint 执行也需要一定的时间。

2.2 事务性提交

2.2.1 写操作要求

原子性替换保证了线性的历史。原子性替换需要依靠以下操作来保证:

  • 记录当前元数据的版本 base version
  • 创建新的元数据以及 Manifest 文件。
  • 原子性的将 base version 替换为新的版本。

2.2.2 冲突解决 - 乐观锁

  • 假定当前没有其他的写操作。
  • 遇到冲突则基于当前最新的元数据进行重试。
  • 元数据管理器所提供的能力。
  • HDFS 或是本地文件系统所提供的原子化的 rename 能力。

3.Iceberg 结合 Flink 场景分享

3.1 构建近实时 Data Pipeline

Iceberg 可以做到分钟级别的准实时数据拉取。


首先,Flink Iceberg 最经典的一个场景就是 构建实时的 Data Pipeline。业务端产生的大量日志数据,被导入到 Kafka 这样的消息队列。运用 Flink 流计算引擎执行 ETL 后,导入到 Apache Iceberg 原始表中。有一些业务场景需要直接跑分析作业来分析原始表的数据,而另外一些业务需要对数据做进一步的提纯。那么我们可以再新起一个 Flink 作业从 Apache Iceberg 表中消费增量数据,经过处理之后写入到提纯之后的 Iceberg 表中。此时,可能还有业务需要对数据做进一步的聚合,那么我们继续在 Iceberg 表上启动增量 Flink 作业,将聚合之后的数据结果写入到聚合表中。

有人会想,这个场景好像通过 Flink Hive 也能实现。 Flink Hive 的确可以实现,但写入到 Hive 的数据更多地是为了实现数仓的数据分析,而不是为了做增量拉取。一般来说,Hive 的增量写入以 Partition 为单位,时间是 15 m i n 15min 15min 以上,Flink 长期高频率地写入会造成 Partition 膨胀。而 Iceberg 容许实现 1 m i n 1min 1min 甚至 30 s 30s 30s 的增量写入,这样就可以大大提高了端到端数据的实时性,上层的分析作业可以看到更新的数据,下游的增量作业可以读取到更新的数据。

3.2 CDC 数据实时摄入摄出

Flink CDC(Change Data Capture)增量数据写入 Iceberg。

  • 支持准实时的数据入湖和数据分析。
  • 计算引擎原生支持 CDC,无需添加额外的组件。
  • 采用统一的数据湖存储方案,并支持多种数据分析引擎。
  • 支持增量数据读取。

在这里插入图片描述
可以用 Flink Iceberg 来分析来自 MySQL 等关系型数据库的 binlog 等。一方面,Apache Flink 已经原生地支持 CDC 数据解析,一条 binlog 数据通过 ververica flink-cdc-connector 拉取之后,自动转换成 Flink Runtime 能识别的 INSERTDELETEUPDATE_BEFOREUPDATE_AFTER 四种消息,供用户做进一步的实时计算。

此外,CDC 数据成功入湖 Iceberg 之后,我们还会打通常见的计算引擎,例如 Presto、Spark、Hive 等,他们都可以实时地读取到 Iceberg 表中的最新数据。

MySQL Binlog 是二进制格式的日志文件,但是不能把 binlog 文件等同于 OS 系统某目录下的具体文件,这是狭隘的。Binlog 是用来记录 MySQL 内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复。

3.3 从 Iceberg 历史数据启动 Flink 任务

在这里插入图片描述
上面的架构是采用 Iceberg 全量数据和 Kafka 的增量数据来驱动新的 Flink 作业。如果需要过去很长时间例如一年的数据,可以采用常见的 Lambda 架构,离线链路通过 Kafka → Flink → Iceberg 同步写入到数据湖,由于 Kafka 成本较高,保留最近 7 7 7 天数据即可,Iceberg 存储成本较低,可以存储全量的历史数据,启动新 Flink 作业的时候,只需要去拉 Iceberg 的数据,跑完之后平滑地对接到 Kafka 数据即可。

3.4 通过 Iceberg 数据来修正实时聚合结果

在这里插入图片描述
同样是在 Lambda 架构下,实时链路由于事件丢失或者到达顺序的问题,可能导致流计算端结果不一定完全准确,这时候一般都需要全量的历史数据来订正实时计算的结果。而我们的 Iceberg 可以很好地充当这个角色,因为它可以高性价比地管理好历史数据。

4.Iceberg 0.11.1 源代码编译

4.1 编译 Iceberg

构建 Iceberg 需要 Grade 5.6 5.6 5.6 和 Java 8 8 8 的环境。

4.1.1 下载 Iceberg 0.11.1 软件包

下载地址:

  • https://github.com/apache/iceberg/releases/tag/apache-iceberg-0.11.1
  • https://www.apache.org/dyn/closer.cgi/iceberg/apache-iceberg-0.11.0/apache-iceberg-0.11.0.tar.gz

4.1.2 解压 Iceberg 0.11.1 软件包

[bigdata@bigdata185 software]$ tar -zxvf iceberg-apache-iceberg-0.11.1.tar.gz -C /opt/module/ 
[bigdata@bigdata185 software]$ cd /opt/module/iceberg-apache-iceberg-0.11.1/

4.1.3 修改对应的版本

我们选择最稳定的版本进行编译,Hadoop 2.7.7 2.7.7 2.7.7、Hive 2.3.9 2.3.9 2.3.9、Flink 1.11.6 1.11.6 1.11.6、Spark 3.0.3 3.0.3 3.0.3

org.apache.flink:* = 1.11.6 
org.apache.hadoop:* = 2.7.7
org.apache.hive:hive-metastore = 2.3.9 
org.apache.hive:hive-serde = 2.3.9 
org.apache.spark:spark-hive_2.12 = 3.0.3

4.1.4 编辑 build.gradle 文件,添加国内源

(1)在 buildscriptrepositories 中添加:

maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }

添加后如下所示:

buildscript {repositories {jcenter()gradlePluginPortal()maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }}dependencies {classpath 'com.github.jengelman.gradle.plugins:shadow:5.0.0'classpath 'com.palantir.baseline:gradle-baseline-java:3.36.2'classpath 'com.palantir.gradle.gitversion:gradle-git-version:0.12.3'classpath 'com.diffplug.spotless:spotless-plugin-gradle:3.14.0'classpath 'gradle.plugin.org.inferred:gradle-processors:2.1.0'classpath 'me.champeau.gradle:jmh-gradle-plugin:0.4.8'}
}

(2)allprojects 中添加:

maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }

添加后如下所示

allprojects {group = "org.apache.iceberg"version = getProjectVersion()repositories {maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }mavenCentral()mavenLocal()}
}

4.1.5 下载依赖(可选)

进入项目根目录,执行脚本:

[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew dependencies

在这里插入图片描述

4.1.6 正式编译

(1)进入项目根目录,执行:

[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew build

(2)上述命令会执行代码里的单元测试,如果不需要,则执行以下命令:

[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew build -x test -x scalaStyle

在这里插入图片描述

4.1.7 生成的目录

在这里插入图片描述

4.2 Iceberg 环境部署

在后面的章节中,我们分别介绍如何集成 Iceberg 0.11.1Flink 1.11.6Spark 3.0.3Hive 2.3.9

5.总结

  • 数据湖的解决方案 Iceberg 介绍。
  • Apache Iceberg 的技术实现细节。
  • Iceberg 结合 Flink 场景分享。
  • Iceberg 0.11.1 0.11.1 0.11.1 源码编译。

相关文章:

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…...

对分库分表进行批量操作

对ShardingJDBC基础了解:https://blog.csdn.net/m0_63297646/article/details/131894472 对批量操作案例:https://blog.csdn.net/m0_63297646/article/details/131843517 分为db0和db1两个库,每个库都有三张订单表,分表键根据年份…...

大数据组件-Flume集群环境的启动与验证

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...

【包过滤防火墙——iptables静态防火墙】的简单使用

文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables :包过滤防火墙,是内核防火墙netfilter的管理工具 核心:四表五链 规则链的分类–五链 在进行路由选择前处理的数据包:PREROUTIN…...

关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题

问题发生的原委 之前在项目开发的时候,我本地也建立了数据库用作开发库,我本地的数据库版本是5.7的,但是测试和生产库都是8.0的版本,我们定义的数据库字符集是utf8mb4,排序规则是utf8mb4_general_ci,前段时…...

进程、操作系统

文章目录 一、冯诺依曼体系(Von Neumann Architecture)1. 概述2. CPU 二、操作系统(Operating System)三、进程(process)/任务(task) 一、冯诺依曼体系(Von Neumann Architecture) 1. 概述 分类 CPU 中央处…...

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner,重写getPartiti…...

HTTP与SOCKS5的区别对比

在互联网世界中,服务器是一种重要的工具,可以帮助我们提高网络安全性等。今天,我们将重点关注两种常见的技术:HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点,并通过Python代码示例学习如何使用它们。 HT…...

在阿里云请求发短信接口去掉证书验证

composer require alibabacloud/dysmsapi-20170525 2.0.23 cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://dysmsapi.aliyuncs.com/?PhoneNumbers 两种方法 第一…...

k8s里pv pvc configmap

通过storageClassName 将PV 和PVC 关联起来。 [rootk8-master home]# cat /home/npm-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata:name: npm-repository-pvcnamespace: jenkins spec:accessModes:- ReadWriteManyresources:requests:storage: 50GistorageC…...

【Atcoder】 [ARC144D] AND OR Equation

题目链接 Atcoder方向 Luogu方向 题目解法 考虑满足条件 2 2 2 的形式为 a n p 0 ∑ i ∈ n p i a_np_0\sum\limits_{i\in n}p_i an​p0​i∈n∑​pi​ 这是一步很巧妙的转化,神奇地利用了 & \& & 和 ∣ | ∣ 的性质,把求 a a a 的…...

python使用字典暴力解析wifi密码

前言 最近无wifi可用,搜到了很多高质量但是没有密码的WiFi,我在想应该可以用python调用常见的wifi字典包来暴力破解一下这些WiFi,也许可以成功 原理 使用pip install pywifi命令安装pywifi 使用它调用本机网卡,设置wifi加密方式,对字典包扫描密码逐个尝试 扫描失败的密码会被…...

java八股文面试[多线程]——synchronized锁升级详细流程

偏向锁 偏向锁是JDK6中的重要引进,因为HotSpot作者经过研究实践发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低,引进了偏向锁。 偏向锁是在单线程执…...

ui网页设计实训心得

ui网页设计实训心得篇一 通过这次实训对这门课程的学习,做好网页,并不是一件容易的事,它包括网页的选题、 内容采集整理、 图片的处理、 页面的排版设置、 背景及其整套网页的色调等很多东西。 所以我得出一下总结: 一、 准备资…...

论文阅读_扩散模型_DDPM

英文名称: Denoising Diffusion Probabilistic Models 中文名称: 去噪扩散概率模型 论文地址: http://arxiv.org/abs/2006.11239 代码地址1: https://github.com/hojonathanho/diffusion (论文对应代码 tensorflow) 代码地址2: https://github.com/AUTOM…...

菜鸟教程《Python 3 教程》笔记(15):数据结构

菜鸟教程《Python 3 教程》笔记(15) 15 数据结构15.1 将列表当作队列使用15.2 遍历技巧 笔记带有个人侧重点,不追求面面俱到。 15 数据结构 出处: 菜鸟教程 - Python3 数据结构 15.1 将列表当作队列使用 在列表的最后添加或者弹…...

CH05_介绍重构名录

重构的记录格式 每个重构手法都有5个部分。 名称(name) 要建造一个重构词汇表,名称是很重要的。 速写(sketch) 名称之后是一个简单的速写(sketch);这部分可以帮助你更快找到你所…...

1、Nginx 简介

文章目录 1、Nginx 简介1.1 Nginx 概述1.2 Nginx 作为 web 服务器1.3 正向代理1.4 反向代理1.5 负载均衡1.6 动静分离 【尚硅谷】尚硅谷Nginx教程由浅入深 志不强者智不达;言不信者行不果。 1、Nginx 简介 1.1 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HT…...

C++之——宏

宏(Macro)是一种在编程语言中使用的符号,通常用于将一段代码片段替换为另一段代码。宏在代码中起到了预处理的作用,它们在编译代码之前被处理和展开。宏通常用于简化代码、提高代码的可读性、实现代码重用以及引入编译时常量。 在…...

代码随想录打卡—day56—【编辑距离】— 9.2 编辑距离系列

1 583. 两个字符串的删除操作 583. 两个字符串的删除操作 【注意点1】感觉和下面这题很像。就是一模一样,return变一下就是。 1143. 最长公共子序列 【注意点2】注意这题和day55的最后一题的区别,本题求的是最大长度,那题求的是组合方式。…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...