99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
天天色综合色| 亚洲热久久| 91婷婷视频| 婷婷六月天激情| 婷婷99狠狠| 婷婷色色综合| 成人短视频在线观看| 亚洲乱码成人| www.主妇. com| 九九精品碰| 久久婷色| 色婷婷大香蕉| 色色色婷婷五月| 丁香狠狠| 成人小说 五月天 婷婷| 99自拍视频在线| 99超级超级超级碰| 狠狠色婷婷丁香五月| 婷婷综合激情| 大香蕉久| 日本久久天堂| 99视频只有精品| 五月天开心网| 少妇搡BBBB搡BBB搡毛茸茸 | 99视频这里有精品| 综合婷婷都市激情| 天天插天天日| 亚洲人人操| 激情综合激情五月| 这里只有精品在线播放| 婷婷 激情 五月| 五月天丁香综合| 91n网站cad入口在线观看| 国产69久久久欧美黑人A片 | 九九在线视频| 97操操| 激情五月天偷拍综合网| 99热亚洲| 久久网日本| 超碰a女人的天堂| 99热日韩| 婷婷五月天高清无码| 五月综亚洲| 操操操www.com| 天堂久久婷婷| AV伊人青草丁香六月| 91久久精品无码一区二区三区| 久热9热| 99操不停| 久久久久久99精品无码| 九九色热| 玖玖精品视频99| 97久久香草精品视频| 99久热在线精品| 伊人激情| 婷婷五月天视频在线观看| 伍月激情天| 天天做天天爱天天日| 99色婷婷| 色了色综合| 国产美女精品| 高清无码网址| 色色色五月婷婷| 久久久久这里只有精品| 五月丁香综合精品欧美| 91在线视频综合| 99九九玖玖| 99在线热| 久热这里只有精品视频6| 久久人妻系列| 大香蕉婷婷丁香天堂AV| 色五月情| 久久丁香五月| 六月丁香婷婷尤物| 亚洲成人av在线| 泰州成人视频| 伊人大香久久| av在线超清中文| 99热这里只有精品69| 五月开心啪啪| 夜夜躁爽日日| 人人超碰99| 91人人超碰在线| 97天堂| 婷婷五月免费观看| 丁香色成人| 99色视频| 色色色五月天激情资源| 日日色五月天| 婷婷射图| 97久久超视频| 99久久成人| 99视频这里只有精品10| 亚洲人人操| 97碰 在线视频观看| 五月婷综合性中心| 99九九视屏| 99视频综合| 色五月成人婷婷| 婷婷五月天激情网| 久久视频这里都是精品| 色婷婷五月天偷拍| 五月色情婷婷开心五月色情| 天天色图| 丁香六月色婷婷欧美| 激情五月综合色婷婷| 丁香色综合| 婷婷五月,偷窥偷拍网| 日韩人妻无码精品| 婷婷五月视频| 成人 在线观看国产| 五月天激情四射网站| 99爱免费在线观看| 色五月激情综合网| 六月婷婷综合久久| 伊人五月综合网| 五月婷婷影院| 丁香五月婷婷深爱综合激情| 成人婷99最新| 熟女91九色| 26uuuavcom| 婷婷五月天激情网| 色综合久久44| 丁香五月综合婷婷| 久久婷婷五月综合啪| 丁香婷婷丁香五月欧美人| 丁香六月激情| 丁香五月激情综合婷综| 欧美中文五月天| 91 九色大美女| 婷婷色导航| 丁香六月情| 成人无码髙潮喷水A片| 涩涩婷婷五月| 一区二区免费看| 在线综合啪| 色婷婷六月激情| 激情六月丁香| 亚洲色综合| 五月天综合色| 久久看婷婷| 丁香五月Av| 婷婷色色网站| 桔色成人在线| 五月狠狠| 欧美操人| 色婷婷4| 久久五月天综合| 久9免费视频| 尔尔AV一区| 97成人丁香| 亚洲色域网| 婷婷激情五月综合| 五月丁香色婷婷熟女| 性按摩玩人妻HD中文字幕| A一级操| 伊人色综合网| 色色婷婷综合网| 噼里啪啦在线观看免费完整版视频 | AV操逼网| 色婷丁香五月| 日碰日| 亚洲尤物在线| 亚洲成人综合网在线免费观看| 蜜桃五月天色| 五月天激情网址| 五月丁香综合网| 人人操操| 五月丁香影院| 色欲久久久久| 国产成人网| 99热自拍| 五月丁香六月婷婷的女人| 免费色婷婷| 深夜A片| 99碰碰中文| 另类图片五月天| 日韩精品999| 色婷婷久久综合| 婷婷丁香五月亚洲欧美| 99在线资源视频| 婷婷五月丁香基地| 天天人人综合| 久草嫩草在线观看| 欧美性做爰大片免费看办公室| 色色婷五月天| 色婷精品91| 五月天激情小说网| 丁香婷婷五月| bbwcuckold精品熟妇| 国精产品一区一区三区免费视频| 97色色综合| 大香蕉婷婷色| 九九九九中文字幕| 天天做天天爱| 久久婷婷五月综合色奶水99啪| 99久久丝| av免费在线网站| 成人午夜无码视频| 五月婷啪| 综合一本道| 在线视频另类| 中日韩狠狠色| 五月丁香六月停停停| 大香蕉久久久| 2025年最新亚洲在线欧美| 五月丁香无码| 九九综合图片网| 青青草激情网| 另类图片色五月| 亚洲、热| 夜夜涩涩涩| 久久青青日本视频| 五月婷婷婷色| 秋霞少妇AV网站| 97久久久久| 婷婷中文字幕版| 玖玖精品婷婷| www色哟哟| 五月天婷婷色色| 99视频网| 五月天婷婷高清无码| 超碰色色综合| 五月丁香综合成人社区| 九月停停| 九月丁香很很色| 九九色色| 丁香五月性| 深情五月天| 日韩一区二区在线播放| 成人av免费观看| 人人操91色| 亚洲婷婷五月天| 99久久99久久| 天天日天天色| 色婷婷激情| 人人视频人人干人人做| 精品人妻伦一二三区久久| 丁香婷在线| 欧美va视频不用播放器的va视频网| 日韩99视频| 激情婷婷激情在线不卡| 五月丁香六月停停停| 内射在线CHINESE| 五月丁香综合| 欧美搡BBBBB摔BBBBB| 婷婷综合网站| 超碰av在线| 久婷婷色| 91操人视频| 亚洲AV综合在线观看| 人妻无码精品一区| 日日噜噜夜夜狠狠久久丁香五月| 色五月婷婷小说亚洲中文字幕组| 99久久这里只有精品| 五月丁香黄色视频| 丁香婷婷色色| 开心深爱激情网| 久久激情五月天| 丁香五月婷婷六月丁香| 久久婷婷六月综合| 色婷婷综合网| 91干婷婷| 91chinese 在线| 婷婷午夜综合| 九九sese| 丁香狠狠色婷婷久久无码视频| 涩涩涩.com| 性生活久久人妻| 国语精品探花| 色色国产| 9久热| 超碰久热| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 久热这里精品免费| 夜夜骑夜夜撸| 26UUU欧美| 岛国av网站| 五月天成人免费视频| 丁香五月婷婷五月| 久久久香港| 婷婷丁香社区| 激情宗合哪里能看| 99精色| 99只有这里有精品在线视频| 婷婷网五月天| 色婷婷色丁香色欲av| 1024你懂的欧美曰韩| 97人人做| 久久婷婷在线| 99热99干| 99久久国产综合精品五月天喷水\| 亚洲狠9| 婷婷综合九月| 亚洲激情电影五月天色婷婷丁香一起草| 激情亚洲五月| av久热| 精品夜夜澡人妻无码AV| 金品在线视频99| 婷婷丁香色五月亚洲| 爱的综合网| 成人丁香| 99热在线观看| 丁香五月激情啪啪| 天天插天天爽| 蜜乳久AV| 99无码免费视频| 激情五月天影院| 这里只有精品2| 狠狠色噜噜| www.操.com| 五月婷婷六月激情| 久久五月天合网| 婷婷激情小说| 五月婷婷香蕉| 最新激情五月天| 色播播五月天| 婷婷丁香五月天激情四射| 99在线视频精品| 26UUU精品一区二区Com| 婷婷爱五月| 激情五月天99色| 97婷婷丁香五月天激情图片| 大香蕉综合网| 欧洲亚洲午夜| 五月丁香六月婷婷色日| 五月色亭丁香| 久久丁香五月婷婷| 乱岳熟女50岁| 激情深爱综合| 99久久9| 色天堂在线| 五月丁香色婷婷综合| 五月婷婷综合在线| 日韩色色色色色| 99热国产这里只有精品| 在线五月婷| 亚洲五月丁香综合网| 五月婷婷九| 淫五月停停| 亚洲五月婷婷在线| 乱精品一区字幕二区| 丁香五月婷婷久久综合激情网 | AA片在线观看视频在线播放 | 激情五月综合网| 91热久久| 色爱五月天| 超碰av天堂| 色色色色色网站| 亚洲V国产V欧美V久久久久久| 五月婷婷AV| 久热中文字幕| 九九性视频| 97干在线播放| ww久久| 五月天另类激情在线| 激情碰碰碰| 色欲五月婷婷| 色婷婷亚洲综合av| 九九热最新| 婷婷中文网站| 五月丁香花视频| 色播播婷婷| 香蕉人在线香蕉人在线 | 1024在线视频| 99色视频| 五月丁香六月综合情在线观看| 五月婷婷色| 九九热只有这里精品| 成人电影一区| 丁香六月激情综合网| 少妇人妻人伦A片| 五月香蕉综合| 99五丁香月| 天天天综合网| 色99在线| 666555。COm毛片| 激情综合色婷婷啪啪六月天| 久草九九| 精品亚洲国产成人A片在线鸭王| 99高级会所久久| 亚洲精品V天堂中文字幕| 五月婷在线色视频| 大伊香蕉玖玖爱| 色射影院| 色播五月丁香| 天天开心天天色| 亚洲中文字幕在线观看| 色爱亚洲| 综合丁香婷婷五月天| 欧美成人猛片AAAAAAA| 精品色色色| 五月久久婷婷天堂视频| 久久久久久欧美精品se一二三四| 狠色色狠网| 激情五月婷婷啪啪| 人人操AV| 成人精品人妻| 综合色色婷婷| 热久久91| 成人精品免费在线观看| 操一区| 色欲香综合网| 人人干99| 久久曰9| 久色网址| 伊人AV五月婷| 亚洲色婷婷色| 欧美综合五月丁香六月婷| 日本三级韩三级99久久| 99热免| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 3p久久| 欧美肉大捧一进一出免费视频| 欧美VA在线观看| 婷婷精品在线| 1囯产午夜仑鲁鲁| 激情五月丁香五月| 色五月91| 青草少妇激情| 婷婷九月丁香久久| Xx色综合| 成人av免费观看| 久久ri精品视频| 九九视频在线| 久操福利| 婷婷成年人免费视频| 樱花99视频| 丁香五月停停基地| 野外99热| 玖玖婷婷五月天毛片| 色情五月综合婷婷| 久久婷婷六月综合| 久热 91| 夜夜干天天干| 色六月视频| 天天综合天天做天天综合| 欧美日本黄色| 色情五月天丁香社区| 色吧网综合| 国产成人精品一区二三区熟女在线| 丁香九月综合激情| 人妻少妇色综合| 99热只有这里才是精品| av在线色五月丁香婷区久| 婷婷在线播放av| 欧美色色色色色| 欧美日韩成人高清在线| 欧美啪啪五月天| 精品国婬伦V无码久久久| 亚洲国产无线乱码在线观看| 能看的av| 99久久网站| 亚洲精品视频在线| 天天干狠狠| 99热1| 亚洲人成色A777777在线观看| 色丁香婷婷| 色综合日日| 玖玖九九99| 亚洲女婷婷五月基地综合久久久| 大香蕉综合在线| 六月丁香AV| 久久99这里只有精品| 久久人妻乱子伦| 操操熟女| 99熟女| 免费亚洲婷婷| 婷婷五月天av小说| 人妻 性久久久久久| 无码91中文字幕| av亚洲国产小电影| 99热最新国内| 久久五月六月| 日韩av手机在线观看| 色婷综合| 大香网伊人久久综合| 可以直接看的av网站| 久久99国产综合精品免费| 久久狠狠色| 激情网开心网| 日本高清综合网五月丁香| 夜夜干天天操| 能直接看的av网站| 风流少妇A片一区二区蜜桃| 亚洲色无码A片一区二区麻豆| 久久人妻熟女一区二区| 久久全色| 超碰在线视屏| www.日韩艹| 99热在线免费| 婷婷久热| 激情五月成年| 色五月婷婷影院| 久久丝丝热| 五月婷婷无码专区| 91成人电影| 婷婷五月在线视频| 97ai婷婷| 超碰三级秋霞| 婷婷色五月在线视频| 亚洲视频五区| 亚洲99热| 国产婷婷色五月| 亚洲国产成人裸舞| 五月天色综合| 99国产99| 777色婷婷爱五月| 婷婷五月色综合| 91操片| 熟女人妻视频| 婷婷久久久| 五月丁香六月婷婷婷婷| 人妻AV在线| 婷婷六月香| 97人人干人人操| 麻豆五月丁香婷婷| 九九久久网| 男人的天堂在线婷婷| 婷婷色网站| www一区二区三区| 久久99视频| 91在线看片| 国产1区2区3区在线观| 99热这里全是精品| 无码少妇高潮喷水A片免费| 久久色五月| 99热精品综合| a在线观看| 日韩免费99| 久久五月天激情视频| 中文字幕丰满人妻无码专区| 骚逼视频一区2区| 99精品在线播放| 五月婷婷在线视频观看| 91狼友视频网页更新| 九九碰九九爱97超碰| 99色热| 伊久大香蕉| 激情五婷精品网在线观看网址| 天天干天天操天天爽| ..真实国产乱子伦对白在线_欧| 五月婷婷深深爱| 都市激情五月婷婷亚洲| 国产又色又爽又黄又免费| 91热99| 五月婷婷婷丁香播| 操比激情五月| 五月丁香六月婷婷亚洲综合| 婷婷丁香18| 婷婷五月天伊人在线| www.超碰| 99热乎| 九九激情网| 欧美日韩123| 日本天天操| 丁香五月WWW| 五月婷婷综合精品| 怡红院成人AV| 开心五月深爱五月| 天天色99| 丁香五月区| 五月天丁香综合久久国产| 九九热视频这里只有精品| 四色五月婷婷| 天天操天天操天天操天天操天天操天天操 | 丁香久久| 色婷婷色久综| 久久久精品免费啪啪国| 色五月第四色| 综合九九久久| 婷婷五月AV| 中文精品在| 欧美日韩成人免费在线| 97超碰人人操| 亚洲成人免费电影| 思思热热久久| 人妻操日日| 开心五月深爱五月| 九热精品| 色优久久| 色婷婷丁香五月色综合网| 狠狠操狠狠色| 狠狠高潮精品亚洲1| 婷婷娌伦网| 超碰人人操在线| 久久精彩免费视频精彩免费视频| 五月婷视频| 西瓜美女a片| tingtingseav| 91婷色| 在线国产精品色| 四川BBB搡BBB搡多人乱亂| 天天添天天摸天天天天做| www.婷婷激情网.com| AV性爱在线| 97久久精品| 97碰在线视频| 精品色色色| 123草逼网| 色五月首页| 96五月丁香熟女| av在线激情| 高清无码网址| 婷婷五月在线播放| 日日骑夜夜撸| 98热精品| 婷婷五月天综合网| 精品久久人妻| 蜜桃婷婷丁香五月天狠狠久久综合| 婷婷丁香五月天激情四射| 午夜九九九九九九九九九九九九九| 一起草AV| 二区成人视频| 9久热| 色爱亚洲| 五月丁香啪啪激情| 国产精品视频免费看| 国产亚洲色婷婷久久99精品91| 六月丁香好婷婷| 中文字幕在线资源| 97操碰日本女人| 婷色五月| 六月婷婷日| 婷婷丁香九月| 开心激情播播五月天| 成人片在线播放| 色9999综合久久| 亚洲色五月天| 五月丁香大相交| 激情综合色| 99色在线观看免费| 九九综合色综合| 婷婷无五月无码视频| 婷综合| 精品草原久久视频| 免費亭亭成人| 日本超碰在线| 亚洲AV免费国产电影| 精品欧美一区二区三区久久久| 色五月婷婷九月| 丁香婷婷五月天色播| 五月激情站| 丁香婷婷噜噜| 亚洲九九99精品视频在线播放| 成人短视频在线| 欧美69色| 久久九九Com| 人妻久久久| 丁香五月天堂网| 日本婷婷五月天| 丁香五月婷婷手机| 丁香五月天五码婷婷| 色噜噜狠狠色综| 熟女网站久久| 精品99视频| 五月婷综合| 九九热这里只有精品9| 202丰满熟女妇大| 思思久久精品| 丁香九月婷婷| 丁香五月婷婷影院| 久久婷婷五月| 五月婷婷在线视频| 激情深爱五月天| 99亚州综合精品成人网| 99欧美| 婷婷激情五月综合| 国产午夜一区二区三区| 亚洲另类在线观看| 日日综合网| 亚洲天天| www.夜夜| 国自产拍偷拍精品啪啪一区二区| 欧美搡BBBBB摔BBBBB| 婷婷五月天社区| 另类少妇人与禽zOZZ0性伦| 26uuu欧美| 99热这里只有精品1998| 亚洲AAA| 欧美熟女乱又伦| 五月婷在线色视频| 五月六月婷婷| 少妇性按摩无码中文A片| 天堂综合久| 91玖玖| 亚洲天堂色色| 欧美五月停| 婷婷五月综合免费在线| 四月婷婷五月丁香| 久99| 五五月五月| 色五月综合激情| 五月天婷婷免费视频| 婷婷午夜精品久久久| 99爱这里只有精品免费视频| 人妻久久久| 五月成人丁香av91| 五月天久久网站| 亚洲九区| 五月天婷婷成人资源站| 另类小说色婷婷| 99精品在线| 少妇大叫太大太粗太爽了A片| 91色性感五月婷婷丁香| 婷婷综合影院| 开心激情色婷婷五月天| 亚洲成人黄色网| 久久超级碰碰| 亚洲精品V天堂中文字幕| 日逼AV影音先锋男人资源站| 香蕉中文在线| 丁香五月婷婷五月天在线| 五月丁香五月天现场视频| 久久久人妻| 五月婷婷无码| 影音先锋 一区| 色八月婷婷| 99热a片免| 色色色色色网| 91丨人妻丨国产丨丝袜| 天天日夜夜B久久| 五月婷婷激情视频| 日韩成人免费电影| 日韩三及成人AV片| 激情网站综合五月天| 俺去也五月天| 成人午夜天| 人人操人人干AV| 26uuu国产精品| 日本色99| 色综合9| 婷婷偷拍网| 婷婷六月啪啪| 影音先锋美国A| 久久婷色| 99视频在线精品| 亚洲乱码日产精品BD| 五月丁香婷婷激情影院欧美| 婷婷色色播五月天| 夜夜夜夜夜操| 99啪啪网| 俺也高清无码高清视频| 日产精品一线二线三线芒果| 91人人网| 天天天天操| 五月丁香色欲| 五月天亚洲最大成人| 91久久精品无码一区二区三区| 99ER热精品视频| 色情性爱视频网址| 91se在线视频| 99色.com| 欧美日韩一区二区三区四区| 日产精品一线二线三线芒果| 99精品无码视频| 久久伊人婷婷| 99久久精品国产色欲| 99热在线免费| 99久99久| 99热这里只有精品一区| 99视频| 好好日激情五月天| 五月婷婷综合视频| 婷婷色在线| 无码人妻激情| 五月丁香六月成人| 亚洲婷婷91丁香| 大香蕉婷婷丁香| 亚洲操操操| 五月丁香婷色| 中文av网| 久久精品夜色噜噜亚洲a∨| 99色亚洲| www.99免费视频| www五月天com| 99偷拍视频在线日本| 五月丁香婷婷综合网| 51精品国内探花| 久久er99| 丁香五月综合久久| 九九99热| 色婷婷免费观看| 中文字幕永久免费| 五月丁香六月在线欧美| 六月激情婷婷| 超碰AAAAAAV| 97久久综合网| 熟女激情五月天 | 九九99热| 日韩综合网络男女香蕉a片| 99热日韩| 激情丁香五月婷| 风流少妇A片一区二区蜜桃| 婷婷激情五月综合基地| 五月天激情美女久久| 久久精品亚洲一级牲爱综合 | 亚洲AV激情五月综合网| 国产亚洲精品久久久久久久久动漫| WWW.桔色成人.COM| 伊人丁香五月婷婷潮吹| 色欲五月婷婷| 欧日美女Va| 中文字幕视频色婷婷| 97色色在线视频| 亚洲无aV在线中文字幕| 国产超碰在线| 色情激情五月| 99狠狠操一| 久久五月天综合| 好好干av| 五月天婷婷情色| 天天色天天日| 99青青草| 啪啪激情综合| 99视频这里有精品| 一本色道久久综合狠狠躁小说| 久久婷婷网站| 成人国产欧美大片一区| 久久激情网| 色婷五月婷婷| 九热视频免费观看| 九九这里有精品| 婷婷激情丁五月| 色碰干| 国产SUV精品一区二区883| 开心激情五月天网| 天天爱天天日| 99在线视频女女视频| 99久在线精品99re8热| 国产日日操夜夜操的肉棒视频| 4438成人电影| 国产肥白大熟妇BBBB视频| 日日操夜夜爽| 亚洲色婷婷婷婷人人爽| 五月天婷婷情色| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 综合网啪| 亚洲VA在线| 99熟女| 六月婷在线| 五月丁香六月激情| 人妻视频在线| 亚洲AV成人无码久久精品老人法拉利| www久久99| 国产黄色大片| 日日干夜夜干| 亚洲AV成人在线| 99热精品在线播放| 色亚洲中文| 色琪琪一综合久久激情五月视频| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 久久婷婷亚洲| 99视频网址| 日日夜夜狠狠干| 在线五月色播| 综合网色| 久热超碰91| 久久9热综合| 日韩中文字幕| 久热免费视频| 日韩啪啪视频| 午夜丁香综合婷婷| 色婷婷社区| 五月丁香啪啪啪啪| 丁香婷婷五月天色综合| 99热亚洲| 加勒比日本一区二区三区| 激情综合视频| 欧美性生交XXXXX无码小说| 亚洲情欲| 久久久久9999| 丁香激情网| 五月天激情啪啪| 五月丁香六月欧美综合网站| 欧洲免费视频色| 五月天激情婷婷五月天久久| 99精品这里只有免费视频| 五月天激情图片| 色情婷婷。| 九九精品亚洲| 黑人无码一区| 黑人无码一区| 国产性爱一级| 97热久久| 超碰在线免费9| 丁香久月婷| 色婷婷色九月| 99干视频| 99操逼| 色五月丁香六月资源站| 免费观看的av| 五月天色丁香| 午夜丁香| 日本人妻伦在线中文字幕| 日本一级一级一级一级| 欧美韩国日本| 99久久九九视频| 久久中文网| 任你弄在线视频免费| 91呦呦呦| 91亚洲免费片| 天天搞天天色综合| 色五月色五天色情网| 色色婷婷丁香| 99久久99热| 97色五月天| 婷婷综合伊人丁香| 色五月婷婷丁香五月| 强伦轩人妻一区二区电影| 99视频激情四射| 亲子乱AV一区二区三区下载| 婷婷激情小说| 无码激情AAAAA片-区区| 婷婷综合五月天| 日本一级特黄大片AAAAA级| 高清不卡一区| 国产美女无遮挡裸体毛片A片| 色狠狠色噜噜AV天堂五区| 六月婷婷色色网| 玖色色综合| 五月丁香婷婷在线| 激情5月婷婷狠狠干| 夜夜做夜夜愛| 99超级碰碰| 玖玖婷婷五月天| 人妻激情久久| 六月婷婷综合久久| www.夜夜操.con| 婷婷色网站| 五月婷婷人人人操| 国产AV一区二区三区最新精品| 日碰日| 亚洲熟女色| 5月丁香综合网| 九九婷婷五月天| 99精品亚洲| 伊人大综合| 亚洲人妻Av| 六月伊人婷婷| 日本天堂免费99| 久久怡红院| 色婷婷四色| 日日干日日色| 天天拍天天操| 免费无码毛片一区二区A片 | 激情五月天噢美| 久狠日av| 99热这里只有精品16| 激情五月综合网丁| 91玖玖| 婷婷色色网| 亚洲AV综合网| 曰本久久女| 秋霞免费三级片| 夜夜干天天干| 五月婷婷综合网| 色www.con| 婷婷五月久久| 天天干 夜夜爽| 99在线综合视频| 五月色丁香综合| 色色色综合| 五月激情丁香啪啪| 亚洲第一黄网| 五月天播播| 五月婷婷色欲| 午夜丁香丁香婷婷| 蜜桃人妻无码AV天堂三区| 婷婷婷婷色| 丁香六月婷婷久久综合| 亚洲AV第二区国产精品| 五月丁香色婷婷熟女| 狠狠五月天| 超碰97干| 婷婷天天婷婷天天澡| 51精品国自产在线| 天天舔天天插天天爱| 99资源在线视频| 精品AV无码超碰| 青草视频在线蜜臀| 婷婷五月天网| 51成人| 夜色综合网| 色444综合网| 婷婷五月天手机版视频| 五月天色图| 激情五月天视频| 91无码高清| 亚洲成人AV在线| 五月丁香六月婷婷综合| 综合色在线| 五月丁香六月婷婷在线小说视频| 亚洲综合色色| 91色五月| 另类视频综合| 久热91精品| 1024操逼视频| 91在线操| 婷婷激情图片| www.久久久久久久久久久| 成人开心五月天| 色婷婷色和| 天天干狠狠| 色吊丝99| 丁香五月在线| 岛国操B不卡在线| 久久99网| 九九久久高清| 182TV大香蕉| 婷婷射图| 久久婷婷色| 99精品在线播放| 激情五月婷| 丁香五月天欧洲在线| 色播综合| 五月天自拍网| 激情性爱五月天网页| 色综合日日| 另类亚洲电影| 91久久电影| 色综合久久88色综合天天99| 99色婷婷视频| 伊人青草成人| 亚洲网综合在线| 国产精品热搜丁香五月婷婷| 中文av在线观看| 色呦呦美女| 五月婷婷大香蕉| 嫩BBB槡BBBB搡BBBB| 天天操天天谢| 超级97碰碰| 操碰99| 99热这里有精品6| 99热 精品在线| 五月成人天| 日本三久久| 欧美日韩91| 久久久精久人妻| 婷婷九月丁香天堂丁香天堂| 9久久精品| 爱草视频在线| 99啪啪骑| 99精品亚洲| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇| 五月四色激情| 五月久久婷婷天堂视频| 婷婷丁香六月五月天| 亚洲午夜在线视频| 色五月婷婷老师| 五月天·www·com| 97亚洲精品| 91久久久久久久久18| 五月丁香六月婷婷免费视频| 激情综合在线播放| 五月婷婷影院| 51avj视频大全| 美日韩成人| 久久久久9久无码视频| 99玖玖在线视频| 天天噪夜夜爽| 婷婷大乡焦噜噜| 国产亚洲精品久久久久苍井松| 五月天网站免费欧美| 九月丁香婷婷综合激情| 91日综合欧美| 色婷久久| 另类激情中文| 狠狠搞综合色| 天堂色婷婷| 精品婷婷| 欧美超级视频97| 婷婷五月丁香综合| www.99热国产| 人人澡天天色天天做| 色五月av| 色狠狠婷婷| www.婷婷六月天| 99久操视频| 超碰人人操在线| 日本狠狠干| 婷婷六月久久| 婷婷五月综合亚洲| 婷婷五月成人| 婷婷五月色激情欧美激情| 一本色综合色| 日逼免费视频| 玖玖五月丁香| 国产激情在线| 亚洲五月天第一综合干| 亚洲天堂热| 欧美婷婷精品激| 亚洲黄色av网站| 五月婷婷开心网| 可以看的av| 99热精品一| 五月丁香六月色婷| 国产精品国产| 欧美日韩婷婷五月天| 色五月首页| 人妻中文在线| 丁香久月| 亚洲成人在线五月天| 亚洲无码成人性爰网| 最新日本A片| 丁香大香蕉| 小骚穴电影| 97AV人人插人人操| 国产av第一专区| 综合天堂AV久久久久久久| 久久精品99| 99在线观看精品视频| 婷婷五月天激情小说| 色噜噜五月天| 激情五月色婷婷| 五月丁香亚洲综合| 五月婷婷久草在线视频综合| 91婷婷五月天综合视频| 五月婷婷六月丁香综合视频在线| 91欧美| 91碰| 久热中文字幕| 婷婷午夜精品久久久| 五月天综合久久丁香91| 99超碰在线免费| 成人短视频免费| 六月丁香啪| 中文字幕不卡视频| 久久久噜噜噜www成人| 九九色中文| 丁香五月天亚洲综合| 国产激情一区| YW无码| 中文字幕无码成人电影| 91xxxx九色| 久久视频婷婷| 男人天堂99| 婷婷五月天激情网| 五月丁香六月综合情在线观看| 五月婷婷无码| 天天 青草 制服丝袜 在线| 久久五月六月| 亚洲婷婷月丁香五月| 亚洲婷婷丁香五月亚洲| 国产热精品| 久久99免费视频| 99热这里全都是精品| 99啪啪网| 大香蕉啪啪啪| 久久精彩免费视频| 91精品久久久久久久久久| 丁香婷婷AV| 色吊丝av中文字幕| 台湾无码A片一区二区| 超碰大香蕉网| 就99这里只有精品| 色婷五月| 日本美女五月天| 91性高潮久久久久久久久| 99热这里都是精品| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 桃色伊人在线| 亚洲丁香五月| 丁香五月婷婷五月天| 大香蕉婷婷| 成 人片 黄 色 大 片| 亚洲av综合在线| 激情五月婷婷视频一区二区三区| 婷婷久久丁香五月| 开心深爱五月天| 五月婷婷婷自由综合| 色五月激情五月| 五月婷婷中文| 90色免费视频| 亚洲无码成人| 另类丁香五月天区图| 五月天色丁香| 婷婷五月天开心网| 丁香,开心成人,久久| 久久婷婷五月天蜜桃| 丁香六月婷婷| 婷婷丁香18| 99热在线精品播放| 婷婷色日本| www.99日本| 中国女人做爰A片| 六月婷在线| 丁香综合伊人| 五月丁香六月欧美综合网站| 思思精品视频| 人操人| 琪琪理论片| 狠狠狠狠狠狠| ..真实国产乱子伦对白在线_欧| 91久久免费| 五月丁香婷婷久久| www.9797国产| 成人AV在线中文版| 亚洲午夜视频| 99色视频免费在线规看| 五月婷婷片| 丁香综合久久| 天天色五月| 91超碰人人操| 国产AV网页| 色色色综合视频| 久久五月婷婷丁香| 婷婷丁香红五月91C| 九九精品视频免费在线| 夜夜操天天干| 色伦专区97中文字幕| 黄色五月婷婷| 夜夜爽天天干| 精品久久穴| 日韩九九视频| 天天综合网在线| 美国少妇性做爰| 六月丁香花婷婷| 婷婷久月| Caoub青青超碰 | 婷婷丁香五月天激情| 另类国产区| 无码人妻一区二区三区免费九色| 九九热在线精品视频| 六月婷婷香蕉| 亚州色色色| 狠狠色综合五月人人| 五月天伊人av| 996热| 91凹凸在线| 色色A| 亚洲成人丁香花| 69er小视频| 日本色色色| 激情久久久| 99热碰碰热| 婷婷色操| 日日操夜夜爽| 1024你懂的欧美曰韩| 色丁香婷婷| 狠狠干.com| 天天操夜夜玩!| 九九黄色网| 国产99美少妇| 婷婷久久五月天| 丁香五月婷婷狠狠色| 中文字幕 码精品视频网站| 热久国产| 淫视馆AV在线| 97干在线观看视频| 国产免费一区二区三区三州老师F1F1.CC| 一区中文字幕电影| 五月婷婷激情综合网| 久久天堂女人| 激情综合网五月激情| 超级碰人人操人人干| 亚洲色爱综合| 青青草婷婷久久| 日本五月天婷婷丁香| 第五婷婷伊人丁香| 综合XX网| 五月综合丁香婷婷| 九月丁香亭亭| 日本va欧美va欧美va精品| 国产这里只有精品| 欧美激情丁香五月天久久婷婷一区|