Apache Hudi:數據湖的實時革命

Apache Hudi是一個開源的數據湖存儲格式和框架,它通過引入類似數據庫的事務機制,解決了傳統數據湖在實時更新、低延遲查詢和增量消費方面的痛點。Hudi最初由Uber于2016年開發并應用于生產環境,2017年開源,2019年成為Apache孵化項目,2021年正式畢業為Apache頂級項目。作為數據湖領域的創新者,Hudi的核心價值在于實現了PB級數據湖上的低延遲ACID事務,使數據湖具備了接近數據庫的實時性 ,同時保持了數據湖的靈活性和成本優勢。

Figure: Apache Hudi Database Architecture

一、Apache Hudi的誕生背景

1.1 傳統數據湖的局限性

在大數據領域,數據湖(Data Lake)作為一種存儲原始數據的低成本解決方案,得到了廣泛應用。然而,傳統數據湖(如HDFS+Parquet)存在幾個關鍵缺陷:

  • 僅支持追加操作:傳統數據湖無法高效支持記錄級別的更新、刪除操作,每次更新都需要全量覆蓋,導致存儲膨脹和性能下降 。
  • 缺乏版本控制:數據更新后無法回滾,難以支持復雜的數據治理和合規要求 。
  • 高延遲查詢:數據更新后需要等待批處理作業完成,才能獲得最新視圖,無法滿足近實時分析需求 。
  • 增量消費困難:下游系統需要重新處理全量數據才能獲取變更,導致資源浪費和處理延遲?。

這些問題在Uber等處理海量實時數據的企業中尤為突出。Uber每天處理數百TB的行程、乘客和司機數據,傳統的批處理方式無法滿足其對低延遲數據分析的需求。

1.2 Hudi的誕生歷程

為解決上述問題,Uber于2016年8月開發了Hudi(Hadoop Updates and Incrementals的縮寫),并在生產環境中部署 。Hudi最初被稱為"Hoodie",在2017年開源,并于2019年捐贈給Apache軟件基金會,2021年4月左右畢業成為Apache頂級項目 。

Hudi的誕生背景與Uber的業務需求緊密相關。在當時,Uber面臨的主要挑戰包括:

  • 實時數據更新:需要支持海量數據的實時更新,如行程狀態變更、乘客信息更新等 。
  • 低延遲查詢:業務決策需要基于最新數據,無法接受小時級或天級的延遲 。
  • 增量消費:下游系統需要高效獲取數據變更,而不是重新處理全量數據 。
  • 數據治理:需要支持數據版本控制、回滾和審計等功能 。

Hudi通過引入類似數據庫的事務機制和文件組織方式,成功解決了這些問題,成為Uber數據湖的核心組件。

二、Hudi的核心架構設計

2.1 三層架構模型

Apache Hudi采用分層架構設計,分為事務數據庫層、編程API層和用戶接口層:

  1. 事務數據庫層:這是Hudi的核心,包含表格式(存儲布局)、表服務(文件優化)、索引(加速讀寫)、并發控制(確保數據一致性)、湖緩存(提升讀取效率)和元服務器(集中元數據訪問)等組件 。
  2. 編程API層:提供標準化的寫入器和讀取器接口,使Hudi能夠與各種計算引擎(如Spark、Flink)集成,同時支持高效的更新插入和增量處理?。
  3. 用戶接口層:提供高級別工具,包括攝取實用程序(如DeltaStreamer)、目錄同步工具和管理CLI等平臺服務,以及與Spark、Hive、Presto等查詢引擎的集成 。

這種分層設計使Hudi既具備了數據庫的事務能力和實時性,又保持了數據湖的靈活性和可擴展性。

2.2 存儲類型與文件組織

Hudi支持兩種主要的存儲類型,針對不同的使用場景優化:

  1. 寫時復制(Copy On Write, COW):所有數據都存儲在列式文件(如Parquet)中,每次更新都會生成新版本的文件。COW表的寫入成本較高(需要重寫整個文件),但讀取性能最佳,適合讀取密集型分析工作。

  2. 讀時合并(Merge On Read, MOR):數據分為基線文件(列式Parquet)和增量日志(行式Avro)兩部分存儲。MOR表的寫入成本較低(只需追加日志),但讀取性能略差(需要合并基線和日志),適合寫入密集型場景和需要低延遲查詢的應用。

Hudi的數據組織遵循以下層級結構:

  • 基本路徑(Base Path):數據集的根目錄,所有數據和元數據都存儲在此路徑下 。
  • 分區(Partition):數據按分區鍵(如時間戳)組織到不同的子目錄中,類似于Hive表的分區機制 。
  • 文件組(File Group):由文件ID唯一標識的邏輯單元,包含一組記錄的所有版本。
  • 文件切片(File Slice):每個文件組包含多個文件切片,每個切片包含一個基線文件(.parquet)和一組增量日志(.log.*)。

這種組織方式使Hudi能夠高效管理海量數據,并支持記錄級別的更新操作。

2.3 時間軸與版本控制

Hudi的核心創新之一是引入了時間軸(Timeline)機制,用于跟蹤表的歷史變化:

  • 時間軸結構:Hudi 1.0版本引入了LSM(Log-Structured Merge)樹時間線,采用分層結構(L0活動層、L1-Ln優化層)管理歷史操作,支持百萬級歷史記錄管理 。
  • 操作類型:包括COMMITS(提交)、CLEANS(清理)、DELTA_COMMIT(增量提交)、COMPACTION(壓縮)、ROLLBACK(回滾)和SAVEPOINT(保存點)等 。
  • 時間戳管理:Hudi采用TrueTime語義確保所有操作的時間戳單調遞增和全局有序,解決時鐘偏斜問題 。

時間軸機制使Hudi能夠提供三種視圖:

  1. 快照視圖(Snapshot View):提供表的最新狀態,所有已完成操作的數據?。
  2. 讀優化視圖(Read Optimized View):僅包含基線文件,優化查詢性能?。
  3. 增量視圖(Incremental View):提供指定時間點后的增量數據,支持高效消費變更 。

這種設計使Hudi能夠同時滿足實時更新和高效查詢的需求。

三、Hudi解決的關鍵問題

3.1 數據更新問題

傳統數據湖僅支持追加操作,無法高效支持記錄級別的更新、刪除操作。Hudi通過COW/MOR表結構實現了記錄級的IUD(插入、更新、刪除)操作

  • COW表:通過重寫文件保證更新一致性,適合讀取密集型場景。
  • MOR表:通過日志追加降低寫入開銷,適合寫入密集型場景 。

Hudi的索引機制(如BloomFilter、HBase索引)將hoodie鍵(記錄鍵+分區路徑)映射到文件組,確保更新操作能夠快速定位到目標文件。這種設計使Hudi能夠處理PB級數據湖的實時更新,而無需全量覆蓋。

3.2 延遲處理問題

在流處理場景中,數據通常存在延遲到達的情況。Hudi通過事件時間(Event Time)與提交時間(Arrival Time)分離的機制,支持亂序數據處理

  • 事件時間:數據中記錄的時間,表示事件實際發生的時間。
  • 提交時間:數據到達Hudi的時間,表示數據被寫入的時間。

這種分離使Hudi能夠將延遲數據歸入正確的事件時間分區,而不是提交時間分區。例如,一個9:00事件的數據在10:20到達,Hudi仍會將其寫入9:00的分區,而不是10:20的分區。這使得下游系統能夠基于事件時間進行一致的分析,而無需擔心數據延遲。

3.3 增量消費問題

傳統數據湖的增量消費通常依賴文件夾/分區的創建時間,這在處理延遲數據時效率低下。Hudi通過時間軸機制提供了高效的增量消費能力

  • 增量視圖:下游系統可以基于提交時間戳獲取增量數據,無需掃描全量數據。
  • 增量查詢:通過時間軸的元數據,Hudi能夠快速定位哪些文件切片包含新數據,只消費這些文件。
  • 增量管道:Hudi支持構建高效的增量ETL管道,每小時處理TB級數據,端到端延遲僅30分鐘。

這種能力在構建實時數據管道、機器學習特征工程和數據分發等場景中尤為重要,能夠顯著降低計算資源消耗和處理延遲。

四、Hudi的核心特性

4.1 ACID事務支持

Hudi提供了類似數據庫的ACID事務能力,確保數據更新的原子性、一致性、隔離性和持久性 :

  • 原子性(Atomicity):通過時間軸的atomic commit機制實現,提交前生成臨時文件,成功后原子替換 。
  • 一致性(Consistency):保證數據更新符合業務規則,如主鍵唯一性等 。
  • 隔離性(Isolation):通過快照隔離(Snapshot Isolation)確保并發事務互不干擾,讀取器始終基于提交時間戳訪問已完成的文件版本?。
  • 持久性(Durability):確保已提交的數據即使在系統故障后也能恢復 。

Hudi的ACID事務支持使其能夠處理關鍵業務場景,如GDPR數據刪除、金融交易記錄更新等,確保數據的準確性和可靠性。

4.2 MVCC與并發控制

Hudi采用多版本并發控制(MVCC)和非阻塞并發控制(NBCC)機制,實現高并發寫入和低延遲查詢:

  • MVCC機制:基于時間軸的瞬時(Instant)生成Read View,事務開始時創建快照,后續查詢僅訪問該快照時間點前的已完成版本?。
  • NBCC機制:允許多個寫入器并行追加日志文件(MOR表),沖突在壓縮階段解決,通過記錄提交開始和完成時間戳實現日志排序?。
  • OCC機制:用于COW表,寫入前檢查版本,沖突時重試 。

這些機制使Hudi能夠在處理大量并發寫入的同時,保持低延遲的查詢性能,滿足實時分析的需求。

4.3 文件組織與LSM樹時間線

Hudi 1.0版本引入了LSM樹時間線,優化了元數據管理和歷史版本控制:

  • 分層結構:元數據文件按對數結構合并(LSM)樹布局組織成層(L0、L1、L2等),每層文件按時間戳排序,命名遵循{min_instant}_{max_instant}_${level}.parquet格式?。
  • 壓縮策略:活動層(L0)的事務日志(Avro格式)在達到閾值后被合并到優化層(L1),進一步減少存儲開銷和查詢延遲? 。
  • 清單文件:跟蹤同一層中可能重疊時間范圍的文件,提高元數據查詢效率? 。

LSM樹時間線使Hudi能夠有效管理海量歷史版本,支持長時間窗口的增量查詢,而不會因文件列表膨脹導致性能下降。

4.4 索引機制

Hudi支持多種索引機制,加速記錄的定位和查找:

  • BloomFilter索引:為每個文件切片生成布隆過濾器,快速判斷記錄是否存在,減少文件掃描范圍?。
  • HBase索引:利用HBase的O(1)查詢能力,實現高效記錄定位。
  • Elasticsearch索引:支持全文搜索和復雜查詢,適合非結構化數據場景。

這些索引機制使Hudi能夠處理PB級數據的高效查詢,而無需依賴外部數據庫或搜索引擎。

4.5 增量查詢與消費

Hudi的時間軸機制使其能夠提供高效的增量查詢和消費能力:

  • 增量視圖:下游系統可以基于提交時間戳獲取增量數據,無需掃描全量數據?。
  • 增量拉取:通過時間軸的元數據,Hudi能夠快速定位哪些文件切片包含新數據,只消費這些文件?。
  • 增量處理:支持構建增量ETL管道,每小時處理TB級數據,端到端延遲僅30分鐘?。

這種能力在構建實時數據管道、機器學習特征工程和數據分發等場景中尤為重要,能夠顯著降低計算資源消耗和處理延遲。

五、Hudi與同類產品的技術對比

5.1 Hudi vs Delta Lake
特性HudiDelta Lake適用場景
存儲類型支持COW和MOR僅支持COWHudi適合實時更新和低延遲查詢;Delta Lake適合Spark生態內的流批一體
增量消費時間軸機制,支持事件時間與提交時間分離事務日志,按提交時間戳消費Hudi支持延遲數據歸入正確事件時間分區;Delta Lake需重新處理全量數據
索引機制支持多種索引(BloomFilter、HBase等)僅支持簡單的分區索引Hudi提供高效的記錄定位能力;Delta Lake依賴分區優化查詢
并發控制COW表使用OCC,MOR表使用NBCC僅支持OCCHudi的MOR表支持更高的寫入吞吐量;Delta Lake在沖突時需重試
生態集成原生支持Flink,與Spark、Hive等兼容深度集成Spark,對其他引擎支持較弱Hudi適合多引擎環境;Delta Lake適合Spark主導的生態系統

Hudi在實時更新和低延遲查詢方面具有優勢,而Delta Lake在批處理性能和Spark生態集成方面表現更好。例如,在處理每小時TB級數據的增量管道時,Hudi可以提供端到端30分鐘的延遲,而Delta Lake可能需要更長時間。

5.2 Hudi vs Iceberg
特性HudiIceberg適用場景
存儲類型支持COW和MOR僅支持COWHudi適合實時更新;Iceberg適合大規模元數據管理
文件管理LSM樹時間線,動態壓縮日志文件清單文件(Manifest)管理,無內置壓縮機制Hudi優化存儲效率;Iceberg提供文件級元數據統計
版本控制時間軸記錄所有操作,支持按時間戳回滾快照(Snapshot)基于清單文件生成,支持時間旅行Hudi提供更細粒度的版本控制;Iceberg適合EB級數據的元數據管理
并發控制COW表使用OCC,MOR表使用NBCC基于OCC,依賴外部工具實現沖突檢測Hudi的MOR表支持更高的寫入吞吐量;Iceberg在元數據管理上更高效
生態集成原生支持Flink,與Spark、Hive等兼容兼容多引擎(Spark、Flink、Trino),但需額外適配Hudi適合實時流處理;Iceberg適合多引擎聯邦查詢

Hudi在實時更新和增量消費方面表現更佳,而Iceberg在元數據管理和大規模數據集查詢方面更具優勢。例如,在處理高吞吐量的實時數據流時,Hudi的MOR表能夠提供更好的性能,而Iceberg更適合需要復雜查詢優化的場景。

??選型建議??:

  • 需要最強UPSERT性能 → ??Hudi??

  • 已深度使用Spark且需求簡單 → ??Delta Lake??

  • 追求最大兼容性和標準性 → ??Iceberg?

六、Hudi的使用方法與最佳實踐

6.1 環境準備

要使用Hudi,需要確保以下環境已就緒:

  • 存儲系統:HDFS、S3或其他Hadoop兼容文件系統。
  • 計算引擎:Spark 2.4.4+版本(Hudi主要依賴Spark的計算能力)。
  • 查詢引擎:Hive、Presto、Hudi Native等。

在Spark中配置Hudi的依賴和參數:

// 添加Hudi依賴
val hudiSpark = spark.config("spark.sql.catalog.spark_catalog","org.apache.spark.sql.hudi catalog.HoodieCatalog"
).config("spark.serializer","org.apache.spark.serializer.KryoSerializer"
).config("spark.sql extensions","org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
)
6.2 創建Hudi表

Hudi表的創建與普通Spark表類似,但需要指定存儲類型和主鍵:

// 創建COW表
spark.sql("""CREATE TABLE cow_table (id INT, name STRING, price DOUBLE)USINGHUDITBLPROPERTIES (hoodie table type='cow',hoodiehoodie key='id',hoodiehoodie index type='bloom')"""
)// 創建MOR表
spark.sql("""CREATE TABLE mor_table (id INT, name STRING, price DOUBLE)USINGHUDITBLPROPERTIES (hoodie table type='mor',hoodiehoodie key='id',hoodiehoodie index type='bloom',hoodiehoodie compaction strategy='inplace')"""
)
6.3 寫入數據

Hudi支持多種寫入方式,包括插入、更新、刪除和合并:

// 插入數據
val df = spark.createDataFrame(data, schema)
df.write.format("HUDI").option("hoodie.insert.update.key", "id").save("basepath/cow_table")// 更新數據
df.write.format("HUDI").option("hoodie.insert.update.key", "id").option("hoodie操作類型", "upsert").save("basepath/mor_table")// 刪除數據
df.write.format("HUDI").option("hoodie.insert.update.key", "id").option("hoodie操作類型", "delete").save("basepath/cow_table")
6.4 查詢數據

Hudi支持三種視圖,根據查詢需求選擇合適的視圖:

// 查詢快照視圖(最新狀態)
val snapDF = spark.read.format("HUDI").load("basepath/cow_table")// 查詢讀優化視圖(優化查詢性能)
val roDF = spark.read.format("HUDI").option("hoodie.read.optimize", "true").load("basepath/mor_table")// 查詢增量視圖(獲取指定時間點后的增量數據)
val incDF = spark.read.format("HUDI").option("hoodie.read增量", "true").option("hoodie開始時間", "20250815000000").load("basepath/cow_table")
6.5 表服務與優化

Hudi提供了多種表服務操作,用于優化表性能:

// 壓縮操作(合并日志文件到基線文件)
spark.sql("CALLHUDI.執行壓縮('basepath/mor_table')")// 清理操作(刪除舊版本文件)
spark.sql("CALLHUDI.執行清理('basepath/cow_table')")// 保存點操作(標記某些文件組為已保存,防止被清理)
spark.sql("CALLHUDI.創建保存點('basepath/cow_table', '20250815000000')")
6.6 實時流處理集成

Hudi與Flink集成,支持實時流處理:

Map<String, String> options = new HashMap<>();
options.put("connector", "hudi");
options.put("path", "hdfs://path/to/table");
options.put("table.type", "MERGE_ON_READ");DataStream<RowData> source = HoodiePipeline.builder("my_table").column("id STRING").column("name STRING").pk("id").options(options).source(env);HoodiePipeline.builder("my_table").options(options).sink(source, false);
6.7 讀取優化查詢

僅適用于 Merge-On-Read 表

// 讀優化查詢
val readOptimizedDF = spark.read.format("org.apache.hudi").option(DataSourceReadOptions.QUERY_TYPE_OPT_KEY, DataSourceReadOptions.QUERY_TYPE_READ_OPTIMIZED_OPT_VAL).load("/user/hudi/" + tableName + "/*")readOptimizedDF.show()
6.8?數據刪除
import org.apache.hudi.QuickstartUtils._
import scala.collection.JavaConverters._// 定義要刪除的記錄主鍵
val deleteIds = Seq(3).toList.asJava// 執行刪除操作
spark.write.format("org.apache.hudi").option(DataSourceWriteOptions.TABLE_TYPE_OPT_KEY, DataSourceWriteOptions.COW_TABLE_TYPE_OPT_VAL).option(HoodieWriteConfig.TABLE_NAME, tableName).option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY, primaryKey).option(DataSourceWriteOptions.PARTITIONPATH_FIELD_OPT_KEY, partitionColumn).option(DataSourceWriteOptions.OPERATION_OPT_KEY, DataSourceWriteOptions.DELETE_OPERATION_OPT_VAL).mode(SaveMode.Append).save("/user/hudi/" + tableName)

七、未來展望:Hudi的發展路線

  1. ??Z-Order優化??:更高效的多維數據布局

  2. ??更強大的流式能力??:降低端到端延遲

  3. ??跨云統一??:優化不同存儲后端的性能

  4. ??AI集成??:直接支持機器學習工作流

結語:為什么開發者應該選擇Hudi?

在數據架構從傳統數據倉庫向Lakehouse演進的今天,Apache Hudi提供了??唯一兼具數據庫靈活性和數據湖擴展性??的解決方案。其??增量處理能力??特別適合現代實時分析需求,而??ACID保證??則解決了數據一致性的老大難問題。

"掌握Hudi,意味著你能夠在云原生時代構建真正彈性的數據基礎設施"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93517.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析和鯨社區熱門項目:電商雙 11 美妝數據分析的細節與價值

在數據驅動決策的時代&#xff0c;電商大促期間的行業數據分析總能為從業者和學習者提供寶貴參考。今天&#xff0c;我們來詳細拆解和鯨社區&#xff08;heywhale&#xff09;上一個備受關注的實戰項目 ——《電商雙 11 美妝數據分析》&#xff0c;看看它能給我們帶來哪些啟發。…

uniapp 開發微信小程序,獲取經緯度并且轉化詳細地址(單獨封裝版本)

目錄1、單獨抽離封裝2、使用示例3、前置條件和配置4、效果彈框1、單獨抽離封裝 // 騰訊地圖SDK引入&#xff08;需提前下載qqmap-wx-jssdk.min.js文件&#xff09; // 注意&#xff1a;使用前需在微信公眾平臺配置request合法域名https://apis.map.qq.com var QQMapWX requir…

深入理解 Python 元類中的 __prepare__ 方法:掌控類屬性定義順序的藝術

關鍵詞&#xff1a;元類、type、prepare、OrderedDict、屬性順序、數據建模在 Python 的高級編程中&#xff0c;元類&#xff08;metaclass&#xff09; 是一種強大而神秘的機制。它允許我們在類創建之前進行干預&#xff0c;從而實現諸如自動屬性驗證、字段序列化、ORM 映射等…

MATLAB基礎訓練實驗

MATLAB基礎訓練實驗 1. 標題 MATLAB 基礎訓練 2. 內容概括 本實驗旨在通過MATLAB基礎操作訓練,掌握數組創建與運算、矩陣操作、M文件編寫、流程控制、二維/三維繪圖等核心技能。實驗內容包括復數運算、矩陣變換、函數繪圖、結構體創建、電路方程求解、電流波形繪制、三維曲…

implement libwhich for Windows

因為windows沒有類似unix的which命令 現在實現盡量跨平臺&#xff0c;且stb 風格的libwhich // which.h #ifndef LIBWHICH_H #define LIBWHICH_H#ifdef __cplusplus extern "C" { #endif/** 查找可執行文件在系統中的路徑* 參數:* filename - 要查找的可執行文件名…

記與客戶端的一次“無謂之爭”

一、沖突今天&#xff0c;流程收尾時&#xff0c;客戶端為了統計時延&#xff0c;連發兩個接口&#xff1a;一個報開始時間&#xff0c;一個報結束時間。我因性能考慮&#xff0c;說&#xff1a;“明明一個接口能搞定&#xff01;”客戶端負責人說&#xff1a;“發送兩次更合理…

Java Condition 對象 wait 方法使用與修復方案

在 Java 中&#xff0c;java.util.concurrent.locks.Condition 接口提供了類似監視器的方法&#xff08;await(), signal(), signalAll()&#xff09;來實現線程間的協調。正確使用 Condition 對象需要遵循特定模式以避免常見問題。常見問題及修復方案1. 虛假喚醒問題問題&…

??金倉數據庫KingbaseES V9R1C10安裝教程 - Windows版詳細指南?

文章目錄一、前言二、軟件下載2.1 下載安裝包2.2 下載授權文件三. 安裝KingbaseES數據庫3.1 解壓安裝包3.2 運行安裝程序3.3 安裝步驟詳解步驟1&#xff1a;歡迎界面步驟2&#xff1a;許可協議步驟3&#xff1a;添加授權文件步驟4&#xff1a;選擇安裝路徑步驟5&#xff1a;選擇…

論文推薦|遷移學習+多模態特征融合

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;在Cvpr、NeurIPS、AAAI等頂會中&#xff0c;遷移學習多模態特征融合正以“降成本、提性能、省標注”的絕對優勢成為最熱賽道。面對超大模型全量微調天價算力、異構模態對齊…

接口芯片斷電高阻態特性研究與應用分析

摘要&#xff1a; 本文以國科安芯推出的ASM1042 系列通訊接口芯片為例&#xff0c;深入探討接口芯片斷電高阻態特性&#xff0c;涵蓋其定義、原理、應用及設計注意事項。通過對相關技術資料的梳理與分析&#xff0c;結合具體芯片實例&#xff0c;闡述高阻態在電路穩定性、設備兼…

數據結構初階(17)排序算法——非比較排序(計數排序·動圖演示)、排序算法總結

2.0 十大排序算法2.5 非比較排序 之前學習的排序算法都是比較排序——借助比較大小&#xff0c;來實現排序。非比較就是不借助比較大小&#xff0c;來實現排序。——小眾的、局限的非比較排序大致有這些&#xff1a;計數排序、桶排序、基數排序。桶排序、基數排序在實踐中意義不…

VisualStudio2022調試Unity C#代碼步驟

一.VS安裝Unity開發組件按下圖所示安裝Unity開發組件二.附加Unity調試程序2.1 先將Unity進入Play模式2.2 VS選擇附加Unity調試程序菜單2.3 選擇附加的實例三.加入斷點測試Update方法中成功進入斷點

Zabbix【部署 01】Zabbix企業級分布式監控系統部署配置使用實例(在線安裝及問題處理)程序安裝+數據庫初始+前端配置+服務啟動+Web登錄

Zabbix使用 1.下載 2.安裝 2.1 程序安裝 2.2 數據庫初始化 2.3 前端配置 2.4 服務啟動 3.Web登錄 4.總結 安裝說明: 本次安裝為在線安裝,使用數據庫為PostgreSQL。 1.下載 由于是在線安裝,這次不涉及離線安裝包的下載,僅做參考用,點擊跳轉【下載頁面】,下載說明: 版本…

爬機 驗證服務器是否拒絕請求

當訪問XX網站時返回 418 狀態碼時&#xff0c;說明服務器識別到了爬蟲行為并拒絕了請求。這是網站的反爬機制在起作用&#xff0c;我們可以通過模擬瀏覽器行為來繞過基礎反爬。import requestsurl https://cn.bing.com/# 模擬瀏覽器的完整請求頭&#xff0c;包含更多瀏覽器標識…

GaussDB 數據庫架構師修煉(十三)安全管理(3)-數據庫審計

1 數據庫審計作用數據庫審計機制主要通過對SQL操作或其他操作記錄審計日志的方式 &#xff0c;增強數據庫系統對非法操作的追溯及舉證能力 。高斯數據庫提供兩種審計特性 &#xff1a;傳統審計 &#xff0c;統一審計。2 傳統審計傳統審計通過GUC參數配置需要對數據庫的哪些操作…

C語言(11)—— 數組(超絕詳細總結)

Hi&#xff01;冒險者&#x1f60e;&#xff0c;歡迎闖入 C 語言的奇幻異世界&#x1f30c;&#xff01; 我是 ankleless&#x1f9d1;?&#x1f4bb;&#xff0c;和你一樣的闖蕩者&#xff5e; 這是我的冒險筆記打怪升級之路——C語言之路&#x1f4d6;&#xff0c;里面有踩過…

【AI生成+補充】高頻 hql的面試問題 以及 具體sql

以下是高頻HQL面試題及對應SQL示例&#xff0c;涵蓋核心語法、優化技巧和典型場景&#xff0c;可直接用于面試準備&#xff1a; 一、基礎操作與DDL 1. 創建分區表 & 動態插入分區 sql -- 創建外部分區表&#xff08;按日期分區&#xff09; CREATE EXTERNAL TABLE logs…

開源 Arkts 鴻蒙應用 開發(十七)通訊--http多文件下載

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Cloudflare Tunnel 使用SAAS回源加速配置教程

在使用 Cloudflare Tunnel 時,通過“主域名+加速域名”的聯動配置,既能隱藏內網 IP,又能優化訪問速度。本文以實際部署場景為例(主域名 zhuyuming.dpdns.org、加速域名 jiasu.dpdns.org),帶你一步步完成內網服務穿透(以 192.168.1.6:5555 網頁服務為例),實操性強,可直…

C++實戰

Ref deepwiki vuecruddllamma.cpp 目標 計劃實現一個C項目&#xff0c;前端用vue&#xff0c;后端用C和llama.cpp。實現可以進行邏輯功能和AI推理。