免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

本地搭建Iceberg數(shù)據(jù)湖:Spark+Nessie+Minio實踐指南

本地搭建Iceberg數(shù)據(jù)湖:Spark+Nessie+Minio實踐指南 1. 項目整體設(shè)計與技術(shù)選型拆解先聊一個很現(xiàn)實的問題每次想驗證新想法、跑通一條新鏈路最煩的是什么是裝環(huán)境。尤其是涉及數(shù)據(jù)湖、數(shù)據(jù)倉庫這一套東西動不動就是三臺起跳的集群加上各種權(quán)限、網(wǎng)絡(luò)、配置環(huán)境沒搭完熱情已經(jīng)涼了一半。這個項目的目標(biāo)很明確在一臺筆記本電腦上用純開源組件把 Apache Iceberg 跑起來并且不是只跑個 demo而是把數(shù)據(jù)湖里最值得玩的幾個能力——快照隔離、時間旅行、表級演進、目錄級分支合并——全部親手操作一遍。整套組合是 Spark 做計算引擎、Nessie 做元數(shù)據(jù)目錄、Minio 做對象存儲底座。一句話概括這張架構(gòu)圖里的分工Minio 負(fù)責(zé)存文件Iceberg 負(fù)責(zé)把一堆文件“偽裝”成一張張有事務(wù)語義的表Nessie 負(fù)責(zé)管住這些表的歷史版本和分支Spark 則是對外提供 SQL 和計算能力的窗口。這四個東西缺一個都跑不出完整的“數(shù)據(jù)湖倉”體驗。先說為什么選這套組合而不是直接用 Hive Metastore HDFS或者 Hudi、Delta Lake 湊一桌。過去很多人在筆記本上玩 Iceberg用的是 Hive MetastoreHMS加 Hadoop 本地文件系統(tǒng)或者干脆把元數(shù)據(jù)打進 SQLite 里。HMS 的問題是它只是一個“元數(shù)據(jù)倉庫”沒有版本控制的概念。你想看表的上一版 schema 是什么樣想回到昨天那個時間點的數(shù)據(jù)快照得靠 Iceberg 自己維護的 snapshots 元數(shù)據(jù)去手動翻操作起來非常繞。而 Nessie 相當(dāng)于給表目錄加了一套 Git 式的版本管理分支、標(biāo)簽、提交、合并這些操作在 SQL 里直接就能做體驗和開發(fā)代碼完全一致這對理解 Iceberg 的快照機制幫助特別大。另外用 Minio 而不是 HDFS是因為 Minio 是 S3 協(xié)議兼容的對象存儲跑在本地占用的資源極小而且 Iceberg 對 S3 兼容存儲的支持最成熟。HDFS 在單機模式下會有大量 DataNode、NameNode 進程需要維護吃內(nèi)存不說還會把真正要驗證的業(yè)務(wù)邏輯淹沒在集群運維里。Minio 則輕量得多一個服務(wù)端進程加一個客戶端命令就能完成建桶、配密鑰、傳文件的操作。從成本上看這套組合還有一個隱性優(yōu)點整個鏈條上的組件全部開源沒有商業(yè)授權(quán)問題。你用 Docker 或者直接下載二進制包都可以搭建對硬件要求不高8GB 內(nèi)存的電腦就能跑得動。我自己的測試環(huán)境是 16GB 內(nèi)存的 MacBookSpark 跑起來之后總占用大概在 5GB 左右完全在可接受范圍內(nèi)。還有一點值得一提這套架構(gòu)是生產(chǎn)環(huán)境里大量真實使用的“迷你版”。很多公司所謂的“數(shù)據(jù)湖平臺”底層就是 S3 Iceberg Spark/Trino元數(shù)據(jù)服務(wù)則用 HMS 或者 Nessie。所以你在筆記本上練熟悉的東西到了生產(chǎn)環(huán)境只需要替換掉 Minio 為云上的對象存儲、把 Nessie 部署成高可用模式其他部分幾乎可以平移復(fù)用。這個遷移平滑度是那些只模擬了表面 API 的玩具項目給不了的。1.1 核心需求解析我們到底要驗證什么這個項目要回答的問題是Iceberg 在對象存儲之上到底是怎么做到 ACID 語義的Nessie 的分支機制是怎么和 Iceberg 的快照機制咬合在一起的如果你只是跑一遍CREATE TABLE然后INSERT那跟用普通關(guān)系型數(shù)據(jù)庫沒區(qū)別完全沒有體現(xiàn)數(shù)據(jù)湖的價值。所以我設(shè)計這個實驗的時候特意加入了三類核心驗證場景第一類是“寫多讀少的一致性”。同一張表先寫一批數(shù)據(jù)生成快照 A再用 Spark 任務(wù)寫第二批數(shù)據(jù)同時使用另一個 SparkSession 去查詢表數(shù)據(jù)。普通的文件表在快照切換過程中很可能出現(xiàn)讀到一半新數(shù)據(jù)、一半舊數(shù)據(jù)的情況。Iceberg 則通過元數(shù)據(jù)文件中的 manifest 列表實現(xiàn)快照隔離查詢會鎖定一個固定的快照版本讀寫互不干擾。第二類是“時間旅行”。Iceberg 每次寫入都會生成新的快照并記錄時間戳。我們可以在 SQL 里直接指定VERSION AS OF或者TIMESTAMP AS OF來查詢歷史某個時刻的數(shù)據(jù)。這是 Iceberg 區(qū)別于 Hive 表的核心賣點之一也是數(shù)據(jù)湖里做數(shù)據(jù)回滾、審計溯源的基礎(chǔ)。第三類是“目錄級分支合并”。這是 Nessie 帶來的獨特能力。在 Nessie 里默認(rèn)有一個main分支。我們可以創(chuàng)建一個dev分支在分支上做數(shù)據(jù)寫入然后驗證這些變更在main分支上看不到只有執(zhí)行 merge 操作之后才會合并過去。這個能力放到真實業(yè)務(wù)里對應(yīng)的就是“多個團隊各自開發(fā)數(shù)據(jù)模型互不干擾最終統(tǒng)一發(fā)布”的協(xié)作流程。1.2 方案對比為什么不選 Hudi 和 Delta Lake這里多說幾句方案選型的背景因為很多人在學(xué)習(xí)階段很容易被 Hudi、Delta Lake 和 Iceberg 三個項目搞暈。三者的目標(biāo)其實高度重合都在試圖給數(shù)據(jù)湖加上事務(wù)、時間旅行、schema 演進這些能力只不過實現(xiàn)路徑和側(cè)重點有所不同。Hudi 的思路偏向“增量數(shù)據(jù)處理”它把數(shù)據(jù)文件分為幾種類型通過索引來加速 upsert 和增量讀取在車聯(lián)網(wǎng)、IOT 這類“持續(xù)不斷有新數(shù)據(jù)進來需要小批量近實時更新”的場景里表現(xiàn)不錯。代價是對用戶的知識要求更高需要理解表服務(wù)、索引、Clustering 等一堆概念。Delta Lake 則是 Databricks 推的實現(xiàn)上和 Iceberg 有相似之處也用了元數(shù)據(jù)日志的機制。它和 Spark 深度綁定開箱即用體驗非常好但有個歷史問題是想脫離 Spark 生態(tài)用其他引擎訪問 Delta Lake早期版本比較麻煩雖然現(xiàn)在也有獨立 Reader/Writer但生態(tài)開放性仍然不如 Iceberg。Iceberg 的特點是“不做增量更新只做全量快照”的抽象非常優(yōu)雅。它對文件組織、元數(shù)據(jù)管理做了清晰的解耦因此 Flink、Spark、Trino、Presto、StarRocks 等大量引擎都能通過一套統(tǒng)一的接口訪問同一張表非常適合作為湖倉架構(gòu)中的“公共底層”。它的數(shù)據(jù)文件按 Parquet/ORC 等列式格式存儲manifest 文件記錄文件的位置和統(tǒng)計信息快照機制天然支持時間旅行。整個體系像一張精密的拼圖理解它的設(shè)計之后再去看其他兩個項目會容易很多。從學(xué)習(xí)角度講Iceberg 的文檔和社區(qū)資料是三家里最完整的而且它在云廠商生態(tài)里的支持度極高。選它作為第一個深入了解的表格式學(xué)習(xí)曲線最平滑性價比最高。2. 本地環(huán)境搭建這一節(jié)直接說干貨。整個環(huán)境的搭建步驟我會按順序?qū)懩阏罩镁托?。我會穿插一些變量選擇的原因方便大家理解每一步在干什么。2.1 依賴規(guī)劃與版本組合先說版本組合這是最容易踩坑的地方。Iceberg 和 Nessie 的版本更新都比較頻繁不同版本之間的兼容性表可以在各自的官方文檔里查到但我這里直接給你一套實測可用且穩(wěn)定的組合組件推薦版本建議說明JavaJDK 11不要用 JDK 17部分 Spark 插件和 Nessie 的兼容性會出問題Apache Spark3.5.x3.5 是目前最穩(wěn)定的主線版本Iceberg 與 Nessie 插件支持完善Apache Iceberg1.5.x該版本對 S3 和 Nessie 的集成做了大量優(yōu)化Nessie0.91 或 0.97需要與 Iceberg 1.5 兼容不要輕易嘗試太新的 1.x 版本MinioRELEASE.2024-xx下載最新穩(wěn)定版即可注意不要用 RC 版本這個版本組合并不是我憑空拍腦袋定的而是經(jīng)過實際測試。最開始我試過 Spark 3.5.1 Iceberg 1.4.3 Nessie 0.79.0理論上是兼容的但spark.sql.extensions配置加載時經(jīng)常報類找不到排查半天發(fā)現(xiàn)是 Nessie 的擴展包和 Spark 3.5 的 SQL 解析器之間有個微妙的版本不匹配問題。換到 1.5.x 之后整個過程順暢了很多。下載地址方面Spark 去官網(wǎng)找spark-3.5.x-bin-hadoop3.tgz帶 Hadoop 客戶端的版本Iceberg 和 Nessie 的依賴不需要單獨下載安裝后通過 Maven 坐標(biāo)拉取Minio 服務(wù)端和客戶端 mc 都去官方倉庫下載即可。2.2 啟動 Minio給數(shù)據(jù)安一個“總倉庫”Minio 的啟動非常簡單。假設(shè)你下載好的二進制放在~/minio/bin目錄下執(zhí)行export MINIO_ROOT_USERminioadmin export MINIO_ROOT_PASSWORDminioadmin123 mkdir -p ~/minio/data ~/minio/bin/minio server ~/minio/data --console-address :9001這里 9000 是 API 端口Spark 通過這個端口訪問數(shù)據(jù)9001 是控制臺端口瀏覽器訪問http://localhost:9001可以登錄管理。啟動后打開瀏覽器登錄創(chuàng)建一個名為warehouse的存儲桶。創(chuàng)建桶的時候有個細(xì)節(jié)Region 要設(shè)置成一個可用值時比如us-east-1。這句話有什么意義因為 Spark 訪問 S3 時默認(rèn)會用us-east-1作為默認(rèn) region如果桶的 region 為空有的 S3 SDK 會報IllegalArgumentException: bucket does not exist這類誤導(dǎo)性錯誤。實際上根本原因不是桶不存在而是 region 元數(shù)據(jù)對不上。然后我們需要創(chuàng)建一對 Access Key 和 Secret Key??刂婆_右邊菜單欄有 “Access Keys” 選項點進去創(chuàng)建即可。記下這兩個值作為后續(xù) Spark 連接 Minio 的憑證。為什么要強調(diào) Minio 這一步因為整個鏈路中Minio 承擔(dān)的是“最終數(shù)據(jù)落盤”的角色如果在程序里寫入 Iceberg 表時Minio 的 bucket 權(quán)限、region、network 可達性任何一個環(huán)節(jié)出問題表象都是很奇怪的Cannot create path或者Access Denied錯誤排查起來非常耗時。所以建桶、配密鑰、測試上傳下載這三步一定要做扎實不要跳過。2.3 啟動 Nessie給元數(shù)據(jù)加一個 Git 倉庫Nessie 的啟動方式有好幾種最省事的是用 Dockerdocker run -p 19120:19120 \ -e NESSIE_VERSION_STORE_TYPEIN_MEMORY \ projectnessie/nessie:0.91.0如果你本地沒有 Docker也可以去 Nessie 的 GitHub Releases 下載可執(zhí)行 jar然后跑java -jar nessie-quarkus-0.91.0-runner.jar效果一樣。默認(rèn)監(jiān)聽 19120 端口啟動日志里顯示/quarkus即表示成功。這里IN_MEMORY表示 Nessie 的元數(shù)據(jù)暫時存放在內(nèi)存里重啟后會丟失。如果要持久化可以把存存儲改為 PostgreSQL 或者 RocksDB但學(xué)習(xí)階段內(nèi)存版完全夠用不需要額外引入運維復(fù)雜度。怎么確認(rèn) Nessie 已經(jīng)就緒直接訪問curl http://localhost:19120/api/v1/config返回一段 JSON 就說明服務(wù)正常。Nessie 內(nèi)部默認(rèn)會有個main分支后續(xù)所有表默認(rèn)都在這條分支上。2.4 Spark 與插件配置接下來是整條鏈路的核心把 Spark 接進 Iceberg Nessie。這里我沒有使用spark-sql的默認(rèn)配置而是通過命令行參數(shù)傳入 catalog 地址這樣可以更清晰地看到每一層依賴。在啟動spark-sql前需要先準(zhǔn)備一個依賴 jar 包列表。你可以在 Maven 倉庫手動下載也可以用spark-submit --packages的方式動態(tài)拉取。我更推薦后者省去手動管理 jar 的麻煩spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.5.0,org.projectnessie:nessie-spark-extensions-3.5_2.12:0.91.0,org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262 \ --conf spark.sql.extensionsorg.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.projectnessie.spark.extensions.NessieSparkSessionExtensions \ --conf spark.sql.catalog.nessieorg.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.nessie.catalog-implorg.apache.iceberg.nessie.NessieCatalog \ --conf spark.sql.catalog.nessie.urihttp://localhost:19120/api/v1 \ --conf spark.sql.catalog.nessie.refmain \ --conf spark.sql.catalog.nessie.io-implorg.apache.iceberg.aws.s3.S3FileIO \ --conf spark.sql.catalog.nessie.warehouses3a://warehouse/ \ --conf spark.sql.catalog.nessie.s3.endpointhttp://localhost:9000 \ --conf spark.sql.catalog.nessie.s3.path-style-accesstrue \ --conf spark.sql.catalog.nessie.s3.access-keyminioadmin \ --conf spark.sql.catalog.nessie.s3.secret-keyminioadmin123這一串參數(shù)看著長拆開看其實就那么幾組。第一組是spark.sql.catalog.nessie.catalog-impl和spark.sql.extensions。前者告訴 Spark “這個叫 nessie 的 catalog 要用 Iceberg 的 Nessie 實現(xiàn)”后者把 Iceberg 和 Nessie 各自的 SQL 擴展點掛到 Spark 的解析器上。沒有這兩個配置Spark 根本不知道CREATE TABLE ... USING iceberg是什么方言。第二組是 URI 和 ref。uri指 Nessie 服務(wù)地址ref表示當(dāng)前分支默認(rèn)指向main。這塊是理解“Nessie 管理 IIS 表”的關(guān)鍵在 Iceberg 原本的體系里表元數(shù)據(jù)文件的路徑通常由 HMS 或者文件系統(tǒng)路徑管理而在 Nessie 集成下表的指針關(guān)系被 Nessie 接管了。第三組是warehouse和 S3 的 endpoint 等參數(shù)。warehouses3a://warehouse/告訴 Iceberg 所有數(shù)據(jù)文件、元數(shù)據(jù)文件都放在 Minio 的warehouse桶下。s3.endpoint和path-style-accesstrue用來指定 Minio 的訪問地址。path-style-access這個參數(shù)值得多說一句S3 默認(rèn)是虛擬主機風(fēng)格bucket.endpointMinio 這種本地服務(wù)通常只支持 path 風(fēng)格endpoint/bucket如果不開啟這個參數(shù)會報Unable to find a region via the region provider chain或者403錯誤。全部配置完之后啟動 Spark SQL 的交互式終端輸入一行測試SHOW DATABASES;如果能看到default數(shù)據(jù)庫說明 catalog 已經(jīng)成功掛載Nessie 和 Minio 的連通性沒問題。到這里整個環(huán)境搭建工作就算完成了可以開始真正的“玩轉(zhuǎn) Iceberg”。3. 核心實操從建表到時間旅行再到分支合并環(huán)境就緒后接下來是重頭戲。我會把同一套數(shù)據(jù)操作拆成幾個階段每個階段對應(yīng) Iceberg 表格格式的不同核心能力。3.1 建庫建表與批量寫入先創(chuàng)建一個獨立的數(shù)據(jù)庫然后在里面建一張用戶行為表。這一步可以看到 Iceberg 對 schema 的靈活支持以及數(shù)據(jù)文件怎么被組織到對象存儲上。CREATE DATABASE IF NOT EXISTS nessie_test; USE nessie_test; CREATE TABLE IF NOT EXISTS user_events ( event_id BIGINT, user_id BIGINT, event_type STRING, event_time TIMESTAMP, event_data MAPSTRING, STRING ) USING iceberg;執(zhí)行完CREATE TABLE之后可以去 Minio 控制臺查看warehouse桶。你會發(fā)現(xiàn)里面并不會立刻出現(xiàn)什么文件因為 Iceberg 是延遲構(gòu)建的建表動作執(zhí)行的其實是向 Nessie 提交了一個元數(shù)據(jù)注冊請求真正的數(shù)據(jù)文件要等到第一次寫入才會落盤。接下來寫入一批測試數(shù)據(jù)。為了演示時間旅行效果我們分兩批寫入INSERT INTO user_events VALUES (1, 1001, click, TIMESTAMP 2025-01-01 10:00:00, map(page, home)), (2, 1002, view, TIMESTAMP 2025-01-01 10:05:00, map(page, product)), (3, 1003, purchase, TIMESTAMP 2025-01-01 10:10:00, map(page, cart));稍等片刻再執(zhí)行第二批INSERT INTO user_events VALUES (4, 1004, click, TIMESTAMP 2025-01-01 11:00:00, map(page, search)), (5, 1005, view, TIMESTAMP 2025-01-01 11:05:00, map(page, product));兩次插入都會觸發(fā) Iceberg 生成新的數(shù)據(jù)文件和新的 metadata JSON 文件。每次寫入都被稱為一次 commit而每次 commit 都會在表的歷史中留下一個快照。3.2 快照查詢與時間旅行查詢當(dāng)前表數(shù)據(jù)很簡單SELECT * FROM user_events ORDER BY event_id;這時候應(yīng)該能查到 5 條記錄。但關(guān)鍵是Iceberg 能回答一個傳統(tǒng)文件表回答不了的問題“如果我想看只有第一次插入時的數(shù)據(jù)樣子怎么做”在 Iceberg 中每次 commit 都會產(chǎn)生一個快照 ID可以用以下命令查看歷史SELECT snapshot_id, committed_at, operation FROM nessie_test.user_events.snapshots;你會看到兩次 INSERT 分別對應(yīng)兩個快照并且第二行快照的父快照指向第一行。這就是 Iceberg 版本鏈的原始形態(tài)。要實現(xiàn)“回到第一版數(shù)據(jù)”可以執(zhí)行SELECT * FROM user_events VERSION AS OF 7312398974561967012;其中7312398974561967012替換成第一次快照的 ID。如果不想用快照 ID也可以按照時間戳回溯SELECT * FROM user_events TIMESTAMP AS OF 2025-01-01 10:15:00;這里的時間只要落在第一次 commit 和第二次 commit 之間就能查到 3 條記錄。本質(zhì)上Iceberg 的元數(shù)據(jù)層給每個快照記錄了完整的文件列表和刪除列表查詢引擎只需要依據(jù)快照對應(yīng)的 manifest 文件讀數(shù)據(jù)不需要做任何 “讀取時過濾” 的動作因此時間旅行的性能很高。這一步解決的是什么問題典型的場景是數(shù)據(jù)管道跑錯了或者有業(yè)務(wù)方把壞數(shù)據(jù)寫進了表里。過去如果底層是普通 Parquet 文件 Hive 表只能通過備份恢復(fù)耗時幾個鐘頭。用 Iceberg你可以直接SELECT歷史快照確認(rèn)壞數(shù)據(jù)的影響范圍然后執(zhí)行CALL nessie_test.system.rollback_to_snapshot(user_events, snapshot_id)把表狀態(tài)重置到正常時間點。整個過程秒級完成。3.3 分區(qū)演進與隱藏分區(qū)再來看一個 Iceberg 很有特色的功能隱藏分區(qū)Hidden Partitioning。在傳統(tǒng) Hive 表里分區(qū)是“物理目錄 用戶手動維護”的概念。你建表時如果不指定分區(qū)后面想再加分區(qū)就只能重建表。Iceberg 不同它的分區(qū)信息屬于表元數(shù)據(jù)并且支持持久化分區(qū)變換。比如我給user_events加一個按天分區(qū)ALTER TABLE user_events ADD PARTITION FIELD day(event_time);執(zhí)行后后續(xù)寫入的批次會自動按天生成分區(qū)目錄。注意day()是一個分區(qū)變換函數(shù)它會自動從event_time中提取日期字段進行分區(qū)通過隱藏分區(qū)我們不需要在建表時手動多寫一個dt字段也不需要查詢時手動加上dt 2025-01-01條件。Iceberg 會自動進行分區(qū)裁剪優(yōu)化。實際測試中如果我執(zhí)行SELECT * FROM user_events WHERE event_time TIMESTAMP 2025-01-01 00:00:00 AND event_time TIMESTAMP 2025-01-02 00:00:00;Spark 會通過元數(shù)據(jù)中的分區(qū)統(tǒng)計信息自動跳過無關(guān)的分區(qū)而不需要我在 SQL 里顯式指定任何分區(qū)列。這在 Hive 表時代是不可想象的沒有用戶顯式加分區(qū)條件引擎只能做全表掃描。需要說明的是第一次批量插入的數(shù)據(jù)在分區(qū)別建立之前已經(jīng)存在了所以在 Add Partition Field 之前的歷史文件不會被自動移動到新的分區(qū)目錄下但 Iceberg 元數(shù)據(jù)仍然記錄了它們的分區(qū)值元數(shù)據(jù)查詢依然正確。這個特性處理得極其優(yōu)雅也給“已有表的遷移擴展”提供了巨大的自由度。3.4 Nessie 分支合并演練最后是本項目最亮眼的部分用 Nessie 在 SQL 里模擬 Git 操作。新開一個 Spark SQL 會話在默認(rèn)的main分支下我們可以用 Nessie 擴展的 SQL 語法創(chuàng)建一個分支。注意這個分支是一個“目錄層分支”它并不是復(fù)制數(shù)據(jù)文件而是復(fù)制了一份表的元數(shù)據(jù)指針。CREATE BRANCH dev IN nessie;這會在 Nessie 服務(wù)器上創(chuàng)建一個名為dev的分支初始狀態(tài)指向main分支當(dāng)前提交點。接下來切換到該分支USE nessie.dev;注意這里的用法USE nessie.dev表示切換使用nessie這個 catalog 的dev分支。切換之后你在dev分支上執(zhí)行的所有操作都是基于當(dāng)前分支的獨立元數(shù)據(jù)視圖。我們在這個分支上創(chuàng)建表并寫入數(shù)據(jù)USE nessie_test; CREATE TABLE dev_user_events AS SELECT * FROM user_events WHERE event_type purchase; SELECT * FROM dev_user_events;此時在dev分支的表dev_user_events可以正常查詢到結(jié)果。但如果你切回main分支USE nessie.main; USE nessie_test; SHOW TABLES;你會發(fā)現(xiàn)main分支上根本看不到dev_user_events這張表。這就是目錄級分支的核心能力之一分支隔離了“元數(shù)據(jù)可見性”。有人可能會問表數(shù)據(jù)文件存在 Minio 里分支操作具體改變的是什么簡單理解Iceberg 每次 commit 會生成一份新的元數(shù)據(jù) JSON 文件Nessie 數(shù)據(jù)集里會記錄這個 JSON 文件的位置和內(nèi)容索引。Nessie 的分支本質(zhì)上是記錄了表錄與元數(shù)據(jù) JSON 文件之間對應(yīng)關(guān)系的一組 commit。分支之間的寫操作互不干擾因為實際上它們指向的是不同的元數(shù)據(jù) JSON 版本底層的數(shù)據(jù)文件則是共享的。如果 merge 分支執(zhí)行USE nessie.dev; MERGE BRANCH dev INTO main;然后切回main分支再查USE nessie.main; USE nessie_test; SHOW TABLES;你會看到dev_user_events已經(jīng)出現(xiàn)在main分支上了。這個操作在 Nessie 里叫做 “Commit” “Merge”結(jié)合 Iceberg 的快照隔離機制可以在毫秒級別完成。注意這個 “毫秒級” 是針對元數(shù)據(jù)層面的合并如果dev分支對某張表的數(shù)據(jù)做了修改而main分支也做了不同修改合并時可能會有沖突需要先解決沖突再合并。這一套機制的價值在于它徹底改變了數(shù)據(jù)湖的多人協(xié)作模型。以前多個人同時改一張表只能靠 “誰最后寫誰贏” 的粗暴策略?,F(xiàn)在每個人在獨立的分支上開發(fā)驗證完畢后一鍵合并相當(dāng)于給數(shù)據(jù)開發(fā)裝上了代碼管理工具從 “只能向前跑” 變成了 “隨時能回退、能并行開發(fā)”。3.5 更新刪除與表結(jié)構(gòu)調(diào)整時間旅行和分支是 Iceberg 最出名的兩個特性但日常使用最多的是更新、刪除和 schema 演進。這些操作在 Iceberg 里的行為也和 Hive 表完全不同。Spark 對 Iceberg 的標(biāo)準(zhǔn) SQL 支持里UPDATE和DELETE直接可用。舉個例子我要把某個用戶的行為類型改成buyUPDATE user_events SET event_type buy WHERE user_id 1001;或者刪除某條事件DELETE FROM user_events WHERE event_id 2;你可能會覺得這跟普通數(shù)據(jù)庫沒什么區(qū)別。區(qū)別在于底層實現(xiàn)Iceberg 不會真的去改老數(shù)據(jù)文件而是使用 “position delete” 機制記錄被刪除行的位置更新操作則對應(yīng)為新數(shù)據(jù)文件加 position delete 文件。這套設(shè)計保證了寫入文件一旦生成就不可變從而讓并發(fā)寫入、增量讀取、時間旅行都成為可能。在 schema 演進方面加一列可以這樣ALTER TABLE user_events ADD COLUMN device_type STRING;更狠的是在傳統(tǒng) Hive 里加字段基本等于做一次表重建而 Iceberg 只需要更新元數(shù)據(jù)文件不需要重寫任何歷史數(shù)據(jù)文件。已有的行在查詢新字段時會自動返回NULL新寫入的行則正常填充字段值。自己動手跑一遍這個實踐會發(fā)現(xiàn) Iceberg 把很多本來要 DBA 介入的操作變成了普通的 SQL DDL開發(fā)自由度提升了一大截。4. 常見問題與排查技巧實錄任何環(huán)境搭建類的項目總會遇到幾個讓人血壓升高的報錯。我把自己在這次實操中踩過的坑、觀察到的原因、最終解決的方式列成表格大家遇到類似問題可以直接對照。4.1 高頻錯誤速查表現(xiàn)象根因解決辦法IllegalArgumentException: bucket does not existMinio 桶的 region 與 Spark S3 客戶端不匹配建桶時顯式指定 region如us-east-1并確認(rèn)s3.path-style-accesstrueNoSuchMethodError: org.apache.hadoop.fs.s3a.S3AFileSystemHadoop 版本與 Spark 自帶 Hadoop 版本沖突添加hadoop-aws依賴時選擇與 Spark 內(nèi)置 Hadoop 3.3.4 兼容的版本SQL 中CREATE BRANCH語法報錯沒有加載 Nessie Spark 擴展包檢查--packages是否包含nessie-spark-extensions-3.5_2.12時間旅行查詢結(jié)果為空時間戳選取錯誤嚴(yán)格按照快照的committed_at時間區(qū)間來查詢不要跨越兩個快照的邊界查詢 Iceberg 表時無法識別USING iceberg缺少iceberg-spark-runtime包確認(rèn)--packages中指定了與 Spark 版本匹配的 Iceberg 運行包Merge 分支時提示沖突兩邊分支對相同的表做了不兼容的修改在 Nessie 中使用分支合并日志分析沖突點解決后重新提交這里展開說幾個。關(guān)于bucket does not exist那個問題。我最早跑通整個環(huán)境時第一次創(chuàng)建表是成功的但是第二次插入后查詢直接報錯。排查了很久才發(fā)現(xiàn)是因為我手動創(chuàng)建 Minio bucket 時 region 留空了而 Spark 默認(rèn)從配置文件里給的us-east-1去連接兩邊對不上。S3 協(xié)議的客戶端在獲取 bucket 時會先發(fā)送一個GetBucketLocation請求如果 bucket 上沒有顯式 region有的 Minio 版本會返回null或空字符串客戶端就會直接判定 “bucket 不存在”。解決方案也很直接在 Minio 控制臺新建桶的時候把 region 寫清楚如果桶已經(jīng)建了可以刪掉重建反正倉庫里還沒數(shù)據(jù)。關(guān)于 Spark 版本和 nessie 擴展的兼容性。這里有個很容易踩的深層坑nessie-spark-extensions插件不同版本只支持特定的 Spark 主/次版本。如果你用的是 Spark 3.5就一定要選后綴為_2.12的 Spark 3.5 系列版本。如果裝錯版本最典型的報錯是org.apache.spark.sql.catalyst.parser.ParseException因為 Spark SQL 的解析器接口變了插件里的擴展點和新接口對不上。這個問題的排查技巧是看.scalaVersion和 Spark 版本的后綴對應(yīng)關(guān)系不要只看組件版本號大小。關(guān)于時間旅行查詢結(jié)果為空。這個坑很隱蔽。Iceberg 的快照時間戳記錄的并不是INSERT語句執(zhí)行的瞬間而是提交事務(wù)真正落庫的時間。如果我的測試腳本是在一個會話里快速連續(xù)執(zhí)行兩次INSERT那么兩個快照的committed_at時間差可能只有幾百毫秒。你如果隨手寫一個TIMESTAMP AS OF 2025-01-01 10:01:00恰好落在兩次 commit 之間反而查不到數(shù)據(jù)。要避免這個坑可以在執(zhí)行兩次插入之間手動sleep幾秒或者直接用snapshot_id進行精確回溯。4.2 Nessie 分支可視化的隱藏操作Nessie 自己帶了一個簡易的 Web UI在 Docker 啟動日志里會提示地址一般是http://localhost:19120/ui/里面可以看分支、提交、標(biāo)簽的樹狀圖。不過實際用起來會發(fā)現(xiàn)界面比較樸素分支多了以后信息密度不夠高。更推薦的方式是使用 Nessie CLI 工具可以在命令行里直接用 git 風(fēng)格的命令操作nessie --endpoint http://localhost:19120/api/v1 branch nessie --endpoint http://localhost:19120/api/v1 log這在調(diào)試分支合并問題時特別好用因為可以看到 Nessie 側(cè)的 commit 歷史和元數(shù)據(jù)指針的變化。Spark SQL 里能做的操作CLI 基本都能做而且能看到更底層的 commit hash。4.3 資源控制與性能調(diào)優(yōu)心得在筆記本上跑 Spark Iceberg Nessie Minio最大的問題不是功能跑不起來而是資源控制不好卡到懷疑人生。我實際測試下來默認(rèn)的 Spark 配置會嘗試用很多內(nèi)存??梢詤⒖枷旅孢@些參數(shù)來限制 Spark 本地的資源占用--conf spark.driver.memory2g \ --conf spark.executor.memory2g \ --conf spark.sql.shuffle.partitions4 \ --conf spark.default.parallelism4 \ --conf spark.sql.iceberg.delete-enabledtrue把spark.sql.shuffle.partitions設(shè)成 4 是因為本地數(shù)據(jù)量很小如果保持默認(rèn)的 200 個分區(qū)每次 shuffle 都會生成大量小文件既拖慢速度又增加元數(shù)據(jù)負(fù)擔(dān)。順帶一提spark.sql.iceberg.delete-enabledtrue要打開不然 Iceberg 的DELETE語句可能走老式邏輯無法利用 position delete 的高效機制。Minio 方面如果系統(tǒng)內(nèi)存吃緊可以限制 Minio 的緩存export MINIO_CACHE_SIZE128MiB如果只是學(xué)習(xí)驗證完全可以把回收站、巡檢告警等一系列企業(yè)級功能全部關(guān)掉。單機部署不需要這些功能開得太貪心。4.4 超小數(shù)據(jù)量下的隱性坑分區(qū)文件數(shù)量對學(xué)習(xí)環(huán)境來說數(shù)據(jù)量小是常態(tài)。但數(shù)據(jù)量小反而會觸發(fā)一些“生產(chǎn)環(huán)境很少遇到”的怪問題。比如如果按day(event_time)建了分區(qū)但所有測試數(shù)據(jù)同一天寫入那么這一天的分區(qū)下可能只有一個 Parquet 文件。這時候跑UPDATE或DELETE操作Iceberg 會生成 position delete 文件底層其實是一個新文件加一個“刪除標(biāo)記”文件兩個文件共同描述了當(dāng)前表的最新狀態(tài)。如果你用了一些只讀取數(shù)據(jù)文件的工具比如直接跑 Spark 讀 Parquet會看到數(shù)據(jù)明明被 update 了但還是有兩個文件。這種“需要在元數(shù)據(jù)層面理解表狀態(tài)”的情形在數(shù)據(jù)量小的環(huán)境里尤其容易被誤判為“丟數(shù)據(jù)”或“文件異?!?。解決方法很簡單理解 Iceberg 表的多層文件結(jié)構(gòu)數(shù)據(jù)文件、manifest 文件、manifest list、metadata JSON不要直接用普通文件系統(tǒng)工具去驗證數(shù)據(jù)完整性盡量用 Spark SQL 或 Iceberg 的 API 來查詢。另外一個容易忽略的點是小數(shù)據(jù)量會產(chǎn)生大量空目錄或者 tiny 文件這主要影響的是“未來數(shù)據(jù)文件掃描的性能”對學(xué)習(xí)功能沒有影響可以先不管。等以后數(shù)據(jù)量大了再研究 Iceberg 的 Compaction / RewriteDataFiles 回城策略。4.5 給自己加一個“一鍵重置”腳本最后分享一個非常實用的小技巧。因為整個環(huán)境是純本地運行Nessie 如果用的內(nèi)存存儲重啟一次所有分支和表定義就全部清空了Minio 桶里的數(shù)據(jù)文件還在但元數(shù)據(jù)指針沒有了會導(dǎo)致“孤兒數(shù)據(jù)文件”出現(xiàn)。為了快速回到干凈狀態(tài)我習(xí)慣寫一個簡單的重置腳本#!/bin/bash # 重置整個數(shù)據(jù)湖環(huán)境的腳本 pkill -f nessie-quarkus || true pkill -f minio || true rm -rf ~/minio/data/* docker restart nessie 2/dev/null || docker start nessie 2/dev/null || \ docker run -d --name nessie -p 19120:19120 -e NESSIE_VERSION_STORE_TYPEIN_MEMORY projectnessie/nessie:0.91.0 sleep 5 # 重建 Minio 桶 export MC_HOST_localhttp://minioadmin:minioadmin123localhost:9000 mc mb local/warehouse --region us-east-1 echo Environment reset done.這里需要用到 Minio 的 mc 客戶端安裝后配置 alias 指向本地實例。重置之后環(huán)境就回到了 “零數(shù)據(jù) 有 Nessie 有空桶” 的初始態(tài)可以重復(fù)跑實驗。5. 關(guān)于這個項目的幾個深層思考聊完了具體操作說點技術(shù)之上的東西。這個項目表面上是在做“本地環(huán)境搭建”實質(zhì)上它把現(xiàn)代數(shù)據(jù)湖的核心概念以最小可運行的方式完整地串了起來而且每個環(huán)節(jié)都能動手驗證不是停留在 PPT 上。第一個啟發(fā)是元數(shù)據(jù)和數(shù)據(jù)分離的思想在 Iceberg 體系里體現(xiàn)得非常淋漓盡致。Minio 上躺著所有數(shù)據(jù)文件Iceberg 的元數(shù)據(jù)里維護文件和表的映射關(guān)系Nessie 又給這個映射關(guān)系套上版本管理的殼子。這種架構(gòu)聽起來復(fù)雜實際用起來卻很優(yōu)雅數(shù)據(jù)文件只寫一次所有引擎讀到的內(nèi)容由元數(shù)據(jù)控決定。這就好比圖書館的書架和檢索目錄分離書擺了哪里不重要關(guān)鍵是目錄卡片上寫了哪本書對應(yīng)于哪個書架。第二個啟發(fā)是“時間旅行”和“分支合并”一起用威力遠大于單用。光有 Iceberg你能回溯歷史但是不同人改表之后的協(xié)同依然困難光有 Nessie如果底層存儲沒有不可變文件支持分支合并也無法實現(xiàn)真正意義上的 “表級數(shù)據(jù)版本管理”。兩個組件配合才能對上生產(chǎn)系統(tǒng)里復(fù)雜的協(xié)作需求。第三個啟發(fā)是這套體系在實際生產(chǎn)中的落地成本和收益是極度不成正比的。本地驗證階段我們?yōu)榱耸∈掠脙?nèi)存版 Nessie、單機 Minio但生產(chǎn)環(huán)境的模型完全一樣。一旦理解了這套組件的協(xié)作流程無論將來公司用的是火山引擎的湖倉產(chǎn)品還是自建的 S3 Iceberg Trino遷移和排錯成本都會低很多。順手提一下擴展方向。等這張表建起來并跑完時間旅行、分支合并你可以考慮給環(huán)境加上 Flink 的流式寫入驗證 Iceberg 對upsert的支持也可以換個引擎用 Trino 連接同一張 Nessie Iceberg 表看跨引擎讀數(shù)據(jù)是否仍然一致或者把 Nessie 的存儲換成 PostgreSQL模擬真正的多租戶身份認(rèn)證場景。每一步擴展都會把這張數(shù)據(jù)湖的認(rèn)知版圖再補齊一塊。我從搭建這套環(huán)境到完整跑通前后花了大概兩個周末。第一個周末浪費在版本兼容和 S3 配置上第二個周末探究清楚分支合并和時間旅行的底層原理之后一切就順暢多了?,F(xiàn)在這臺筆記本上的四個組件已經(jīng)成為我快速驗證數(shù)據(jù)湖相關(guān)想法的基礎(chǔ)設(shè)施。如果你也打算上手 Iceberg希望這篇記錄能幫你省下第一周踩坑的時間直接進入真正有價值的功能探索環(huán)節(jié)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月激情六月欧亚激情综合导航 | 婷婷丁香十月| 五月婷婷六月丁香| 99啪视频在线观看| 激情人妻蜜夜系列区| 日本熟女内射| 日本天天综合| 99免费成人网| 五月丁香激情四射| 色婷婷激情五月天| 97操碰日本女人| 中文字幕成人| 2017狠狠干| 三十路磁力链接| 99热九九在线| www网站在线观看| 色色色色欧洲| 一起草无码| 亚洲亚洲人成综合网络| 婷婷久久网| 色亭亭五月天丁香综合AV - 百度 - 百度| 日夜夜天天| 超碰91av| 亚洲第一黄网| 日韩啪啪网| 一二区成人电影| 99精品视频免费观看近期发布| 一级二级色大片| 色天天久婷婷| 六月丁香五月激情网| 色婷婷久久综合| 高清av在线国产| 成人国产欧美大片一区| 色色网站毛片| 曰日爽日日操| 狠狠色噜噜狠狠| 六月色日韩| 日韩ac不卡无码| 狠狠色综合网站久久久久| 99re在线播放| 91打屁股免费看| 99成人在线观看| 亚洲天堂啪啪| 色五月亚洲| 97碰| 亚洲色99| 99无码视频| 人人人人人人人人人草| 久久99最新| 天天人人综合| 五月天影院婷婷在线观看| 激情欧美婷婷| 六月婷婷狠狠| 五月叮香啪| www.99热. com这里只有精品| 开心五月婷婷激情网| 第四色色六月色综合| 亭亭五月丁香综合欧美| 五月婷婷色男女| 五月婷婷激情综合在线| 六月丁香五月激情网| 五月天婷婷无码| 国产精产国品一二三在观看| 婷久久久| 9 1超碰九色| WWW.久久久久久久| 丁香婷婷五月天网站| Av大香蕉| 欧美色小说婷婷| 极品人妻videosss人妻| 亚洲天堂色色| 狠狠操综合| 色婷婷99| 九九热99在线视频| 99久久精| 欧美色图天堂网色| 蜘蛛女免费观看完整版高清电影| 成人综合伍月天| 五月婷婷丁香俺日污视频| 综合一本道| 色爱99| 欧美色色色色色色色色色色| 色婷婷成人做爰A片免费看网站 | EEUSS鲁片一区二区三区| 91九色中文字幕女在线观看| 另类少妇人与禽zOZZ0性伦| 少妇性按摩无码中文A片| 乱乱av| 丁香六月婷婷久久亚洲天堂| 激情五月天婷婷直播| 激情婷婷亚洲五月| 婷婷久久99| 久久99久久99久久99人受| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产.亚洲.欧洲视频在线| 九九综合九九| 99爱视频在线观看这里只有精品| 五月激情啪啪| 色私五月婷婷| www.深爱激情| 亚洲中文字幕在线观看| 91婷婷在线| 欧美性丁香色色五月天综合爱爱| 五月丁香久| 色五月婷婷色| 伊人超碰| 99综合网| 色婷婷av综合网| 91人人操人人爱| 66久久视频在线| 久久九九免费视频| 久99婷婷色综合| 涩涩婷婷五月| 99热中文字幕久久| 日韩黄色中文字幕| 久月丁香爱婷婷综合| 深爱激情六月天| 婷香五月激情视频| 婷婷97碰碰| 婷婷五月天干干| 五月天色不卡| 五月丁香激情四射综合| 99热这里只有精| 午夜天堂一区人妻| 久热这里只有精品在线观看 | 99er国产| 激情六月婷婷| 狠狠综合| www.操.com| 99热丁香五月| 99热| av在线激情| 狠色狠色综合久久| 亚洲综合色婷| 亚洲久久婷婷丁香五月天| 久久婷婷成人综合色怡春院| 婷婷黄色| 99热最新| 99久久99视频只有精品| 久久99精品视频| 色欲影香| 婷婷四色五月| 丁香五月婷婷久久综合激情网| 色小说五月天| 九九九九九九毛片| 久99久精品视频| 五月婷婷色色网址| 人人摸人人澡人人| 久久久www| 黄色一级影片| 色欲久久综合| 日本人妻A片成人免费看片| 99热综合色图| 婷婷丁香人妻天天爽| 玖玖99免费视频| 激情五月婷婷丁香| 六月婷久久| 色五月婷婷综合在线| 天堂网亚洲色图| 79色色免费| AA片在线观看视频在线播放| www.夜夜.com| 成人在线综合| 丁香五月天社区| 热99国产精品| 97在线观视频免费观看| 人人舔人人| 偷偷操九九| 天天干天天操天天拍| 国产亚洲成AV人片在线| 久久多色| 日本噜噜色网| 在线观看亚洲AV| 婷婷丁香五月91| av狠狠操| 久久五月天大美女| 操日本99| 91久久久久久久久18| 九九碰九九爱97超| 欧美 色婷婷| 99色看| 亚洲123区高清入口| 99re最新地址| 国产99热| 婷婷五月精品| 五月天婷婷激情小说| 欧美性猛交AAAA片黑人 | 丁香伊人综合| 操逼毛片国语对白| 久久婷婷五月综合网| 国产日韩欧美| 五月婷婷五月丁香综合| 婷婷中文网站| 99在线免费视频| 五月中旬婷婷丁香六| 婷婷激情四射五月天| 人人97碰| 亚洲无码九九| 丁香5月激情网| 伊人婷婷大香蕉在线| 婷婷在线激情| 激情影院免费视频婷婷五月天 | 色婷婷情片| 亚洲操逼网| 婷婷区日本| 丁香五月www| 一级黄色影片| 久久久久亚洲AV无码网影音先锋| 国产69久久久欧美黑人A片| 激情深爱综合网| 在线视频你懂得| 成人免费黄色短视频| 欧美这里只有精品| 五月丁香花激情综合网| 开心久久爱五月天| 五月婷婷AV| www日本熟妇99在线视频| 大香蕉久| 五月综合激情| 开心网五月色婷婷| 深爱五月日韩| 99热精品一区| 啪啪干伊人婷婷| 99碰视频| 久久99日本精品视频免费观看| 99色天堂| 久久久噜噜噜久久人妻| 久久婷.com| 天天色天天爱天天爽| 99ri精品| 五月天丁香网站| 丁香深五月婷婷| 婷婷六月激情| 狠狠五月天| 99热在线观看| 狠狠操狠狠插| 五月婷婷亚洲色视频| 热久久66| 五月丁香在线国产 | 99成人无码| 亚洲精品乱码久久久久久综合| 五月天婷婷社区久久综合| 五月丁香六月激情| 99久操视频| 久9热| 婷婷丁香97| 日本熟女二区| 丁香六月天| 79精品视频在线观看,| 色大综合| 色欲天天综合| 九九爱激情| 婷婷狠狠五月综合| 日本不卡五月婷婷丁香| av中文网站| 伊人色欲五月天| 欧美性丁香色色五月天综合爱爱| 色天天久婷婷| 夜丁香五月婷婷| 激情狠狠丁香月| 激情五月综合六月丁香婷婷狠狠干| 另类在线| 狠狠狠激情网| 免费观看欧美成人AA片爱我多深 | 最新va在线播放| 婷婷五月丁香伊人| 婷婷六月色开 | 六月丁香视频网站| 婷婷五月综合激情小说| 99热精品在线播放| 婷婷色九月| 91婷色| 97综合在线| 色色综合网站| 91在线操逼视频| 播丁香五月婷婷欧美| 最新无毒无码AV| 九月丁香很很色| 婷婷伊人綜合中文| 成人网站在线观看视频| 婷婷六月综合在线| 天天日天天爽夜夜爽| 这里只有精彩视频| 99免费在线视频| 亚洲色五月| 影音先锋91在线资源站| 五月婷婷九九久久| 天天日日人| 热久免费视频9| 91婷婷丁香五月天免费视频网站| 色情·com| 五五月五月| 99re视频精品| 99热手机在线精品| 久久久久久久久久久久久久久久久精典| 丁香五月天亚洲综合| 婷婷色基地在线看| 日本人妻丁香婷婷久久寝取熟女五月| 这里精品| 裸体做A爰片毛片A片免费| 人人摸人人干| 无码四色色色| 青草五月天| 婷婷精品视频| 五月婷婷黄色毛片| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 99热视| 国产精品热搜丁香五月婷婷| 亚洲操B| 激情性爱五月天网页| 亚洲蜜乳AV| 亚洲精品乱码久久久久久按摩观| 亚洲另类噜噜| 激情婷婷五月天| 大鸡巴伊人网| 国产欧美婷婷五月| 日本综合色图| 天天综合色丁香| 五月激情丁香久久综合网| 天天日天天日天天搞| 五月婷婷亚洲| 99啪视频在线观看| 五月婷婷激清网| 伊人久久婷| 五月丁香六月激情| 色婷婷丁香五月天在线视频| 这里有精品99| 99久久网站| 熟妇天天综合| 激情五月com| 97操操操| 亚洲色夜| 天天色噜| 97伊人综合婷婷| 激情黄色五月天| 天天射综合网站| 六月婷欧美丁香综合| 激情五月婷婷综合| 天天操夜夜操| 碰碰碰97国产| 久久视频这里都是精品| 久99| 婷婷五月激情热播| 超碰亚洲天堂| 日韩精品超碰在线观看| 99色在线| 99在线视频女女视频| 九九草热在线观看| 99精品偷自拍| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 久久R激情| 婷婷色基地在线看 | 97影院一级片| 色情五月综合婷婷| 91avse| 91久久九九| 狠狠干五月丁香| 综合久久99| 亚洲色图81p| 夜夜撸天天日| 色五月色综合| 99精品在线下载| 中国丰满熟女A片免费观| 成人在线网| 日日噜噜夜夜狠狠久久丁香五月| 婷婷六月丁综合| 五月开行婷婷色五月| 色爆五月| 一级二级香港秋霞欧美欧美秋霞| 色色五月婷婷狠狠| 色亚洲婷婷| 国产国产乱老熟女视频网站97| 久久婷婷影院| 99热66| 另类小说五月天| 九九99久久| 男女99免费视频| 五月婷婷黄色| 都市激情久久| 九九爱激情| 五月开心婷婷| 强奸幻女毛片| 欧美影院| 色色99色色| 国自产拍偷拍精品啪啪一区二区| 激情五月天免费视频| 色欲AVV| 五月丁香黄色| 影音先锋91资源站| 色色婷婷丁香| 99热这里只有精品亚洲| 中文超碰视在线| 欧美一级操逼视频| 五月丁香成人| 人人操AV| 天天干com| 色色色区| 99热伊人| 成人丁香婷婷| 久婷婷| 亚洲精品久久久无码| 97色伦另类图片小说视频 | 伊人热婷婷| 婷婷丁香五月激情| 久99| 狠狠色婷婷综合开心影视| 六月丁香VA| 涩综合网| 五月综合激情久久| 久久精典| 日本九九热| 伊人久久中文网| www.色99| www.夜夜.com| 久久停停超碰| 丰满老熟妇BBBBB搡BBB| 黄色成人网站在线播放| 国产欧美日韩一区二区三区| 97伊人综合婷婷| 久热九九| 91人碰| caobi四区| Www.久久| 激情六月天| 2025天天日爽| 四色 爱 婷婷 精品 亚洲 五月天| 久久久全国免费视频| 国产精品色婷婷久久久精品| 婷婷丁香五月天小说| 黑人熟妇一区二区三区| 国产国产乱老熟女视频网站97| 色狠狠色噜噜AV天堂五区消防| 丁香六月婷婷综情欧美| 丁香五月婷婷天堂大香蕉| 国产精品色色| 六月久久婷婷| 色婷婷激情| 五月婷色丁香| 日日日,com| 97香蕉人人在线观看| 熟女人妻视频| 亚洲天堂99| 丁香五月婷婷香| 伊人成人宗合网| 亚洲高清在线| 综合久久久| 淫视馆av三区| 99超超碰| 河北真实伦对白精彩脏话| 4399亚洲视频| 天天做天天爱天天高潮| 五月丁香婷婷激情视频| 久久这里有| 亚洲激情 久久| 色情丁香五月婷婷精品| 久久视频婷婷| 99热1| 夜夜骑夜夜操| 综合五月激情| 五月丁香婷婷潮喷中文字幕| 婷婷五月久久| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 亚洲色在线观看| 国产成人av在线播放| 天天日天天干天天爽| 九九视频精品在线免费| 天天婷婷天天| 开心五月婷婷在线视频免费观看| 婷婷五月免费观看| 99爱最新免费视频在线观看| www.婷婷五月天啪啪| 安息电影在线观看完整版| 久久刺激网| 韩国19 主播内部福利vip免费播放| 天天插操| 久久综合网桃花| 丁香五月婷婷亚洲天堂| 久艹伊| 婷五月天| 亚洲旡码| 欧美极品999| 99精品在线播放| 另类激情五月| 亚洲天堂亚洲色色色| 欧韩性爱| 97干婷婷五月天| 99热精品少| 人人人人人人人人人草| 玖久精品视频9| 日韩AV色色色| 久久精品夜色噜噜亚洲a∨| 全高清无码视頻| 91操熟女| 婷婷色播六月无码| 这里只有精品在线视频在线观看| 99热资源在线| 五月天婷婷成人网| 欧美A片在线视频免费观看| 色 噜噜 九月 婷婷| 視频福利乱色| 欧美日韩成人在线| 五月丁香做爱视频| Av九九| 丁香成人五月天| 六月丁香啪啪| 激情久久 婷婷| 狠狠色婷婷777| 婷婷色色狠狠| 丁香六月婷婷激情| 九九热视频在线观看| 丰满少妇猛烈A片免费看观看| 偷拍丁香九月激情| 丁香花婷婷五月天| 丁香婷最新动态| 婷婷五月天熟妇| 天天做夜夜爽| 国产亚洲精品AAAAAAA片| 狠狠爱五月婷婷综合六月| www91久久| 99热免费精品热久久66| 婷婷五月天六月丁香| 色综合色五月| 天天综合区| 五月天婷婷影院| 天天艹天天色| 99色综合网| 色噜噜狠狠色综无码久久合欧美| 综合网啪啪| 五月色 亚洲| 激情婷婷六月天| 婷婷五月天成人网| 九九九九综合| 久热这里只有精品99re| www.久久| 99re热精品在线视频| 色五月婷婷天天操夜夜操| www.97碰碰com| 99精品偷自拍| 2025中文在线视频字幕免费观看| 色婷久| 老妇六区| 婷婷区日本| 日韩在线视频中文字幕| 色婷婷av综合网| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 91欧美| 久久香蕉福利| 婷婷深爱五月| 五月天丁香啪啪网| 三区激情四射av| 99视频在线| 久久一操| 色五月丁香伊人| http:色情日本com| 激情综合4月| 天天操夜夜操| 播丁香五月婷婷欧美| 亚洲性受XXXX五月丁香| 五月色丁香| 国产a视频| 99r这里| 色五月情| 好好日激情五月天| 久草天堂| 五月天婷婷色色| www.yw色| 99久re热| 色色色999| 五月久久婷婷天堂视频| 婷婷五月激情中文字幕| 欧美人人女女精品综合五月天| 99视频这里只有久久精品 | 99色在线观看视频| 丁香五月婷婷啪啪视频| 婷婷综合五月色播| 月丁香久久久| 婷婷午夜天| 久久国产成人9999久久久久| 天天天日天天天干| 97婷婷久久丁香| 99日韩网站| 色色色五月天婷婷| 日日爱激情| 久草婷妨| 亚洲最大视频| 久草A片| 武则天精品久久| w婷婷五月婷婷w| 日韩精品一品二区三区的使用体验| 五月天婷婷AV| 色婷五月| 色婷婷五月基地在线| 极品人妻VIDEOSSS人妻| 色色网站免费观看| 97操碰日本女人| www.色婷婷.com| 色五月婷婷AV| 碰碰91| WWW,五月天| 久久综合久色欧美综合狠狠| 九九综合久久| 精品久热69| 亚洲色婷婷五月天| 99热99这里有免费的精品| 九九婷婷激情综合网| 天天日天天爽夜夜爽| 丁香婷婷综合激情五月色| 五月丁香久久久久| 亚洲色精彩| 欧美成人AAA片一区国产精品| 热99re| 色爱综合五月| 日韩操人| 久久久久久久久人妻| 香蕉网久久| 色色五月天激情| 久久66精品| 欧美日韩国产一区二区| 嫩BBB槡BBBB搡BBBB| 天天色综合网1| 午夜丁香综合婷婷| 精品亚洲国产成人A片在线鸭王| 婷婷开心激情综合五月天| 色婷九九九| 伊人五月综合网| 丁香五月婷婷激情中文| 九九aV| 亚洲电影在线观看| 日本一级| 九九久久视频| 狠狠综合| 99精品国产在热久久婷婷| 丁香五月av| 色色色色av色色色色| 永久思思热在线| 丁香五月色激情| 淫视馆aV二区一区| 色屌丝中文字幕| 色五月丁香五月五月婷婷| 九九99偷拍视频| 尔尔AV一区| 色五月婷婷激情| 噜综合| www.婷婷,com| 久久五月婷综合| 激情五月天色色| 婷婷五月天com| 亚洲九区| 婷婷五月中文字幕| 九九九九操逼| 九月婷婷久久| 99福利导航| 色五月天天在线观看资源站| 人人操AV| 在线成人视频免费| 久久9热综合| 久久久com| 久久精品这里只有精品免费首页| 伊人丁香花综合影院| 思思久久99热| 久久综合五月天| 国产在线视频1234| 中文AV在线观看| 免费观看欧美成人AA片爱我多深| 婷婷五月天色综合翘| 久99久在线| 日本一级一片免费视频| 99小视频在线观看| 婷婷五月另类网站| 97色碰碰公开视频| 91丨九色丨首页| 男女啪啪做爰高潮无遮挡| 久久久免费精彩视频| 五月婷婷成人| 亚洲欧洲午夜成人精品av| 五月婷婷开心网| 婷婷五月天日本无码| 婷婷色播六月无码| 精品少妇蜜臀91| 五月色 亚洲| 激情五月深爱五月| 亚洲 在线 性爱 | 99ri国产在线| 五月婷婷色色色| 91婷婷搞| 婷婷99狠狠| 一本色道久久综合狠狠躁小说| 欧美影院婷婷| 色吧五月| 色色三级视频| 免费91久久精品| 色婷婷另类| 热久久婷婷| 熟女少妇内射日韩亚洲| 久久久久9久无码视频| 久久九九激情五月天| 99热热热99精品婷婷| 国产精品成人AV在线观看春天| 国产乱人偷精品人妻A片| www五月婷婷| 色婷婷亚洲综合网站| 1024AV视频| www,com,五月色色| 婷婷五月色| 色五月婷婷天天干| 成年人看Va免费视频| 婷婷丁香18| 男人天堂99| wwwss在线观看| 日产精品一线二线三线芒果| 婷婷五月天最新网址| 久9无码视频| 性韩日色婷婷五月天激情啪啪XXX| 激情五月婷婷免费视频| 思思国产99| 六月丁香婷婷综合狠狠爱夜夜爱| 大香蕉久久婷婷| 婷婷伊人| 色吊丝av中文字幕| 那里有AV网址| AAA亚洲AV| 婷婷六月综合基地| 欧美成人AAA片一区国产精品| 丁香五月综合网| 91亚洲免费片| 丁香婷婷免费| 亚洲狠狠干| 99热主页日本| 五月丁香 狠狠爱| www.婷婷五月天| 丁香五月综合久久八| 五月丁香六月婷婷操操操| 91九色在线| 综合一区二区三区| 亚洲综合在线网站| 久久久妻人人人| 激情五月婷婷欧美极品| 色五月大| 日本猛少妇色XXXXX猛叫| 秋霞九九无码| 婷婷丁香色五月亚洲| 天天热夜夜操| 狠狠操狠狠| 婷婷五月欧美| yazhou seshipin| 99精品小视频| 人妻久久久久久| 六月丁香婷婷色狠狠久久| 色噜噜,噜噜色| 日本爆乳片手机在线播放| 疯狂做受XXXX高潮A片| 五月丁香免费视频| 99热有精品在线观看| 另类色视频| 日本婷色| 激情五月丁香五月色| 婷婷五月天黄色| 99在线亚洲| 丁香五月综合| 久久精品婷婷| av人人干| ...婷婷五月综合不卡,国产在线手机| 六月激情婷婷综合| 91操碰| 岛国资源站| 天天操夜夜玩!| 思思热在线精品视频| av操一操| 五月开心深爱激情网| 婷婷五月天桃花网| 激情精品久久| 丁香色婷婷| 天天日夜夜欢| 91超碰在线观看| 色欲色香综合网| 激情五月黄色| 色婷婷五月基地在线| 99精品视频网| 大香蕉综合在线| 九九干视频| WWW色色色COM| 日韩色色视频www| 无码AV免费精品一区二区三区 | 五月天婷婷久久视频| 久99热在线观看| 久久婷婷六月综合综合色| 日韩乱轮AV| 久久996re热这里只有精品无码| 婷婷香五月天| 九九精品在线视频观看| 免费精品99| 九九综合视频在线观看| 殴美日比视频| 91seav| 婷婷涩五月| 91超碰在线播放| 欧美在线操| 色综合网址| 午夜一区| 先锋男人99资源| 丁香狠狠色婷婷久久无码视频| 九九热手机在线视频| 婷婷的五月天另类视频| 日日夜夜综合| 任你搞在线观看视频| 可以直接看的AV| 婷婷自拍| 色婷婷日本| 婷婷她六月天| 亚洲精品久久久久久久久久吃药| 婷婷五月天婷婷| 91九色PORNY肉丝在线| 五月激情婷婷女| 日韩另类在线观看| 99自拍视频在线观看| 开心丁五月| 97亚洲视频在线| 深爱五月婷| 久热伊人9| 琪琪理论片| 丰满少妇猛烈A片免费看观看| 婷婷丁香五月天在线| 天堂在线婷婷| 综合网天天| 狠狠999| 伦乱人妻| 色色综合网站| 99色热视频| 婷婷新网址| 午夜成人天堂久久无码日韩久久| 天天搽天天射| 人妻五月天激情开心网| 婷婷导航| 久久黄色片| 91一起艹| 日韩AV在线免费| 色婷婷操逼| 久草xx性爱视频| 六月丁香中文字幕| 丁香婷婷老熟女综合网| 98永久精品| 婷婷五月天在线观看av| 国产肏屄大片| 五月丁香激情综合| 色五月婷婷91| 六月五月久久丁香| 五月久久网| 色婷婷成人做爰A片免费看网站| 色五月激情婷婷| 九月丁香| 丁香六月婷婷久久亚洲天堂| 99成人| 丁香五月色五月婷婷宗合| 婷婷色五月天色| 日本啪啪视频HD| 久久激情天堂| 五月天婷婷永久免费视频| 九色PORNY自拍成人精彩视频| 五月天激情国产综合婷婷婷| 秋霞A V毛片| 婷婷激情六月天视频| 亚洲综合在线伊人婷| 色婷婷aV四虎| 性一交一乱一交A片久| 91九色丨国产丨爆乳| 丁香五月五婷| 婷婷玉月丁香五月在线视频| 另类图片色五月| 九九av在线| 啪啪日本欧美| 欧美久久婷婷| 伊人久久五月天综合| 日韩三级片一区二区| 久久精品综合色| 丁香婷婷浪潮AV久久综合| 噼里啪啦完整版中文在线观看| 激情五月丁香社区| 丁香五月香蕉| 天天综合网亚洲综合网| 天天日日人| 亚洲综合婷婷五月| 日韩情色在线观看| 激情五月天婷婷播播久久综合91| 激情综合网五月天| z色五月播播久久| 欧美xx激情视频在线观看| 婷婷六月丁香色| 亚洲成人免费电影| 91碰超| www.com.色色| 综合久久综合五月天婷婷| AV片一区在线观看| 日韩无码AV电影网站| 天天插天天干| 九九热精品视频在线观看| 五月色网| 99激情在线| 色你久久| 99ri精品在线| 五月丁香影视| 思思久久精品| 色色综合激情| 综合网啪| 九九色播五月丁香| 狠狠操天天干| 能看的av| 狠狠爱五月婷婷| 丁香五月婷婷五月天| 五月天激情国产综合婷婷| 国精产品一区二区三区| 伊人久久五月天综合| 婷婷五月天香蕉| 无码色色| 5月丁香婷婷激情网| 情久久综合五月天| 国产密乳av一区二区三区四区| 99久久6| 色婷婷亚洲婷婷| 色婷另类| 久久五月婷| 久久婷婷亚洲| 2018国产大陆天天弄| 丁香六月婷婷久久综合| 麻豆WWWCOM内射软件| 亚洲黄网AV| 综合五月丁香97| 超碰在线9| 亚洲色婷婷色| 婷婷五月天手机版视频| 综合五月天天天天天五月| 五月丁香六月婷婷玖玖| 日日艹思思热| 日韩性视频| 超碰人妻在线| 婷婷97C| 久久99激情| 99热这里有精品6| 爱婷婷五月| 99色网站| 婷婷伊人五月天| 四虎国产精品永久在线国在线| 春色激情| 影音先锋 萱萱| 久热黄色| 五月人人丁香婷婷五月人人丁香| 婷婷综合五月色播| 色色色综合| 色噜噜狠狠色综合日日| aV直接看| 亚洲色综合色网| 色噜噜婷婷| 丁香五月婷婷在线视频| www.黄色片-久久成人国产精品在线播放-999AV| 色噜噜狠狠色综合日日| 久久久久久久久月丁| 五月丁香婷婷欧美色图视频五月丁香777电影 | 五月久久婷婷成人网| 天天日天天插| 免费看成人AA片无码视频吃奶| 97久久超级| 激情综合网丁香| 亚洲国产色色| 婷婷精品免费久久| 色色综合网www| www.91在线观看| 森林影视大全,最好看的2019年视频| 天天爽天天摸天天爱| 综合五月婷婷| 99热色综合| 婷婷五月天亚洲色| 婷婷操超碰| 超碰成人影视| 五月婷婷六月丁香免费| 五月天成人免费视频| 国产毛片欧美毛片久久久| 色射7856五月天激情四射| 5月色婷婷| 色久丁香五| 江苏少妇性BBB搡BBB爽爽爽| 99小视频在线| 婷婷成人五月天成人文学| 五月丁香综合精品欧美| 丁香婷最新动态| 色吧婷婷| 久久综合55| 天堂婷婷五月在线| 亚洲人妻Av| 日本久久激情| 99热 免费| 六月婷婷五月天| 大香蕉欧美在线| 五月婷婷丁香网| 亚洲五月婷婷| 99男人的天堂| 天天操夜夜操| 婷婷天天五月天| 日本婷婷综合精品| 日韩成人中文字幕| 九九精品少妇| 中文人妻主播久久| 久久婷婷色综合| 97日在线视频| 综合在线色婷婷| 婷婷五月丁香青青草在线| 久久综合播放| 天天做好综合色| 97五月婷| 这里只有精品视频一区| aa久久| 五月婷婷三级| 桔色成人在线| 加勒比久热| 五月丁香色狠狠干大屄| 色色激情五月天| 97碰碰视频在线观看| 久久综合五月天| 五月婷婷婷综合网| 激情五月天天狠狠久久| 综合久久首页| 亚洲亚洲亚洲AAAAAA| 99情色五月天| 久播影院免费观看电视剧大全最新网| 男女激情久久| 婷婷六月五月天综合| 日日操夜夜操不卡| 91久久婷婷人人澡草| 亚洲综合五月天婷婷| 天天操夜夜玩!| 久久丁香网| 久久五月天激情| 丁香五月777| 操日视频| 色综合久久88色综合天天99| 99热爱爱干干日| 日本熟妇精品99| 91操碰| 69午夜成人影片| 99热在线观看| 九九亚洲视频| 91热手机在线| 久色大| 人妻人人操| 俺去也五月| 久久婷婷婷婷伊人| 亚州激情九月| 婷婷五月图片小说网| 婷婷六月视频| 久久综合99| 九色视频这里只有精品| 岛国午夜视频| 久久大香蕉同僚| 99综合免费视频| 涩涩五月天| 激情亚洲网| 色七七九九| 青草青草视频2免费观看| 人妻久久久久久久久| YW无码| 超碰二区| 亚洲九九免费| 99久久国产综合精品五月天喷水\| 九九这里只有精品| 欧美日韩999| 五月婷婷碰碰| 日本三级中国三级99| 激情五月丁香婷婷夜夜操| 91色综合久久| 婷婷激情人妻| 99精品视频在线6| 91色色色视频| 色无码| 99热99热不卡| 综合激情伊人影视在线| 久久精品A片777777| 狠狠做婷婷| 超碰男人色| 国产欧美熟妇另类久久久| 天天日综合| 可以免费观看的av网址| 日本美女97在线视频| 我去色色网五雨天| 欧美婷| 91丨九色丨白浆秘| 婷婷五月丁香四射| 日本三级黄色大片| 热99热9| 久久久18| 丁香花成人区| 欧美大肥婆大肥BBBBB| 可以看的AV| 亚洲精品成人| 26uuu成人网| 欧美日比视频| 99思思热只有在这里看| 在线婷婷| 丁香五月激情久久麻豆| 91色五月| 色综合射婷婷| AV美美午夜| 久久香蕉丁香| 超级碰碰视频无码| 色婷婷很很丝袜| 人人干av| 大香蕉婷婷丁香视频在线| 丁香六月视频免费观看| 婷婷伊人綜合中文字幕小说| 高清 码 免费看片短视频| 成人无码精品1区2区3区免费看| 久9精品视频| 99免费视频网| 丁香五月婷婷乱| 欧美日综合| 久久久久亚洲AV无码网影音先锋| 亚洲中文AV| 日本天天色| 色综合中文| 五月丁香婷婷欧美| 五月丁香激情在线| renrencaoni| 亚洲色精彩| 日本成人综合| 激情五月综合久久| 31色区视频免费看| 婷婷丁香综合网| 国产精品色一哟哟| 婷婷五月天无码熟女| 女同激情久久av久久| 亚洲婷婷激情综合激情999精品| 国产黄色在线观看| 99热综合| 国产美女无遮挡裸体毛片A片| 色欲天天综合网| 狠狠狠狠狠干| 五月丁香淫淫婷婷婷| 婷婷五月天激情丁香| 婷婷 亚洲图片 丁香| 丁香五月网络网络| 日韩抽插操逼| 深爱丁香网| 99久久久| 精品久久99| 久热久色| 91丁香五月| 五月婷亚洲精品AV天堂| 97啪啪| 日韩成人网址| 精品无码av丁香五月激情| 亚洲人成网亚洲欧洲无码久久| 欧洲亚洲免费视频9| 久久婷婷五月天| 九九热这里只有精品5| 色婷婷狠狠干| 99惹| www,五月天激情| 五月激情婷婷丁香天堂| 九九热思思| 亚洲精品在线视频| 婷婷操久久| 成人av在线电影| 99精品网| 狠狠精品干练久久久无码中文字幕| 婷婷五月激情小说| 五月丁香综合| 色青青电影色五月| 丁香色影院| 久久久婷丁香五月天激情综合| 91丨九色丨高潮丰满日本| 97久久人人| 《诡秘之主》在线观看| 天天色色婷婷| 亚洲成人黄色网| 婷婷激情5月| 日本五月天婷婷丁香| 人人操AV| 熟妇人妻中文字幕无码老熟妇| 琪琪色网在线| 先锋资源91| 五月天色色色| 天天粽合合合合| 丁香六月久久| www.色综合| 牛牛热这里只有jingpin| 亚洲无码影音| 97久久精品| 伊人成人宗合网| 六月综合在线| 五月婷婷丁香六月| 92久久久| 婷婷午夜激情| 99er免费在线观看| 五月婷婷开心丁香| 超碰免费人人| 久久久久久久人妻| 婷婷酒色网| 婷婷成人网五月天| 激情五月,色播五月| 91久久| 亚韩精品视频1区| 日本成人综合| 五月婷婷插一插| 成人在线视频一区| 综合网色| 五月婷婷丁香啪啪| 99热九九这里只有精品| 狠狠色噜噜狠狠狠888了| 色九网| 成人龟情网丁香五月| 色狠狠色综合久久久绯色AⅤ影视| 中文字幕日韩无码制服诱或| 婷婷五月成人| 五月天激情国产综合婷婷婷| 丁香色影院| 色情丁香五月天| 成人国产综合| 亚洲在线免费成人| 69热在线| 九九无码| 99精品国产在热久久| 任你操精品免费| 99免费视频在线观看爱| 亚洲色久| 啪啪啪丁香五月| 九九这里只有精品在线视频| 九九99精品视频在线观看| 国产亚洲成AV人片在线观黄桃| 正宗黄色毛片| 中文字幕婷婷五月天在线观看| 婷色五月| 久久婷网| 五月天色婷婷成人| 免费看欧美成人A片无码| 五月婷婷天堂| 亚洲第一综合| .青娱乐天天操B| 天天做天天要天天爱| 免费黄色AV| 99热高清在线| 亚洲色色色色| 少妇人妻丰满做爰XXX| 婷婷五月激情热播| 综合伊人久久| 色婷小说| 伊人综合网4| 国产又粗又大又爽又黄| 色情五月天视频网| 在线观看免费狠狠色丁香香综合| www.久操| 五月综合色播播丁香婷婷| 五月婷婷六月激情| 九洲一级A片| 色噜噜狠狠色综无码久久合欧美| 1024操逼| 久久国产性爱A V| www.激情| 99久久婷婷国产综合精品草原| 亚洲五月天婷婷| 色婷婷啪啪啪啪啪啪| 天天干天天色综合| 国产成人亚洲综合亚洲| 思思久久精品| 1024在线视频| 婷婷香五月| 久久玖玖99| www夜夜操comwww| 97操男人的天堂| 97婷婷五月天|