基于Hudi的增量OLAP处理方案

  • 时间:2025-12-03 21:56 作者: 来源: 阅读:1
  • 扫一扫,手机访问
摘要:基于Hudi的增量OLAP处理方案 关键词:Hudi、增量OLAP、数据处理、实时分析、数据湖 摘要:本文深入探讨了基于Hudi的增量OLAP处理方案。首先介绍了方案提出的背景,包括OLAP处理的现状和Hudi的特性。接着详细阐述了Hudi的核心概念与联系,以及相关的核心算法原理和具体操作步骤。通过数学模型和公式进一步解释其工作机制,并结合实际案例进行说明。还介绍了如何进行项目实战,包括开发

基于Hudi的增量OLAP处理方案

关键词:Hudi、增量OLAP、数据处理、实时分析、数据湖

摘要:本文深入探讨了基于Hudi的增量OLAP处理方案。首先介绍了方案提出的背景,包括OLAP处理的现状和Hudi的特性。接着详细阐述了Hudi的核心概念与联系,以及相关的核心算法原理和具体操作步骤。通过数学模型和公式进一步解释其工作机制,并结合实际案例进行说明。还介绍了如何进行项目实战,包括开发环境搭建、源代码实现与解读。分析了该方案的实际应用场景,推荐了相关的工具和资源。最后总结了未来发展趋势与挑战,提供了常见问题的解答和扩展阅读的参考资料,旨在为读者全面呈现基于Hudi的增量OLAP处理方案的全貌。

1. 背景介绍

1.1 目的和范围

在当今的数据驱动时代,企业和组织需要对海量数据进行快速、高效的分析,以支持决策制定。OLAP(联机分析处理)作为一种重要的数据分析技术,能够帮助用户从多个维度对数据进行切片、切块、钻取等操作,从而深入了解数据背后的信息。然而,传统的OLAP处理方式在处理实时数据和增量数据时面临着诸多挑战,如数据更新不及时、处理效率低下等。

Hudi(Hadoop Upserts Deletes and Incrementals)是一个开源的数据湖平台,它提供了增量数据处理和管理的能力,能够有效地解决传统OLAP处理中的问题。本文的目的是介绍基于Hudi的增量OLAP处理方案,包括其原理、实现步骤、应用场景等,范围涵盖了从理论到实践的各个方面。

1.2 预期读者

本文的预期读者包括数据工程师、数据分析师、大数据开发人员以及对OLAP和数据湖技术感兴趣的技术人员。这些读者需要具备一定的大数据和数据库知识,了解基本的数据分析和处理概念。

1.3 文档结构概述

本文将按照以下结构进行组织:

背景介绍:介绍方案的目的、范围、预期读者和文档结构概述。核心概念与联系:详细解释Hudi的核心概念,如COW和MOR存储类型、索引机制等,并通过示意图和流程图展示它们之间的联系。核心算法原理 & 具体操作步骤:讲解Hudi的核心算法原理,如数据写入、合并、索引更新等,并使用Python源代码进行详细阐述。数学模型和公式 & 详细讲解 & 举例说明:通过数学模型和公式解释Hudi的工作机制,并结合实际例子进行说明。项目实战:代码实际案例和详细解释说明,包括开发环境搭建、源代码实现和代码解读。实际应用场景:分析基于Hudi的增量OLAP处理方案的实际应用场景。工具和资源推荐:推荐相关的学习资源、开发工具框架和论文著作。总结:未来发展趋势与挑战:总结方案的优点和不足,展望未来的发展趋势和面临的挑战。附录:常见问题与解答:提供常见问题的解答。扩展阅读 & 参考资料:提供扩展阅读的参考资料。

1.4 术语表

1.4.1 核心术语定义
OLAP(联机分析处理):一种数据分析技术,用于对海量数据进行多维分析,支持用户从不同的维度和层次对数据进行查询和分析。Hudi:一个开源的数据湖平台,提供了增量数据处理和管理的能力,支持数据的插入、更新、删除和增量查询。COW(Copy-on-Write):Hudi的一种存储类型,在写入数据时会复制一份原始数据,然后在新的数据副本上进行修改。MOR(Merge-on-Read):Hudi的另一种存储类型,在写入数据时会将新数据追加到日志文件中,在读取数据时再将日志文件和基础数据文件进行合并。索引:Hudi用于快速定位和查找数据的机制,常见的索引类型包括布隆过滤器索引、HBase索引等。
1.4.2 相关概念解释
数据湖:一个集中存储企业所有结构化和非结构化数据的存储库,数据可以以原始形式存储,方便后续的分析和处理。增量数据处理:只处理数据中的新增或修改部分,而不是对整个数据集进行处理,从而提高处理效率。实时分析:对实时产生的数据进行即时分析,以获取最新的信息和洞察。
1.4.3 缩略词列表
OLAP:联机分析处理(Online Analytical Processing)Hudi:Hadoop Upserts Deletes and IncrementalsCOW:Copy-on-WriteMOR:Merge-on-Read

2. 核心概念与联系

2.1 Hudi的核心概念

2.1.1 存储类型

Hudi提供了两种主要的存储类型:COW和MOR。

COW(Copy-on-Write):在COW存储类型下,每次写入数据时,Hudi会复制一份原始数据文件,然后在新的数据副本上进行修改。这种方式的优点是读取性能高,因为数据始终以完整的文件形式存在,不需要进行合并操作。但是,写入性能相对较低,因为需要复制大量的数据。MOR(Merge-on-Read):在MOR存储类型下,写入数据时,Hudi会将新数据追加到日志文件中,而不是直接修改原始数据文件。在读取数据时,Hudi会将日志文件和基础数据文件进行合并,生成最终的数据集。这种方式的优点是写入性能高,因为只需要追加数据到日志文件中,不需要复制大量的数据。但是,读取性能相对较低,因为需要进行合并操作。
2.1.2 索引机制

Hudi提供了多种索引机制,用于快速定位和查找数据。常见的索引类型包括:

布隆过滤器索引:布隆过滤器是一种空间效率很高的概率型数据结构,用于判断一个元素是否存在于一个集合中。Hudi使用布隆过滤器索引来快速判断一个数据记录是否存在于某个数据文件中,从而减少不必要的文件扫描。HBase索引:HBase是一个分布式的、面向列的NoSQL数据库。Hudi可以使用HBase作为索引存储,将数据记录的主键和对应的文件位置信息存储在HBase中,从而实现快速的数据查找。

2.2 核心概念的联系

Hudi的存储类型和索引机制是相互关联的。不同的存储类型对索引的使用方式和性能有不同的影响。例如,在COW存储类型下,由于数据文件是完整的,索引可以直接定位到具体的数据文件,读取性能较高。而在MOR存储类型下,由于数据需要在读取时进行合并,索引需要同时考虑基础数据文件和日志文件的位置,读取性能相对较低。

2.3 文本示意图和Mermaid流程图

2.3.1 文本示意图

以下是一个简单的文本示意图,展示了Hudi的COW和MOR存储类型的工作原理:


COW存储类型:
原始数据文件 -> 复制一份新的数据文件 -> 在新的数据文件上进行修改

MOR存储类型:
原始数据文件 -> 追加新数据到日志文件 -> 读取数据时合并日志文件和原始数据文件
2.3.2 Mermaid流程图

3. 核心算法原理 & 具体操作步骤

3.1 核心算法原理

3.1.1 数据写入算法

在Hudi中,数据写入算法根据存储类型的不同而有所不同。

COW存储类型:当使用COW存储类型写入数据时,Hudi会首先复制一份原始数据文件,然后将新数据合并到新的数据副本中。具体步骤如下:

确定需要写入数据的分区和文件。复制原始数据文件到临时目录。将新数据与临时数据文件进行合并。将合并后的数据文件替换原始数据文件。

MOR存储类型:当使用MOR存储类型写入数据时,Hudi会将新数据追加到日志文件中。具体步骤如下:

确定需要写入数据的分区和文件。打开对应的日志文件。将新数据追加到日志文件末尾。
3.1.2 数据合并算法

在MOR存储类型下,需要在读取数据时将日志文件和基础数据文件进行合并。Hudi使用了一种高效的数据合并算法,具体步骤如下:

按照时间顺序对日志文件进行排序。逐行读取基础数据文件和日志文件。根据数据记录的主键进行合并,保留最新的记录。
3.1.3 索引更新算法

当有新的数据写入时,Hudi需要更新索引信息,以确保能够快速定位和查找数据。索引更新算法的具体步骤如下:

确定需要更新索引的数据记录。根据索引类型(如布隆过滤器索引、HBase索引),更新相应的索引信息。

3.2 具体操作步骤

以下是使用Python和PySpark实现基于Hudi的增量OLAP处理的具体操作步骤:

3.2.1 安装和配置Hudi

首先,需要安装Hudi和相关的依赖库。可以使用以下命令安装:


pip install hudi-spark3.1-bundle
3.2.2 创建SparkSession

from pyspark.sql import SparkSession

spark = SparkSession.builder 
    .appName("HudiIncrementalOLAP") 
    .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
    .config("spark.sql.hive.convertMetastoreParquet", "false") 
    .getOrCreate()
3.2.3 定义数据写入函数

from pyspark.sql.functions import col
from hudi.hudi_options import HudiOptions

def write_data_to_hudi(df, table_name, base_path, storage_type="cow"):
    hudi_options = {
        HudiOptions.TABLE_TYPE_OPT_KEY: "COPY_ON_WRITE" if storage_type == "cow" else "MERGE_ON_READ",
        HudiOptions.RECORDKEY_FIELD_OPT_KEY: "id",
        HudiOptions.PARTITIONPATH_FIELD_OPT_KEY: "partition_col",
        HudiOptions.PRECOMBINE_FIELD_OPT_KEY: "timestamp",
        HudiOptions.HIVE_SYNC_ENABLED_OPT_KEY: "true",
        HudiOptions.HIVE_TABLE_OPT_KEY: table_name,
        HudiOptions.HIVE_PARTITION_FIELDS_OPT_KEY: "partition_col",
        HudiOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY: "org.apache.hudi.hive.MultiPartKeysValueExtractor"
    }

    df.write 
      .format("hudi") 
      .options(**hudi_options) 
      .mode("append") 
      .save(base_path)
3.2.4 定义数据读取函数

def read_data_from_hudi(base_path):
    return spark.read 
      .format("hudi") 
      .load(base_path)
3.2.5 示例代码

# 创建示例数据
data = [
    (1, "value1", "2023-01-01", "partition1"),
    (2, "value2", "2023-01-02", "partition2")
]
columns = ["id", "value", "timestamp", "partition_col"]
df = spark.createDataFrame(data, columns)

# 写入数据到Hudi
table_name = "my_hudi_table"
base_path = "hdfs://localhost:9000/hudi_tables/my_hudi_table"
write_data_to_hudi(df, table_name, base_path, storage_type="cow")

# 读取数据
result_df = read_data_from_hudi(base_path)
result_df.show()

4. 数学模型和公式 & 详细讲解 & 举例说明

4.1 数学模型和公式

4.1.1 数据合并公式

在MOR存储类型下,数据合并可以用以下公式表示:

设基础数据文件为 B={b1,b2,⋯ ,bn}B = {b_1, b_2, cdots, b_n}B={b1​,b2​,⋯,bn​},日志文件为 L={l1,l2,⋯ ,lm}L = {l_1, l_2, cdots, l_m}L={l1​,l2​,⋯,lm​},其中 bib_ibi​ 和 ljl_jlj​ 分别表示基础数据文件和日志文件中的数据记录。合并后的数据文件为 MMM。

对于每个主键 kkk,合并规则如下:

如果 kkk 只存在于 BBB 中,则 Mk=bkM_k = b_kMk​=bk​。如果 kkk 只存在于 LLL 中,则 Mk=lkM_k = l_kMk​=lk​。如果 kkk 同时存在于 BBB 和 LLL 中,且 lkl_klk​ 的时间戳大于 bkb_kbk​ 的时间戳,则 Mk=lkM_k = l_kMk​=lk​;否则 Mk=bkM_k = b_kMk​=bk​。
4.1.2 索引查找公式

以布隆过滤器索引为例,设布隆过滤器的位数组为 BBB,哈希函数为 h1,h2,⋯ ,hkh_1, h_2, cdots, h_kh1​,h2​,⋯,hk​,要查找的数据记录的主键为 kkk。

判断 kkk 是否存在于布隆过滤器中的公式为:

4.2 详细讲解

4.2.1 数据合并讲解

在实际应用中,数据合并是MOR存储类型的核心操作。通过上述公式可以看到,合并过程主要是根据数据记录的主键和时间戳来决定最终保留哪条记录。这种方式可以确保在读取数据时,能够获取到最新的信息。

4.2.2 索引查找讲解

布隆过滤器索引通过多个哈希函数将数据记录的主键映射到位数组中。当需要查找某个数据记录时,通过同样的哈希函数计算出对应的位位置,然后检查这些位是否都为1。如果都为1,则说明该数据记录可能存在于布隆过滤器中;如果有一个位为0,则说明该数据记录一定不存在于布隆过滤器中。这种方式可以快速排除大量不必要的文件扫描,提高查找效率。

4.3 举例说明

4.3.1 数据合并举例

假设基础数据文件 BBB 中有以下记录:

idvaluetimestamp
1v12023-01-01
2v22023-01-02

日志文件 LLL 中有以下记录:

idvaluetimestamp
1v1_new2023-01-03
3v32023-01-04

根据数据合并公式,合并后的数据文件 MMM 如下:

idvaluetimestamp
1v1_new2023-01-03
2v22023-01-02
3v32023-01-04
4.3.2 索引查找举例

假设布隆过滤器的位数组 BBB 长度为 10,哈希函数为 h1(k)=k mod 10h_1(k) = k mod 10h1​(k)=kmod10,h2(k)=(k+3) mod 10h_2(k) = (k + 3) mod 10h2​(k)=(k+3)mod10。已经插入了主键为 1 和 2 的数据记录,此时位数组 BBB 为:

0123456789
0110000000

要查找主键为 3 的数据记录,计算 h1(3)=3h_1(3) = 3h1​(3)=3,h2(3)=6h_2(3) = 6h2​(3)=6。由于 B[3]=0B[3] = 0B[3]=0,根据索引查找公式,exists(3)=0 ext{exists}(3) = 0exists(3)=0,说明主键为 3 的数据记录一定不存在于布隆过滤器中。

5. 项目实战:代码实际案例和详细解释说明

5.1 开发环境搭建

5.1.1 安装Hadoop和Spark

首先,需要安装Hadoop和Spark。可以从官方网站下载Hadoop和Spark的安装包,然后按照官方文档进行安装和配置。

5.1.2 安装Hudi

可以使用以下命令安装Hudi:


pip install hudi-spark3.1-bundle
5.1.3 配置环境变量

~/.bashrc ~/.bash_profile 中添加以下环境变量:


export HADOOP_HOME=/path/to/hadoop
export SPARK_HOME=/path/to/spark
export PATH=$PATH:$HADOOP_HOME/bin:$SPARK_HOME/bin

5.2 源代码详细实现和代码解读

5.2.1 数据生成

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, rand

# 创建SparkSession
spark = SparkSession.builder 
    .appName("HudiIncrementalOLAPProject") 
    .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
    .config("spark.sql.hive.convertMetastoreParquet", "false") 
    .getOrCreate()

# 生成示例数据
data = [(i, f"value_{i}", f"2023-01-{i % 31 + 1}", f"partition_{i % 5}") for i in range(1000)]
columns = ["id", "value", "timestamp", "partition_col"]
df = spark.createDataFrame(data, columns)

代码解读:首先创建了一个SparkSession,用于与Spark集群进行交互。然后生成了一个包含1000条记录的示例数据集,每条记录包含 id value timestamp partition_col 四个字段。

5.2.2 数据写入

from hudi.hudi_options import HudiOptions

def write_data_to_hudi(df, table_name, base_path, storage_type="cow"):
    hudi_options = {
        HudiOptions.TABLE_TYPE_OPT_KEY: "COPY_ON_WRITE" if storage_type == "cow" else "MERGE_ON_READ",
        HudiOptions.RECORDKEY_FIELD_OPT_KEY: "id",
        HudiOptions.PARTITIONPATH_FIELD_OPT_KEY: "partition_col",
        HudiOptions.PRECOMBINE_FIELD_OPT_KEY: "timestamp",
        HudiOptions.HIVE_SYNC_ENABLED_OPT_KEY: "true",
        HudiOptions.HIVE_TABLE_OPT_KEY: table_name,
        HudiOptions.HIVE_PARTITION_FIELDS_OPT_KEY: "partition_col",
        HudiOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY: "org.apache.hudi.hive.MultiPartKeysValueExtractor"
    }

    df.write 
      .format("hudi") 
      .options(**hudi_options) 
      .mode("append") 
      .save(base_path)

table_name = "project_hudi_table"
base_path = "hdfs://localhost:9000/hudi_tables/project_hudi_table"
write_data_to_hudi(df, table_name, base_path, storage_type="cow")

代码解读:定义了一个 write_data_to_hudi 函数,用于将数据写入Hudi表。函数中设置了Hudi的各种选项,如存储类型、记录键、分区字段等。然后使用 DataFrame.write 方法将数据写入指定的Hudi表。

5.2.3 数据读取

def read_data_from_hudi(base_path):
    return spark.read 
      .format("hudi") 
      .load(base_path)

result_df = read_data_from_hudi(base_path)
result_df.show()

代码解读:定义了一个 read_data_from_hudi 函数,用于从Hudi表中读取数据。函数中使用 DataFrame.read 方法读取指定路径下的Hudi表数据,并返回一个 DataFrame 对象。最后调用 show 方法显示数据。

5.3 代码解读与分析

5.3.1 数据生成部分

通过生成示例数据,我们可以模拟实际的数据场景。在实际应用中,可以从各种数据源(如数据库、文件系统等)读取数据。

5.3.2 数据写入部分

在数据写入时,我们设置了Hudi的各种选项,这些选项对数据的存储和查询性能有重要影响。例如, RECORDKEY_FIELD_OPT_KEY 用于指定数据记录的主键, PARTITIONPATH_FIELD_OPT_KEY 用于指定数据的分区字段。

5.3.3 数据读取部分

在数据读取时,我们使用 DataFrame.read 方法读取Hudi表数据。Hudi会根据存储类型和索引信息,高效地读取数据。

6. 实际应用场景

6.1 实时数据分析

在金融、电商等行业,需要对实时产生的数据进行分析,以获取最新的业务信息。基于Hudi的增量OLAP处理方案可以实时处理新增和修改的数据,确保分析结果的及时性。例如,电商平台可以实时分析用户的购买行为,及时调整营销策略。

6.2 数据仓库更新

传统的数据仓库在更新数据时需要进行全量更新,效率较低。使用Hudi的增量OLAP处理方案,可以只更新数据中的新增和修改部分,大大提高数据仓库的更新效率。例如,企业的数据仓库可以每天只更新当天新增和修改的数据,而不需要重新处理整个数据集。

6.3 多数据源集成

在企业中,往往存在多个数据源,如关系型数据库、NoSQL数据库、文件系统等。Hudi可以将这些不同数据源的数据集成到一个数据湖中,并支持增量数据处理。例如,企业可以将业务系统的数据库数据和日志文件数据集成到Hudi数据湖中,进行统一的分析和处理。

7. 工具和资源推荐

7.1 学习资源推荐

7.1.1 书籍推荐
《大数据技术原理与应用》:全面介绍了大数据的相关技术,包括Hadoop、Spark等,对理解Hudi的底层原理有很大帮助。《数据湖实战》:详细介绍了数据湖的概念、架构和实现方法,以及如何使用Hudi等工具构建数据湖。
7.1.2 在线课程
Coursera上的“大数据分析与应用”课程:提供了大数据分析的基础知识和实践案例,包括Hudi的使用。edX上的“Spark和大数据分析”课程:深入讲解了Spark的原理和应用,以及如何与Hudi结合使用。
7.1.3 技术博客和网站
Hudi官方文档:提供了Hudi的详细文档和使用指南,是学习Hudi的重要资源。大数据技术社区:如InfoQ、开源中国等,提供了大数据领域的最新技术文章和案例分享。

7.2 开发工具框架推荐

7.2.1 IDE和编辑器
PyCharm:一款专业的Python IDE,支持Spark和Hudi的开发。IntelliJ IDEA:功能强大的Java和Scala IDE,也可以用于Hudi的开发。
7.2.2 调试和性能分析工具
Spark UI:Spark自带的监控和调试工具,可以查看Spark作业的运行情况和性能指标。Ganglia:一款分布式系统监控工具,可以监控Hadoop和Spark集群的性能。
7.2.3 相关框架和库
Apache Spark:一个快速通用的集群计算系统,与Hudi紧密集成,提供了强大的数据处理能力。Apache Hive:一个数据仓库基础设施,与Hudi集成可以实现数据的查询和分析。

7.3 相关论文著作推荐

7.3.1 经典论文
“Hudi: An Architecture for Incremental Data Processing on Large Datasets”:介绍了Hudi的架构和核心算法原理。“Data Lakes: A New Paradigm for Big Data Analytics”:探讨了数据湖的概念和发展趋势。
7.3.2 最新研究成果

可以关注ACM SIGMOD、VLDB等数据库领域的顶级会议,获取Hudi和数据湖相关的最新研究成果。

7.3.3 应用案例分析

一些知名企业的技术博客会分享他们使用Hudi的应用案例,如Uber、Airbnb等,可以从中学习到实际应用中的经验和技巧。

8. 总结:未来发展趋势与挑战

8.1 未来发展趋势

8.1.1 与云原生技术的深度融合

随着云原生技术的发展,Hudi将与云原生技术进行更深度的融合,如与Kubernetes、Docker等结合,实现更高效的部署和管理。

8.1.2 支持更多的数据格式和数据源

未来,Hudi将支持更多的数据格式和数据源,如JSON、Avro等,以及更多的数据库和存储系统,提高数据集成的灵活性。

8.1.3 智能化的数据处理和分析

Hudi将引入更多的智能化技术,如机器学习、人工智能等,实现自动化的数据处理和分析,提高数据分析的效率和准确性。

8.2 挑战

8.2.1 数据一致性问题

在处理增量数据时,如何保证数据的一致性是一个挑战。Hudi需要不断优化其数据处理算法,确保在并发写入和更新的情况下,数据的一致性得到保证。

8.2.2 性能优化

随着数据量的不断增长,Hudi的性能优化变得尤为重要。需要进一步优化数据存储和索引机制,提高数据写入和读取的性能。

8.2.3 生态系统建设

Hudi的生态系统还不够完善,需要加强与其他大数据工具和框架的集成,提供更多的插件和扩展,以满足不同用户的需求。

9. 附录:常见问题与解答

9.1 Hudi支持哪些存储系统?

Hudi支持多种存储系统,如HDFS、S3、GCS等。

9.2 如何选择COW和MOR存储类型?

如果对读取性能要求较高,且数据更新频率较低,可以选择COW存储类型;如果对写入性能要求较高,且数据更新频率较高,可以选择MOR存储类型。

9.3 Hudi的索引机制有哪些优缺点?

布隆过滤器索引的优点是空间效率高,查找速度快;缺点是存在一定的误判率。HBase索引的优点是查找准确;缺点是需要额外的HBase集群支持,维护成本较高。

9.4 如何进行Hudi的性能调优?

可以通过调整Hudi的各种参数,如写入并行度、索引类型等,以及优化数据分区策略来进行性能调优。

10. 扩展阅读 & 参考资料

10.1 扩展阅读

《大数据时代:生活、工作与思维的大变革》:探讨了大数据对社会和生活的影响。《人工智能:现代方法》:介绍了人工智能的基本概念和方法。

10.2 参考资料

Hudi官方网站:https://hudi.apache.org/Apache Spark官方文档:https://spark.apache.org/docs/latest/Apache Hive官方文档:https://cwiki.apache.org/confluence/display/Hive/Home
  • 全部评论(0)
最新发布的资讯信息
【系统环境|】创建一个本地分支(2025-12-03 22:43)
【系统环境|】git 如何删除本地和远程分支?(2025-12-03 22:42)
【系统环境|】2019|阿里11面+EMC+网易+美团面经(2025-12-03 22:42)
【系统环境|】32位单片机定时器入门介绍(2025-12-03 22:42)
【系统环境|】从 10 月 19 日起,GitLab 将对所有免费用户强制实施存储限制(2025-12-03 22:42)
【系统环境|】价值驱动的产品交付-OKR、协作与持续优化实践(2025-12-03 22:42)
【系统环境|】IDEA 强行回滚已提交到Master上的代码(2025-12-03 22:42)
【系统环境|】GitLab 15.1发布,Python notebook图形渲染和SLSA 2级构建工件证明(2025-12-03 22:41)
【系统环境|】AI 代码审查 (Code Review) 清单 v1.0(2025-12-03 22:41)
【系统环境|】构建高效流水线:CI/CD工具如何提升软件交付速度(2025-12-03 22:41)
手机二维码手机访问领取大礼包
返回顶部