欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
琪琪布丁香社区激情五月天| sS丁香五月婷婷| 五月丁香操亭亭网| 天天干狠狠艹| 亚洲色视频| 五月婷婷六月丁香在线视频| 六月丁香av| 色色色在线观看| www.色五月| 成功精品影院| 精品国产乱码久久久久夜深人妻 | 欧美色图天堂网| 97se视频在线| 久久婷婷五月综合| 天天操天天日天天爽| 小视频一区| 九九视频精品视频精品| 26UUU欧美| 天天爽天天摸天天爱| 丁香五月婷婷影院| 日韩九区| 亚洲AV成人无码精品| 久久R激情| 婷婷五月天亚洲综合网| www999日韩精品| 婷婷亚洲色| 亚洲婷婷丁香五月视频| 久操大香蕉| 丁香五月综合| www.精品久9| 婷婷久久久久| 国产成人VA| 亚州精品久久久久AV无码| 五月综合婷婷久久在线| 五月天丁香成人社| 婷婷久久大香蕉| 国产乱轮一区二区三区| 久久婷婷精品| 人妻久久久久久久| 少妇搡BBBB搡BBB搡毛茸茸| 婷婷影视久久| 亚洲综合网 665566| 99综合视频在线| 激情综合网亚洲色图| 成人在线日韩欧美| 最近中文字幕大全免费版在线 | 97操碰碰无码视频| 成人五月天视频播放| 色五月 五月婷婷| 另类专区在线观看| 99网址在线观看| 九九热九九| 日日干日日s| 五月天俺去也| 日韩精品AV一区二区三区| 久热99视频在线观看| 六月色色| 亚洲 视频 导航 一区| 久久综合激情| 九热精品| 狠狠干在线| 亚洲热综合| 免费看欧美成人A片无码| 日韩狠狠色| 99er6热在线观看精品6| 九九综合久久| 婷婷色基地在线看 | 性做久久久久久久免费看| 亚洲激情五月| 五月色情网| av在线免费网站 | 天天爽夜夜操| 狠狠综合色网| 蜜臀九九九九| 国产露脸150部国语对白| 国产成人+综合亚洲+天堂| 天天日夜夜拍| 伊人九九九久| 婷婷六月激情啪啪| 丁香五月AV| 丁香花五月天社区| 婷婷五六月丁香| 色色 亚洲| 日本少妇裸体做爰高潮片| 丁香六月婷婷激情综合| 激情综合激情综合| 久月久在线视频| 99婷婷五月天| 丁香婷婷五月六月久久| 超碰激情五月| 综合综合网| 激情五月天网| 丁香五月影院| www.色婷婷.com| 精品动漫 无码av| 99热这里只有精品 搜| 日本精品人妻无码77777| 五月天综合网| 婷婷五月激情中文字幕| 五月天六月丁香| 99性视频| 97综合在线| 丁香五月婷婷偷拍| 亚洲成人av在线| 五月激情五月婷婷五月天在线| 中文字幕日产A片在线看| 色一情一乱一乱91Av| 伊人婷婷激情| 久久婷婷五月综合色丁香花| 国产日日操夜夜操的肉棒视频| 草草女人亚洲| 国产精品五月丁香| 色无码| 日韩人妻在线观看| 另类视频五月天| 五月丁香成人网| 91丨九色丨东北熟女| 综合色情网| 五月天婷婷乱论小说| 日本无码专区| 深爱五月天 开心网| 1024日韩| 在线VA视频| 国产午夜精品一区二区三区嫩草| 婷婷涩五月天综合| 五月天堂六月丁香亚州中文字幕久久| 26uuu亚洲欧美| 九九无毛| 五月天六月色| 亚洲综合成人网| 婷婷五月色天| 五月婷婷伦理| 亚洲中文字幕在线电影| 99re这里只有| 亚洲久热| 婷婷97色| 色色com| 香焦网五月天| 色色色色综合网| 99久久亚洲精品视频| 人妻久久久久久久 | 4399成人黄A片| 激情五月影院| 色婷婷综合网站| 婷婷综合中文| 深爱婷婷丁香五月激情| 亚洲AV网站在线观看| 五月激情综合网| 丁香五月综合激情性爱| 99ri在线视频| 久久er99| 丁香五月亚洲激情婷婷射| 性爱综合网| 日韩无码一区二区三区四区| 色婷小说| 九九婷婷网五月天| 天天爽天天摸人妻综合网| 成人网页在线观看| 亚洲五月婷婷| 亚洲欧美另类在线23p| 婷婷刺激综合| 激情综合区| 这里只有视频精品| 苗黎美女四级成人版一级二级毛片| 色五月天在线| 97香蕉人人在线观看| 97色片| 99热思思在线观看| 丁香五月天激情四射网| 中国女人做爰A片| 思思 热 99| 久久9视频欧美| 天天插天天插| 色激情五月| 色五月大香蕉婷婷| 国产精品人成A片一区二区| 天天色官网| 97操碰在线视频| 日本一级一级一级一级| 婷婷99狠狠| 欧美va精品va老师va| 五月婷婷色在线| 九月婷婷色色| 99色最新在线视频网站| 久热91精品| 99久久极情精品一区| 五月在线婷色| www.99日本| AA片在线观看视频在线播放| 久久九九网| 色五月激情基地| 超碰猛烈的性猛交| 色综合99无码| Av大香蕉| 亚洲另类日本| 色五月成人在线| 欧洲综合视频| 超碰国产一区| 26uuu欧美| 激情综合五| 99热精品少| 综合爱久久| 99在线精品视频在线观看| 久久A V无码视频| 婷婷五月综合激情| 91好好热日本在线| 97操碰日本女人| 婷婷丁香五月综合| 在线中文字幕av| 久久五月婷综合网| www超碰| 五月天堂六月丁香亚州中文字幕久久| 成人无码髙潮喷水A片| 少妇性按摩无码中文A片| 99这里只有精品视频免费| 艹B高清无码| 色色操| 九九99久久| 另类五月婷婷| 96丁香六月婷婷蜜桃综合久久| 亚洲中文字幕翔田千里| 小香蕉av| 俺去也五月| 深夜男女福利刺激影院一区完整| 激情第四色| 麻豆123区| 99热九九这里只有精品| 五月丁香婷婷综合久久| 婷婷五月天久久综合88| 五月天开心色色网| 免费无码毛片一区二区A片| 日本色婷婷| 婷婷五月婷婷五月| 亚洲色vA| 高清无码中文字幕aVDV| 五月丁香六月婷婷综合免| 婷婷五月丁香综合| 超碰在线人人| 伊人激情综合网| 五月久久| 激情婷婷网| 久久这里只有精品视频15| CHINESE熟女老女人HD视频| 无码啪啪| 天天搡日日搡aaaaⅩ| 九九视频这里只有精品| 激情综合色播| 欧美婷婷精品激情| 色五月丁香五月| 色永久| 丁香婷婷久久老熟女综合网| www.人人操人人看人人想人人摸 人人人人操,COM | www.狠狠艹| 丁香五月六月久久综合| 五月丁香六月婷婷亚洲天堂网站| 99色在线观看| 色婷婷91激情小说| 在线99热| 超碰在线91| 人妻九九九九| 激情五月天久久丁香| 狠狠人妻色综合| 五月丁香花激情综合网| 久久宗合影| 99欧美三级视频| 91干99| 久久99精品久| 大香蕉人在线65| 91热网址| 久久婷婷激情| 色综久久AV| 深爱五月婷婷开心中文字幕| 婷婷婷色五月| 丁香五月天BBw| 久久色五月天综合网| 人人看人人草人人摸| 五月天婷婷开心| 六月天六月婷| 2025色婷婷| 色五月婷婷亚洲最大| 狠狠干夜夜干| 久久网日本| 久久丁香五月天| 影视av久久久噜噜噜噜噜三级| 天天夜夜爽| 九九久热| 日本色图综合| 亚洲中文字幕网| 9久久精品| 婷婷色五月天在线观看| 色欲一区二区三区精品A片 | 婷婷五月激情视频在线| 日韩在线观看亚洲| 97五月天| 丰滿爆乳一区二区三区| 99五月婷| 久久最新色色色| 天天成人综合| 久热这里只有精品99re| 日韩狠狠色| 五月天婷婷社区| 国产69久久久欧美黑人A片 | 婷婷五月天成人网| CHINESE熟女老女人HD视频| 香蕉久久av一区二区三区| 99视频在线9| 久久久久久久久久久44| 五月天丁香六月综合| 天天在线天天综合网色| 五月成人网站| 色丁香久久| 大香蕉五月婷婷丁香| 六月婷婷青青青视频| 密乳Va| 99欧美| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 丁香五月电影院在线观看| 五月天堂色| tingting五月天亚洲| 久久aaaa片一区二区| 99在线精品视频| 亚洲色网址| 香蕉网婷婷| av线电影| 五月天婷婷色播| www.日日夜夜.com| 日日夜夜狠狠| 99re在线免费视频| 色欲婷婷夜夜| 丁香五月天激情综合| 色综合五月| 九九艹女| 亚洲婷婷视频| 九九热思思| 色婷婷影视| 色综合色香蕉网| 婷婷激情人妻| 99re热视频| 五月天天综合| 91嫩草国产线观看亚洲一区二区| 久99久在线| 日本成人噜噜噜噜噜| 人人干女人| 欧美搡BBBBB摔BBBBB| 亚洲视频1区| 丁香色五月直播| www.成人婷婷综合| 深爱五月婷婷| 中文精品在| 青青草视频福利| 亚洲AV成人在线| 91久女| 丁香5月激情网| 天天久| 婷婷色中文字幕| 婷婷中文字幕在线| 欧美噜一噜| 色婷婷综合久久久久| 久久加勤综合| 日本本土色网第一区| 色五月五月婷婷| 婷婷成人基地| 思思99热这里只有精品| 天天爽天天| 亚洲视频一区| eeuss人妻| 色色色五月婷| 色欧美日| 五月开行婷婷色五月| 26uuu成人网| 久久婷婷五月激情综合| 综合五月激情| 国产真人做爰视频免费| 日本色频| 五月婷婷色综图片| 综合超碰熟| 日本熟妇人妻在线| 97久久精品| 婷婷色综合网日韩国产| 操逼在线视频| 亚洲乱码日产精品BD在线观看| 99九九在线精品热动漫| 日韩aaaaa| 五婷婷综合网| 亚洲五月丁| 丁香五月天综合| 久热丁香| 99热在线播放| 免费在线a| 九九热视频免费观看| 欧美激情五月天| 亚洲六月色婷婷| 99亚州综合精品成人网| 日本A片一区| site:hcxsz888.com| www.色婷婷.com| 九热av| w婷婷五月婷婷w| 天天插天天插| 五月天激情综合网站| 国产 亚洲 在线| 婷婷婷久久久| 先锋资源婷婷| 欧美激情综合色综合啪啪五月| 五月天婷婷7米| 九月性爱网| 国产一级婬片毛片| 免费黄网不卡AV| 婷婷另类开心| 亚洲乱码日产精品BD| 久久狠狠高潮亚洲精品 天天摸夜夜摸夜夜狠狠摸 | 色色色综合| 综合啪啪| 丁香五月五月婷婷| 新99思思视频| 国产精产国品一二三在观看| 日韩av干| 99精品久久久久久| 亚洲最大五月天成人网| 国产欧美大香蕉一区| 色婷婷五月天综合网| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | www,五月丁,com| 九九在线热九九在线热99热| 丁香五月23111| 九九成人电影婷婷| se99视频| 另类激情码| 97干在线观看视频| 超碰人妻在线| 婷婷午夜| 欧美性爱5月天天天看| 狠狠色色色| 伍月婷丁香花全集| 激情婷婷网| 天天操天天插| 五月停亭六月,六月停亭的英语| 丁香六月婷婷开心| 天天天久久久| 被强行糟蹋的女人A片| 婷婷五月天少妇| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 五月天色婷婷网| se婷97| 综合色播| 99爱爱| 99热欧美| 好激情在线综合网| 色婷婷情片| 久久性操| 色婷婷五月基地在线| 久久久天堂国产精品女人| 六月丁香婷婷在线波多| 亚洲人妻电影| 天天爽天天干| 艾小青av| 伊人网啪啪| 97干在线视频| 涩涩五| 97黑人精品区| 婷婷丁香六月| 色五月天综合| 九月婷婷综合在线| 色婷婷综合久久久久| 五月丁香怕怕综合| 99视频日韩| 操逼六区| 五月婷婷丁香大陆免费| 六月婷婷日| 色婷婷a v| 五月天天天综合| 久久婷婷老| 久久思思热| 色噜噜狠狠色综合无码久久欧美| 成人五月天综合网| 中文字幕av在线播放| 色五月开心婷婷| 国产内射婷婷| 色婷婷AAA| 色。 日日日| 六月婷婷五月丁香| 天天做天天爱天天要| 九九婷婷综合| 操老逼综合网| 夜夜资源站| 天天婷婷天天| 九九热精品99| 久久激情中文| 色婷五月天| 婷婷六月久久| 亲子乱AV一区二区三区下载| 丁香婷婷九月在线| 中文字幕永久免费| www.五月天社区| 91久久婷婷| 亚洲正能量欧美| 九九热99视频| 伊人AV五月婷| 丁香五月婷婷五月天在线| 婷婷五月综合免费在线| 亭亭五月丁香五月天激情| 色婷婷综合网站| 丁香六月婷婷综合| 五月深情久久| 风流少妇A片一区二区蜜桃| 五月婷婷激情中文字幕| 99热这里只有精品50| 99久久精品色老| 99天堂在线观看免费视频| 超碰在线人人| 欧美色爱五月天| 在线国产精品色| 色月丁| 亚洲最大成人综合网720P| 精品网站:999WWW| 天插天啪天啪天啪| 天搞天天天天天| www亚洲无码| 99精品成人无码A片观看金桔| 久色| 天天操综合网站| 99热欧美在线观看| 操人久久| 色综合久久88色综合天天| 婷婷操逼| 激情婷婷色色| 日韩啊啊啊| www.五月激情红色| 色狠狠激情五月| 婷婷丁香五月天影院| 精品热九九| 99色热| 99九九在线观看免费| 激情性五月天免费小说视频| 久久国产性爱A V| 婷婷六月啪啪| 天天综合久久| 亚洲成人AV一区在线观看| 99热只有| 色色色综合色| 99re免费精品视频| 亚洲精品在线视频| 高清无码入口| 久草热视频在线观看| 五月婷婷香蕉| 色色成人網| www.久久99| 玖玖在线| 97干视频在线| 情一色一乱一伦一91A| 久久久婷婷五月天| 人与禽A片啪啪| 五月色丁香| 丁香五月天堂网| 久热一本| 婷婷五月激情图片| 五月丁香婷婷色色色| 激情网五月| 人人爱国产| 九九精品视频在线6| 激情黄色五月天| 日日干日日色| 亚洲激情无码久久| 婷婷五月天777| 婷婷五月天最新综合你懂的| 色色综合网站| 色10月婷婷视频| 操97| 色色日韩网| 亚洲精品亚洲人成人网| 婷婷午夜| 丁香六月AV| 免费成人va| 婷婷五月天堂网| 日本色频| 天天搞夜夜六| 五月婷人妻| 婷婷瑟五月天久久综合| 五月丁香婷婷激情在线| www.丁香黄色五月天人与| 五月永久激情| 色婷五月| 日日夜夜天天综合| 99热精品在线在线| 久久与婷婷| 色色丁香婷婷| 久久久久人妻| 久久在线视频免费观看| 免费超碰在线观看| www.久久99精品| 99热超| 91精品综合久久婷婷九色| 婷婷月综合| www.婷婷五月| www.狠狠操.co m| 六月婷婷色五月| 亚洲性爱日韩无码| 激情五月开心五月丁香五月| 国产精品爽爽久久久久久| 综合久久久| www.久久久久| 五月激情小说| 操97在线观看| 综合五月丁香97| 91黄操| 婷婷激情丁香五月天综合| 五月丁香视频在线观看| 人妻精品久久久久久久| 可以直接看的av| 另类精品视频在线观看| www.色五月| 亚洲乱码日产精品BD| 99丁香婷婷综合网| 综合久久久婷| 亚洲激情AV| 成人小说 五月天 婷婷| 五月丁香黄色视频| 99ri国产| 亚洲V国产V欧美V久久久久久| 亚洲欧美成人在线观看| 色婷婷五月天成人网| 一区色色色色网| 亚洲色婷婷网站| 天天操屄网| AV五月丁香| 婷婷午夜| 国产亚洲av片| 婷婷香香五月| 激情婷婷五月基地| 五月天综合久久| 欧美日韩中文国产一区发布| 日韩天堂久久| 天天爱天天做天天日| 亚州视频九九99| 99精品在线观看视频| 五月天婷婷在线观看| 日本二级毛片二级毛片| 天天综合色丁香| 色之综合网| 色色网站在线| 天天干一干| 在线免费观看激情视频| 四色永久成人网站| 丁香激情婷婷网| 原琪琪色影院| 婷婷99视频在线| 色哟哟www| 色婷丨日丨天丨综合久久| 九九無妻| 久久99久久99精品免视看婷婷| 99热伊人综合| 激情五月开心五月在线视频| 99热这里只有精品2| 五月丁香大香蕉| 九久九精品| 九九亚洲视频| 激情五月天在线视频| 亚洲操B| 亚洲无码猫咪| 色狠狠激情五月| 婷婷五月丁香六月| 日本不卡一区二区三区| 久久精品63| 亚洲精品性色| 26uuu精品一区二区| 欧美偷偷操| 丁香五月天激情婷婷丁香六月| 色色色色色综合| 免费无码毛片一区二区A片| 九九热在线99| 五月丁香基地| 狠狠五月天| 欧美色色干| 色欲资源网| 婷婷五月天av| 婷婷伊人五月丁香天堂网| 99久久a线观| 亚洲av日韩无码| 婷婷五月天综合久久日| 国产在线6| www.五月婷婷.com| 婷婷香蕉视频| 5月婷婷性视频| 久久亚洲激情五码| 碰碰人人漕| 五月丁香花激情综合网| 国产高潮A片羞羞视频涩涩| 91婷色| 噜噜色婷婷| 国产午夜精品一区二区三区四区| 91碰碰| 六月婷婷色色色| 婷婷五月另类网站| 狠狠色丁香婷婷综合久久97AV| 日本色婷婷| 欧美色偷拍| 人妻操操色| 久综合网| 开心婷婷中文字慕| 原琪琪色影院| 九九综合网色全集 | 亚洲一个色| 久久总和99| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 国内一级片| 青青草a在线| 婷婷久久综合久| 婷婷五月大香蕉| www五月| 超碰A V在线| 婷婷五月天第四色| 日本色色影片| 99热这里只有精品13| 国产精品电影| 色五月丁香总合网| 婷婷五月天小说| 欧亚洲在线高清视频| 色五月91| 久久久久久激情| 欧洲一区二区| 9久热在线视频精品| 亚洲丁香婷婷丁香五月天激情| 31色区视频免费看| 看国产探花操逼三级片| 久久婷青青草原| 丁香五月在线视频黑人| 五月天久久色| 台湾佬天天日丁香婷婷五月天| 精品少妇人妻AV无码专区偷人| 成人久久天天x资源站| 天天干天天爽| 99色啊| 66色在线日韩| 青青草99热久久精品国| 六月丁香啪啪啪| 日本丁香久在线| 午夜成人综合| 情色婷婷五月天| 五月玖玖| 五月激情丁香五月| 久久精品99| 99热国产这里只有| 色五月情| 天天天摸夜夜夜玩| 丁香五月婷婷国产在线| 玖玖资源站中文| 888久久久| 丁香六月天| 婷婷色九月| 99这里只有| www.99热国产| 婷婷色色网站| 久狠日av| 97五月综合网| 亚洲网视屏| 思思99热热热99| 色婷婷丁香A片区毛片区女人区| 五月综合婷婷网| 色婷婷成人色网| 婷婷精品性视频| 五月丁香激情综合六月涩涩爱| 综合久久综合久久| 色五月丁香五月激情五月激情| 最近中文字幕2019视频1| 五月婷婷免费| www.色色com| 久久久久久久97| 激情五月天在线观看色婷婷| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 激情婷婷视频在线| A片一曲| 天天操夜夜啊| 玖玖91| a久久| 丁香六月开心| 五月天丁香色色| 婷婷五月丁香五月综合网| 婷婷综合亚洲| 成人视频网| 色综合天天天天做夜夜| 激情综合色图| 亚洲精品又粗又大又爽A片 | 五月天婷婷xxx| 666555。COm毛片| 婷婷狠狠操| 免费AAAAA网| 国产毛片精品一区二区色欲黄A片| 深爱激情五月婷婷| 99热偷拍| 色欧美色色色| 26uuu丁香婷婷五月| 色五月婷婷五月丁香五月激情五月视频| 亚洲视频在线网站| 日本99色| 日日干综合| 成人一区在线观看| 激情五月天小说网| 天天插天天插天天插| 9久久久久久久久久久| 无遮挡国产高潮视频免费观看| WWW.婷婷| 欧美在线视频99| 婷婷五月丁香五月基地| 爆乳熟妇一区二区三区爆乳照片| 五月天激情在线视频| 亚洲成Av人片乱码色第1集| 色五月激情五月天| 日日夜夜狠狠干| 91精品久久久久久综合五月天| 综合 激情 婷婷| 色综合久久99色| www.五月激情红色| 99热综合网| 99re欧美精品| 久久精品视频99| 天天草天天日| 色综合激情| www.色欲丁香婷婷| 思思热在线视频精品| 天天爽免费视频| 亚洲美女婷婷五月天| 久久久久五月丁香| 午夜婷婷| 丁香五月最新地址| www.激情五月天com| 超碰人人操在线| 天天综合网~91| 五月婷婷开心网| 天天影院色| 东北婷婷五月天| 色色丁香婷婷| 久热精品9999| 婷婷五月天影院| 五月天激情久久| 综合五月天婷婷色| 激情五月天啪啪视频| 国产无人区大片| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 丁J香六月首页| 九九色精品| 五月天丁香成人社| 成人性爱无码| 五月丁香WWW| 天天搡日日搡aaaaⅩ| 丁香六月综合| 人妻体体内射精一区二区| 久久停停超碰| 开心激情网五月天| 激情 婷婷 丁香五月天| 九九热只有这里精品| 天堂爱啪啪| 9久热在线视频| 精品国产乱码久久久久夜深人妻| 91精品久久久久久| 丁香五月社区| 色色免费网战视频| 五月天婷婷激情干干| 色色色欧美| 超碰97免费在线| 91人人妻人人操人人爽| 欧美性生交XXXXX无码小说| 色播五月| 婷婷射丁香| 五月综合在线| 婷婷五月天激情免费在线观看| 久久99久久99精品免视看婷婷| ww亚洲ww在线观看| 亚洲国产成人在线| 久久大香蕉视频| 青青草原爱爱网| 曰韩五月丁香色婷婷无码| 久久九九99| 色五月婷婷在线| 日本色道视频网站| 中文字幕人妻在线| 无码色| 99性色| 四色AVwww| 伊人婷婷五月天av| va婷婷在线免费观看| 天天草天天舔| 狠狠操天天操| 狠狠色丁香久久久婷| 91viP在线看| 综合99久久| A在线观看| 久久色9| 无码色综合| 无码一级片| 91干网| 五月久久| 五月婷婷色白丝| 久久婷婷六月综合综合| 黄色短视频在线观看| 影音先锋男士资源网一区| 婷婷丁香18| 日碰日| 任你干aa| 91女人18毛片水多国产| 青吴乐视频| 丁香五月天影院| 日本色色视频| 韩国97天堂| OUMEIRIHANCHENGREN| 久久五月婷综合网| www.爱婷婷.com| 大香婷婷| 色吧婷婷| 超碰人人操在线| 色婷婷小说| 国产99热| WWW丁香五月| 开心五月婷婷六月丁香| 五月丁香激情综合六月涩涩爱| 激情婷婷五月黑人| 色五月综合网| 亚洲色激情| 舔色婷婷| 五月婷婷激情性爱| 日日天天干| 超碰人人草| 成人做爰A片免费看视频| 成 人片 黄 色 大 片| seav天堂| wwww.色婷婷| 狠干综合| 日韩超碰在线| 狠狠舔| 丁香婷婷人妻综合网| 99.色| 亚洲第一第二网站| 国产成人高清| 99这里| 久久精品99国产精品日本| 久久婷婷五月综合色丁香花| 日逼影音先锋AV男人资源站| 亚洲色婷婷五月天| 91久久婷婷| 色综合爱综合| 天天爽天天做| 91热视频色网站| 五月丁香五月综合欧美| 欧美搡BBBBB摔BBBBB| 亚洲AV成人一区二区在线观看| 九月丁香欧美综合| 99性视频| 五月天自拍网| 激情欧美丁香五月| 91人妻人人做人碰人人爽九色| 日本欧美成人片AAAA| 99婷婷精品推荐在线视频| 色欲色香综合网站| 亚洲在线综合| 亚洲综合网激情五月天| 天天做天天爱天天综合网| 婷婷射图| 麻豆AV一区二区三区| 色婷婷久久9.com| 色99自拍| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 狠狠五月激情在线| 夜夜做夜夜愛| 思思热久久艹| 无人区码一码二码三码医生系列| 伊人大蕉香| 丁香六月啪啪| www.色五月天.com| 超碰色色综合| 亚洲亚洲人成综合网络| 五月婷免费视频| 色5在线| 色五月丁香伊人五月| 五月丁香婷婷色色| 九久久婷婷| 97操碰视频| RenRenSe在线视频网站| 久操97| 亚洲精品V天堂中文字幕| 99 福利 导航| 丁香五月在线视频| 天天久| 婷婷久久五月| 五月天伊人久久| 99惹在线精品免费观看| 天天摸色吧天天摸色吧| 亚洲免费婷婷| 1024在线视频| 激情深爱综合| 久久五月天婷婷| 97色碰| 色情开心五月| 成人色五月天| 五月天天综合| 婷婷色色综合| www.久久99| 亚洲欧美一区二区三区爱爱动图 | 99久| 久久久人妻不卡| AV五月婷婷露脸| 五月天国产| 伊人9草在线观看| 桃色伊人在线| 丁香六月色婷婷| 五月婷婷先锋| 国产永久一二一起草| 天天日天天舔| 丁香狠狠干| 色色综合网站| 99综合视频| www.色五月| 99自拍视频在线观看| 婷婷五月天男人影院色色网| 泰州成人视频| 日本黄色在线观看| 99久久99热这里只有精品| 综合色播| 99re青青草| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 人人操AV| 激情综合网激情五月婷婷| 久久99久久99久久99人受| 99视频这里只有精品10| 国产精品久久久久久久久久| 婷婷欧美综合| 天天操比比| 激情图片亚洲| 玖玖伦理电影| 久久停停超碰| 97婷婷丁香五月天激情图片| 五月丁香六月婷婷玖玖| 婷婷五月天综合在线| 欧美性爱中文字幕| 狠狠色噜噜| 国产AV一区二区三区最新精品| 另类视频一区| 丁香激情五月| 激情综合另类| 婷婷丁香五月天狠狠| 91精品久久久久久77777| 色婷婷9| 激情小说婷婷| 九九色黄色| 丁香婷婷六月激情综合| 亚洲综合在线视频| 97色婷婷| 超碰成人电影| 99资源在线视频| 婷婷激情小说| 五月天另类小说久久小说网| 五月丁香婷婷综合激情基地| 99热免费| 色五月激情视频在线综合| 日本三级中国三级99| 9久久久| 激情伊人五月天| 五月丁香狠狠爱婷婷综合| 99亚洲大片精品永久在线观看| 日本九九九九| 丁香婷婷激情综合五月激情| 91Chinese在线| 曰曰久久| 91人操| 中文字幕日韩成人| 天天爽天天| 国产综合久久久777777| 九九热在线视频观看| 日本97在线看片| 丁香美女主播视频在线观看| 五婷婷综合网| 99热精品一| 色婷婷激情Av久久久| 很很干五月天| 久久久国产精品黄毛片| 六月色狠狠色| 青柠影视免费高清电视剧| 激情婷婷综合| 中文字幕日产A片在线看| 小视频aaa久久久| 天天干天天拍| 狠狠人人| 亚洲情综合五月天| 九九久久这里只有精品XB| 国产看真人毛片爱做A片| 丁香婷婷人妻综合网| 人妻熟人中文字幕一区二区| 天天爽人人爽| 五月婷婷亚洲天堂97色婷婷| 99爱免费视频| 狠狠色噜噜色狠狠狠综合色| 在线观看中文字幕| 五月婷婷六月丁香玖玖玫瑰91| 99免费在线视频| 色播五月天婷婷老师| 综合久久高清| 亚洲av综合网| 夜夜爽天天爽| 亚洲色婷婷99一9|| 欧美怡红院黄站| 婷婷五月视频| 免费AV在线网址| 大香蕉久久婷婷| 欧美人人操| 这里只有精品久久| 婷婷五月综合欧美在线播放| 美英法精品无码免费视频| 97av在线视频| 婷婷日在线观看| 色婷婷基地 | www.夜夜騎夜夜狠| 色色综合热| 99男人的天堂| 五月丁香亚洲校园欧美| 色婷婷丁香五月| 久热这里只有精品视频6| 青青久久五月天丁香婷婷| 久久天天| 九九Av| 夜夜穞天天穞狠狠穞AV美女按摩| 九九热在这里只有精品| 性爱五月婷| 久久久大香蕉| 思思久ren热| 久久婷婷一级片| 丁香六月婷婷综合缴| 超碰在线精品| 九九在线精品| 五月久久丁香| 久久婷婷久久| 天天操夜夜操| 欧美va亚洲va在线播放| 丁香五月性爱爱五月| 91操人视频| 伊人婷婷激情| 色色色9 9 9| 人人摸人人搞| 婷婷丁香基地在线| 日韩在线一级| 婷婷色影院| 天天爽天天做| 九九热中文| 九九在线热九九在线热99热| 欧美25p| 久久久激情| 九九九九九999999| 超碰人人干| 亚洲第一色色色| 在线不卡的视频| 色婷婷综合网站| 婷婷五月天手机版视频| 六月激情丁香一道本7777| 99视频| 激情五月婷婷老师| 亚洲欧美综合7777色婷婷| 中文字幕免费高清电视剧| 99re6久热只有精品6在线直播| 思思热久久阴99| 日本丰满久久| 婷婷精品| 色综合色综合网| 丁香六月婷婷综合| 色婷婷色综合久久精品V| 五月婷婷熟女| 大香蕉院线| 99精品自拍视频| 天天干天天日蜜臀av| 在线成人网站| 99色在线观看视频| 亚洲区视频| 97午夜一区二区| 另类在线| 婷婷五月天香蕉| 色情五月天小说| 一区中文字幕电影| 五月香婷婷| 丁香五月婷婷网| 五月丁香激情综合网官网| 激情五月综合第一页| 大地9中文在线观看免费高清 | www99热| 丁香六月伊人| 人妻射精AV| 婷婷五月天AV在| 亚洲A片成人无码久久精品青桔| 丁香五月天.com| 色婷婷丁香中文在线播放| 91久久1118| 91丁香色五月| 激情网五月天| 成人电影在线免费试看| 综合深爱五月| 天天玩夜夜操天天爽| 久久影视婷婷五月| 欧美成人猛片AAAAAAA| 色人久久| 五月丁香色六月激情干大屄| 五月天婷婷在线观看精品男人| 六月撸婷婷| 日韩精品在线观看9| www.色婷婷.com| AV在线观看网站| 啄木鸟丝袜美女福利视频| 亚洲视频在线观看99| 色女人久久| 啪啪色激情五月天| 亚洲乱码日产精品BD| 久久婷婷六月综合| 天天日天天摸| 嫩草AV久久伊人妇女超级a| 久久色在线视频| 色婷婷免费视频| 久久久噜噜噜www成人| 色欧美一级| 成人在线视频网| 久久久WWW| 婷婷五月天国产在线播放| 综合色色婷婷| 丁香婷婷综合五月天| 亚洲AV人人操| 丁香五月大香蕉AV| 俺也去在线视频| 米奇影视资源777狠狠色婷婷五月天激情网| 99热综合| 国产五月天婷婷| www久久久久| 色综啪啪| 天天激情站| 精品夜夜澡人妻无码AV| 婷婷伊人五月天| 秋霞成人毛片一级A片| 激情5月婷婷| 婷婷丁香五月天在线| 五月婷婷久久内射| 久久五月丁香伊人青草| 狠狠色综合网| 九色自拍| 噜噜操操| 激情伊人网| 激情五月天第四色| 99婷婷综合| 丁香五月天大香蕉啪啪| 中文字幕免费高清电视剧| 五月激情天| 120分钟婬片免费看| 天干夜夜操| 伊人久久五月天| 99在线视频播放| 在线视频99| 婷婷五月丁香超碰| 丁香六月婷婷综合| 免费视频99| 色欧洲| 婷婷六月综合激情| 啪啪小说五月天| 思思热久热| 99爱在线观看视频| 婷婷五月天狠狠| 深爱激情网五月天| 五月婷婷开心综合| 丁香五月六月激情久久| 亚洲欧州色情在线观看| 日韩人妻操逼视频| www.色五月天.com| 激情网五月婷婷| 色婷视频| 久久人妻人人| 婷婷五月天天爽|