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

ARTICLE DETAIL

資訊詳情

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

Iceberg Java API從入門到實(shí)戰(zhàn):表操作、Schema演進(jìn)與性能調(diào)優(yōu)

Iceberg Java API從入門到實(shí)戰(zhàn):表操作、Schema演進(jìn)與性能調(diào)優(yōu) 1. 為什么非要用Java API操作Iceberg先聊點(diǎn)實(shí)在的。很多人接觸Apache Iceberg是從Spark或者Flink開(kāi)始的一條SQL下去數(shù)據(jù)就寫好了好像根本不需要關(guān)心Iceberg本身。但一旦你脫離大數(shù)據(jù)平臺(tái)自帶的那套封裝比如寫一個(gè)獨(dú)立的數(shù)據(jù)服務(wù)、做在線元數(shù)據(jù)管理、或者做定制化的數(shù)據(jù)入湖程序你遲早要直面Iceberg的Java API。我最初踩進(jìn)這個(gè)坑是因?yàn)槟硞€(gè)數(shù)據(jù)中臺(tái)項(xiàng)目需要把業(yè)務(wù)庫(kù)的增量數(shù)據(jù)實(shí)時(shí)寫入數(shù)據(jù)湖并且要保證寫完之后立刻能被查詢引擎讀到。用Spark Streaming寫是可以但多了一層Spark任務(wù)就多了一份調(diào)度成本和資源開(kāi)銷。后來(lái)改成直接用Java API調(diào)Iceberg的底層寫入接口整個(gè)鏈路輕了很多這才意識(shí)到Iceberg的Java API才是它的真正核心Spark和Flink都只是上層封裝。這篇文章就圍繞Iceberg的Java API從環(huán)境準(zhǔn)備到表創(chuàng)建、數(shù)據(jù)寫入、查詢讀取、Schema演進(jìn)再到實(shí)際開(kāi)發(fā)中那些文檔里根本不會(huì)寫的坑完整過(guò)一遍。適合已經(jīng)對(duì)Iceberg有基本概念、準(zhǔn)備在業(yè)務(wù)系統(tǒng)里直接嵌入Lakehouse能力的開(kāi)發(fā)者。如果你只是想跑個(gè)Demo看完前兩章就能動(dòng)手后面幾章建議收藏等真遇到問(wèn)題了再翻出來(lái)對(duì)號(hào)入座。2. 開(kāi)發(fā)環(huán)境與依賴搭建2.1 從零構(gòu)建最小化Maven工程Iceberg的Java API依賴項(xiàng)并不多但版本匹配是個(gè)容易翻車的地方。先看一個(gè)最基礎(chǔ)的Maven依賴配置properties iceberg.version1.4.3/iceberg.version hadoop.version3.3.6/hadoop.version /properties dependencies !-- Iceberg 核心 API -- dependency groupIdorg.apache.iceberg/groupId artifactIdiceberg-core/artifactId version${iceberg.version}/version /dependency !-- Hadoop 文件系統(tǒng)支持 -- dependency groupIdorg.apache.iceberg/groupId artifactIdiceberg-hadoop/artifactId version${iceberg.version}/version /dependency !-- 可選如果需要訪問(wèn) Hive Metastore 則引入 -- dependency groupIdorg.apache.iceberg/groupId artifactIdiceberg-hive/artifactId version${iceberg.version}/version /dependency !-- Hadoop 客戶端依賴 -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version${hadoop.version}/version /dependency /dependencies這里有個(gè)關(guān)鍵決策點(diǎn)iceberg-core加iceberg-hadoop能覆蓋絕大多數(shù)本地開(kāi)發(fā)和HDFS場(chǎng)景但如果你要對(duì)接Hive Metastore來(lái)做表元數(shù)據(jù)統(tǒng)一管理就必須引入iceberg-hive。一個(gè)常見(jiàn)誤區(qū)是只引入iceberg-core結(jié)果跑起來(lái)報(bào)找不到TableOperations實(shí)現(xiàn)類其實(shí)就是缺少對(duì)應(yīng)Catalog的后端實(shí)現(xiàn)依賴。2.2 Catalog選型背后的邏輯Iceberg里所有操作的起點(diǎn)都是Catalog它決定了表元數(shù)據(jù)存在哪里、怎么被發(fā)現(xiàn)。三種常用Catalog各對(duì)應(yīng)不同場(chǎng)景Catalog類型元數(shù)據(jù)存儲(chǔ)位置典型使用場(chǎng)景關(guān)鍵注意點(diǎn)HadoopCatalog指定文件系統(tǒng)目錄獨(dú)立測(cè)試、本地文件系統(tǒng)不依賴外部服務(wù)最簡(jiǎn)單HiveCatalogHive Metastore生產(chǎn)環(huán)境、與Hive/Spark共用需要Hive Metastore可用RESTCatalog獨(dú)立元數(shù)據(jù)服務(wù)多引擎統(tǒng)一管理、跨集群場(chǎng)景需要額外部署REST服務(wù)我在生產(chǎn)項(xiàng)目里用HiveCatalog比較多因?yàn)楝F(xiàn)有數(shù)據(jù)平臺(tái)已經(jīng)有一套Hive Metastore直接用Catalog統(tǒng)一納管Spark和Flink的表避免各算各的賬。但如果你是做嵌入式集成不想依賴外部服務(wù)HadoopCatalog一個(gè)配置就能跑起來(lái)// 使用 HadoopCatalog 構(gòu)建 Catalog import org.apache.iceberg.hadoop.HadoopCatalog; import org.apache.iceberg.CatalogProperties; MapString, String properties new HashMap(); properties.put(CatalogProperties.WAREHOUSE_LOCATION, /user/iceberg/warehouse); HadoopCatalog catalog new HadoopCatalog(); catalog.initialize(hadoop, properties);注意initialize的第一個(gè)參數(shù)是Catalog名稱在Iceberg 1.4.x里這個(gè)名稱會(huì)體現(xiàn)在元數(shù)據(jù)路徑上雖然不影響功能但建議起得有意義一點(diǎn)避免后面看目錄結(jié)構(gòu)時(shí)一頭霧水。3. 表結(jié)構(gòu)設(shè)計(jì)與表創(chuàng)建3.1 Schema定義時(shí)最常見(jiàn)的三個(gè)坑Schema是Iceberg表的骨架定義方式很直觀但細(xì)節(jié)問(wèn)題不少。一個(gè)完整的示例import org.apache.iceberg.Schema; import org.apache.iceberg.types.Types; Schema schema new Schema( Types.NestedField.required(1, id, Types.LongType.get()), Types.NestedField.required(2, name, Types.StringType.get()), Types.NestedField.optional(3, age, Types.IntegerType.get()), Types.NestedField.optional(4, score, Types.DoubleType.get()), Types.NestedField.required(5, ts, Types.TimestampType.withZone()), Types.NestedField.optional(6, tags, Types.ListType.ofRequired(7, Types.StringType.get())) );第一個(gè)坑字段ID必須全局唯一。很多人習(xí)慣按字段順序?qū)?、2、3但如果后來(lái)刪除了字段新增字段又順手給了重復(fù)IDIceberg的元數(shù)據(jù)會(huì)直接報(bào)錯(cuò)而且這個(gè)報(bào)錯(cuò)發(fā)生在寫入階段表格創(chuàng)建時(shí)反而靜默通過(guò)。建議從一開(kāi)始就預(yù)留ID段位或者干脆用后臺(tái)自動(dòng)生成。第二個(gè)坑Timestamp字段要明確是否帶時(shí)區(qū)。Types.TimestampType.withZone()和withoutZone()在存儲(chǔ)上不一樣如果源頭數(shù)據(jù)是帶時(shí)區(qū)的你不小心定義錯(cuò)了讀出來(lái)的時(shí)候時(shí)間會(huì)差8個(gè)小時(shí)。這個(gè)坑表面上不痛不癢一旦做時(shí)間分區(qū)就會(huì)發(fā)現(xiàn)數(shù)據(jù)全跑偏了。第三個(gè)坑ListType.ofRequired(7, ...)里面的7是嵌套字段的ID不是初始值。這里單獨(dú)強(qiáng)調(diào)一下是因?yàn)槲揖鸵?jiàn)過(guò)有同事把這個(gè)ID理解成“數(shù)組起始長(zhǎng)度”導(dǎo)致ID亂寫最后排查了半天。3.2 分區(qū)策略怎么定才能兼顧查詢和寫入Iceberg的分區(qū)方式和Hive有本質(zhì)區(qū)別。Hive是靜態(tài)分區(qū)目錄寫入前就必須確定分區(qū)值Iceberg是隱藏分區(qū)寫入時(shí)根據(jù)分區(qū)規(guī)則自動(dòng)計(jì)算而且分區(qū)布局可以隨時(shí)改不會(huì)把歷史數(shù)據(jù)推倒重來(lái)。這就給設(shè)計(jì)留下了很大的優(yōu)化空間。來(lái)看一個(gè)按天分區(qū)的建表操作import org.apache.iceberg.PartitionSpec; import org.apache.iceberg.Table; PartitionSpec spec PartitionSpec.builderFor(schema) .day(ts) .build(); Table table catalog.createTable( TableIdentifier.of(db, user_events), schema, spec );這里我實(shí)際踩過(guò)一個(gè)性能相關(guān)的坑。如果業(yè)務(wù)查詢經(jīng)常按小時(shí)過(guò)濾按天分區(qū)就太大了每個(gè)分區(qū)文件數(shù)量會(huì)膨脹查詢時(shí)需要掃描的分區(qū)數(shù)量也偏多。優(yōu)化方式是改成hour(ts)或者用bucket(id, 64)做分桶來(lái)配合高基數(shù)的等值查詢。分區(qū)策略適用場(chǎng)景注意事項(xiàng)day(ts)常規(guī)時(shí)間范圍掃描查詢粒度粗時(shí)文件數(shù)偏多hour(ts)小時(shí)級(jí)時(shí)間過(guò)濾小文件數(shù)量可能增加bucket(id, N)高基數(shù)等值查詢分桶數(shù)不宜過(guò)多否則小文件爆炸truncate(name, len)字符串前綴過(guò)濾低基數(shù)前綴字段效果好從實(shí)際效果看Iceberg的分區(qū)是“按需演進(jìn)”的不需要像Hive那樣一開(kāi)始就想得盡善盡美。一個(gè)穩(wěn)妥做法是先按天分區(qū)跑業(yè)務(wù)等發(fā)現(xiàn)查詢Pattern變化了再通過(guò)table.updateSpec()調(diào)整分區(qū)。這是Iceberg相對(duì)Hive最有價(jià)值的設(shè)計(jì)之一后面Schema演進(jìn)部分會(huì)詳細(xì)展開(kāi)。4. 核心寫入流程與事務(wù)保障4.1 快速上手流式寫入的完整代碼Iceberg 1.4.x提供了Flink和Spark的寫入封裝但純Java API寫入有自己的套路。最直接的方式是使用IcebergGenerics或者直接操作Table實(shí)例。下面演示一個(gè)批量寫入的完整代碼import org.apache.iceberg.data.GenericRecord; import org.apache.iceberg.data.iceberg.IcebergGenerics; import org.apache.iceberg.data.iceberg.IcebergGenerics.WriteBuilder; import org.apache.iceberg.data.iceberg.IcebergGenerics.AppendBuilder; // 構(gòu)造一條記錄 GenericRecord record GenericRecord.create(schema); record.setField(id, 1001L); record.setField(name, alice); record.setField(age, 28); record.setField(score, 95.5d); record.setField(ts, Timestamp.valueOf(2024-05-01 12:30:00)); record.setField(tags, Arrays.asList(dev, test)); // 寫入 AppendBuilder appendBuilder IcebergGenerics.write(table); appendBuilder.records(Collections.singletonList(record)).commit();注意這里的GenericRecord.create(schema)必須和表Schema綁定否則setField時(shí)字段名對(duì)不上會(huì)在序列化階段報(bào)ClassCastException或者字段缺失錯(cuò)誤。另一個(gè)細(xì)節(jié)是commit()才真正觸發(fā)快照生成之前的操作都在內(nèi)存緩沖區(qū)里。如果業(yè)務(wù)需要批量寫入大量數(shù)據(jù)建議攢一批再commit比如每5000條一次提交效率會(huì)好很多。4.2 事務(wù)邊界與快照隔離機(jī)制Iceberg的寫入核心機(jī)制是快照隔離。每次commit()會(huì)生成一個(gè)新快照舊快照不受影響讀寫互不阻塞。這個(gè)設(shè)計(jì)對(duì)并發(fā)控制特別友好但也帶來(lái)一個(gè)很容易忽略的問(wèn)題寫入成功后舊快照仍然占著存儲(chǔ)空間。我這里給出一份快速上手的調(diào)用關(guān)系table.newAppend()追加新數(shù)據(jù)文件不影響已有文件table.newOverwrite()覆蓋指定分區(qū)內(nèi)的數(shù)據(jù)table.newDelete()刪除指定分區(qū)或指定行table.newRewrite()重寫數(shù)據(jù)文件用于合并小文件從實(shí)踐角度講newAppend()是最常用的。它有四個(gè)階段創(chuàng)建Append對(duì)象、添加數(shù)據(jù)文件、添加快照信息、commit()提交。前面三步都在內(nèi)存中完成只有commit()會(huì)觸發(fā)元數(shù)據(jù)寫入。這四步中任何一步失敗整個(gè)提交都會(huì)回滾不會(huì)留下半截狀態(tài)。一個(gè)真實(shí)的業(yè)務(wù)案例某天我準(zhǔn)備給在線服務(wù)做數(shù)據(jù)回流直接調(diào)newAppend()接口把業(yè)務(wù)庫(kù)的數(shù)據(jù)寫入Iceberg表期間正好有另一個(gè)任務(wù)在做數(shù)據(jù)重跑兩邊同時(shí)操作同一批分區(qū)。因?yàn)镮ceberg的樂(lè)觀鎖機(jī)制兩個(gè)任務(wù)都能提交成功但后提交的那個(gè)不會(huì)覆蓋前面寫的內(nèi)容而是追加為新的數(shù)據(jù)文件。最終查詢時(shí)兩個(gè)快照的數(shù)據(jù)都在但邏輯上不沖突因?yàn)闀r(shí)間戳字段不同。這一點(diǎn)比Hive的動(dòng)態(tài)分區(qū)寫入靠譜太多。4.3 寫入性能調(diào)優(yōu)的幾個(gè)參數(shù)Java API寫入的默認(rèn)配置在某些場(chǎng)景下并不理想尤其是小批量高頻寫入。我實(shí)測(cè)過(guò)單條記錄單獨(dú)commit比批量commit慢50倍以上。原因不只是網(wǎng)絡(luò)IO還有每次commit都要更新元數(shù)據(jù)文件、寫入Manifest列表、更新快照信息這一套磁盤操作開(kāi)銷相當(dāng)大。幾個(gè)實(shí)測(cè)有效的調(diào)優(yōu)參數(shù)commit.retry.num-retries提交失敗重試次數(shù)默認(rèn)4次網(wǎng)絡(luò)抖動(dòng)頻繁的系統(tǒng)可以調(diào)大commit.retry.min-wait-ms重試最小等待時(shí)間默認(rèn)100ms可以根據(jù)業(yè)務(wù)容忍度調(diào)commit.manifest.target-size-bytesManifest文件目標(biāo)大小默認(rèn)8MB寫入量大時(shí)可以適當(dāng)增大減少M(fèi)anifest文件數(shù)量write.metadata.metrics.default控制列的統(tǒng)計(jì)信息收集級(jí)別寫頻繁的表建議設(shè)為none或summary減少計(jì)算開(kāi)銷注意write.metadata.metrics.default對(duì)查詢性能有影響如果你后續(xù)要用Iceberg的metadata做列級(jí)統(tǒng)計(jì)過(guò)濾千萬(wàn)別把它關(guān)掉。這個(gè)參數(shù)我一開(kāi)始圖省事設(shè)為none結(jié)果某個(gè)報(bào)表查詢直接慢了3倍后來(lái)才反應(yīng)過(guò)來(lái)統(tǒng)計(jì)信息是謂詞下推的重要依據(jù)。5. 查詢讀取與謂詞下推5.1 數(shù)據(jù)讀取的兩種方式Java API讀取Iceberg表不像JDBC那樣直接給一條SQL就完事而是通過(guò)構(gòu)建Scan對(duì)象來(lái)定義讀哪些文件。核心API就三個(gè)IcebergGenerics.read()、TableScan、DataTask。最直接的是IcebergGenerics方式import org.apache.iceberg.data.iceberg.IcebergGenerics; import org.apache.iceberg.expressions.Expressions; CloseableIterableRecord result IcebergGenerics.read(table) .where(Expressions.greaterThan(ts, 2024-05-01T00:00:00)) .select(id, name, ts) .build(); for (Record record : result) { System.out.println(record.getField(name)); } result.close();注意CloseableIterable必須顯式關(guān)閉否則文件句柄泄漏會(huì)逐漸吃掉JVM的文件描述符。這是個(gè)大坑我見(jiàn)不少開(kāi)發(fā)者最后莫名拋Too many open files追根溯源都是這里沒(méi)關(guān)。5.2 IN、LIKE、空值過(guò)濾的正確姿勢(shì)謂詞下推是Iceberg查詢性能的殺手锏但API用錯(cuò)了反而可能失效。先看幾個(gè)典型寫法// 等值過(guò)濾 Expressions.equal(id, 1001L) // 范圍過(guò)濾 Expressions.greaterThanOrEqual(age, 18) Expressions.lessThan(age, 60) // IN過(guò)濾 Expressions.in(name, alice, bob, carol) // LIKE過(guò)濾 注意通配符大小寫敏感 Expressions.startsWith(name, al) Expressions.endsWith(name, ice) // 空值過(guò)濾 Expressions.isNull(age) Expressions.notNull(age)這里有一個(gè)和生產(chǎn)環(huán)境強(qiáng)相關(guān)的細(xì)節(jié)Expressions.startsWith和SQL里的LIKE al%等價(jià)但是Iceberg的實(shí)現(xiàn)是基于字典編碼的大小寫敏感。如果業(yè)務(wù)數(shù)據(jù)大小寫不敏感容易導(dǎo)致過(guò)濾結(jié)果不正確。實(shí)際調(diào)優(yōu)中我還發(fā)現(xiàn)or條件組合謂詞會(huì)讓Iceberg的元數(shù)據(jù)過(guò)濾效率大打折扣。如果用Expressions.or()把多個(gè)條件混在一起Iceberg會(huì)有部分情況退化為“對(duì)每個(gè)文件做全量過(guò)濾”這時(shí)候不如把表分區(qū)設(shè)計(jì)得更貼合查詢條件讓分區(qū)裁剪直接命中。5.3 通過(guò)快照時(shí)間讀取歷史數(shù)據(jù)Iceberg的快照機(jī)制天然支持時(shí)間旅行Java API里實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單long snapshotId table.currentSnapshot().snapshotId(); // 讀取指定快照 CloseableIterableRecord result IcebergGenerics.read(table) .useSnapshot(snapshotId) .build(); // 按時(shí)間點(diǎn)讀取 long asOfTimestamp System.currentTimeMillis() - 24 * 3600 * 1000L; CloseableIterableRecord historyResult IcebergGenerics.read(table) .asOfTime(asOfTimestamp) .build();這個(gè)能力做數(shù)據(jù)回滾和數(shù)據(jù)審計(jì)都非常實(shí)用。比如業(yè)務(wù)方發(fā)現(xiàn)某個(gè)批量任務(wù)把數(shù)據(jù)寫壞了你直接把讀取時(shí)間點(diǎn)改到寫壞之前就能快速恢復(fù)出干凈數(shù)據(jù)不用從備份重新灌一遍。不過(guò)要注意時(shí)間旅行依賴快照文件的保留策略如果元數(shù)據(jù)被expireSnapshots()清理掉了歷史查詢一樣會(huì)失敗。6. Schema演進(jìn)線上改表結(jié)構(gòu)的正確姿勢(shì)6.1 新增列、修改類型、重命名示例Iceberg支持在線修改表結(jié)構(gòu)而且不需要重寫數(shù)據(jù)文件這是很多傳統(tǒng)數(shù)倉(cāng)做不到的。Java API修改Schema的代碼非常直觀// 新增一個(gè)字段 table.updateSchema() .addColumn(email, Types.StringType.get()) .commit(); // 修改字段類型僅支持向兼容方向擴(kuò)展 table.updateSchema() .updateColumn(age, Types.LongType.get()) .commit(); // 重命名字段 table.updateSchema() .renameColumn(name, user_name) .commit();注意字段id在新增列時(shí)會(huì)自動(dòng)分配不需要人工管理但updateColumn只能做類型拓寬。比如IntegerType改成LongType是允許的反過(guò)來(lái)就不行。因?yàn)镮ceberg底層Parquet文件里存的是整數(shù)精度改成Long只是讀出來(lái)做轉(zhuǎn)換反過(guò)來(lái)精度會(huì)丟失。從實(shí)踐角度講我一直建議生產(chǎn)環(huán)境盡量不要做“破壞ACID”的字段變更比如刪除字段再重新加。雖然Iceberg支持deleteColumn但刪除后舊文件的元數(shù)據(jù)里仍然存在該字段只是查詢時(shí)被忽略如果不小心重名新增字段可能產(chǎn)生意想不到的兼容問(wèn)題。6.2 分區(qū)字段變更的演進(jìn)策略分區(qū)策略變更在Iceberg里是“平滑”的因?yàn)樾聰?shù)據(jù)按新規(guī)則分區(qū)舊數(shù)據(jù)按舊規(guī)則保留查詢引擎會(huì)自動(dòng)合并不同分區(qū)元數(shù)據(jù)table.updateSpec() .removeField(day(ts)) .addField(bucket(id, 32)) .commit();執(zhí)行這條代碼后后續(xù)寫入會(huì)按bucket(id, 32)分區(qū)舊數(shù)據(jù)依然按day(ts)存儲(chǔ)。查詢時(shí)Iceberg會(huì)從兩個(gè)分區(qū)規(guī)則各自掃描數(shù)據(jù)文件再合并結(jié)果。這個(gè)機(jī)制解決了傳統(tǒng)數(shù)倉(cāng)改分區(qū)必須重寫數(shù)據(jù)的問(wèn)題。但要注意分區(qū)規(guī)則變化會(huì)直接增加Manifest元數(shù)據(jù)復(fù)雜度。我遇到過(guò)一個(gè)場(chǎng)景某張表先后改過(guò)三次分區(qū)策略結(jié)果一條簡(jiǎn)單的查詢要掃描四五個(gè)Manifest文件性能反而下降了。解決辦法是用RewriteManifests合并文件或者定期清理歷史快照降低元數(shù)據(jù)膨脹壓力。7. 元數(shù)據(jù)管理、快照清理與文件合并7.1 如何安全地清理過(guò)期快照Iceberg每commit一次就會(huì)生成一個(gè)快照快照數(shù)量一多元數(shù)據(jù)文件就跟著膨脹。默認(rèn)情況下快照會(huì)保留很長(zhǎng)時(shí)間如果不手動(dòng)清理一個(gè)高頻寫入的表甚至可能產(chǎn)生幾千個(gè)快照文件。清理代碼如下import org.apache.iceberg.util.SnapshotUtil; table.expireSnapshots() .expireOlderThan(System.currentTimeMillis() - 7 * 24 * 3600 * 1000L) .retainLast(10) .commit();這里兩個(gè)條件要一起用expireOlderThan按時(shí)間清理retainLast保證至少保留最近N個(gè)快照。只設(shè)時(shí)間不設(shè)數(shù)量有可能在低頻寫入場(chǎng)景下一個(gè)快照都清不掉只設(shè)數(shù)量不設(shè)時(shí)間又可能把業(yè)務(wù)需要的時(shí)間旅行數(shù)據(jù)刪掉。兩個(gè)條件配合使用才是最穩(wěn)妥的方案。7.2 小文件合并的完整執(zhí)行流程小文件問(wèn)題是數(shù)據(jù)湖最常見(jiàn)的性能殺手。Java API合并小文件的入口是RewriteDataFilestable.rewriteDataFiles() .targetFileSizeBytes(128 * 1024 * 1024L) // 目標(biāo)文件大小128MB .rewriteIf(file_size_bytes 32 * 1024 * 1024L) .maxParallelism(4) .commit();實(shí)測(cè)經(jīng)驗(yàn)是目標(biāo)文件大小要結(jié)合查詢模式來(lái)定。純OLAP場(chǎng)景128MB是合理的但如果這個(gè)表還要被高頻的在線服務(wù)讀取文件太大反而降低點(diǎn)查性能。我一般建議先設(shè)置64MB跑一輪觀察查詢耗時(shí)變化再?zèng)Q定要不要調(diào)大。合并操作會(huì)占用不少臨時(shí)存儲(chǔ)和CPU資源建議在業(yè)務(wù)低峰期執(zhí)行并且加上maxParallelism限制并發(fā)度防止把整個(gè)集群的IO吃滿。7.3 并發(fā)寫入時(shí)的沖突處理生產(chǎn)環(huán)境最怕的就是兩個(gè)任務(wù)同時(shí)寫同一張表數(shù)據(jù)還沒(méi)沖突元數(shù)據(jù)先沖突了。Iceberg的樂(lè)觀并發(fā)機(jī)制允許提交時(shí)沖突然后通過(guò)重試解決import org.apache.iceberg.exceptions.CommitFailedException; try { table.newAppend() .appendFile(dataFile) .commit(); } catch (CommitFailedException e) { // 說(shuō)明有并發(fā)寫入需要重試 // 實(shí)際業(yè)務(wù)里建議這里重新加載最新的表元數(shù)據(jù)后再嘗試 }如果重試次數(shù)超過(guò)閾值還失敗一般是兩個(gè)寫入任務(wù)在改同一個(gè)分區(qū)下的數(shù)據(jù)文件這時(shí)候要檢查業(yè)務(wù)上是否真的重疊。真的重疊那就得用Overwrite配合條件表達(dá)式來(lái)保證冪等性。8. 配套工具與運(yùn)維經(jīng)驗(yàn)8.1 用Java API做數(shù)據(jù)質(zhì)量校驗(yàn)Iceberg的Java API除了讀寫表還能做數(shù)據(jù)體檢。比如統(tǒng)計(jì)某張表的文件數(shù)、總大小、小文件比例import org.apache.iceberg.TableScan; TableScan scan table.newScan(); long fileCount 0; long totalSize 0; for (FileScanTask task : scan.planFiles()) { fileCount; totalSize task.file().fileSizeInBytes(); } System.out.println(文件數(shù): fileCount , 總大小: totalSize);這個(gè)統(tǒng)計(jì)在生產(chǎn)運(yùn)維里很有用。我每次做大版本上線前都會(huì)跑一遍這個(gè)掃描看看有沒(méi)有不正常的文件膨脹趨勢(shì)提前發(fā)現(xiàn)問(wèn)題。8.2 生產(chǎn)環(huán)境配置清單速查結(jié)合多次實(shí)戰(zhàn)我整理了一份相對(duì)穩(wěn)妥的生產(chǎn)環(huán)境配置參考配置項(xiàng)推薦值用途commit.retry.num-retries10提高并行提交成功率commit.retry.min-wait-ms200給沖突恢復(fù)留出時(shí)間write.metadata.metrics.defaultfull保證謂詞下推有效write.target-file-size-bytes134217728控制目標(biāo)文件大小history.expire.max-snapshot-age-ms604800000自動(dòng)清理快照以上配置可在建表時(shí)傳入也可通過(guò)table.updateProperties()動(dòng)態(tài)調(diào)整。有一點(diǎn)要提醒別一上來(lái)就追求極致參數(shù)調(diào)優(yōu)先把默認(rèn)配置跑通再根據(jù)監(jiān)控?cái)?shù)據(jù)局部調(diào)整效果反而更好。9. 高頻踩坑來(lái)自真實(shí)開(kāi)發(fā)一線的排錯(cuò)實(shí)錄9.1 元數(shù)據(jù)文件找不到這是我在接入初期遇到最多的報(bào)錯(cuò)核心癥狀是NoSuchFileException或者M(jìn)anifestFileNotFoundException。通常不是文件真的沒(méi)了而是元數(shù)據(jù)緩存過(guò)期。排查方向檢查寫入和讀取用的Catalog是否指向同一個(gè)warehouse路徑檢查是否操作了不同Catalog類型比如寫入用HadoopCatalog讀取用HiveCatalog檢查是否存在多個(gè)進(jìn)程同時(shí)清理快照導(dǎo)致某個(gè)進(jìn)程拿著過(guò)期快照ID去讀文件日常最好的預(yù)防辦法是在程序啟動(dòng)時(shí)統(tǒng)一使用同一個(gè)Catalog實(shí)例或者至少保證配置一致。9.2 Schema字段錯(cuò)位問(wèn)題使用GenericRecord方式寫入時(shí)如果Schema定義和記錄字段順序不一致Iceberg不會(huì)報(bào)錯(cuò)但數(shù)據(jù)會(huì)寫錯(cuò)列。這個(gè)問(wèn)題隱蔽性極強(qiáng)因?yàn)樽x出來(lái)的時(shí)候也不會(huì)報(bào)錯(cuò)。排查方法很簡(jiǎn)單把寫進(jìn)去的樣例數(shù)據(jù)原樣打印出來(lái)肉眼對(duì)比看是否錯(cuò)位。不過(guò)更推薦的是在建表時(shí)就把字段ID定義好然后寫入代碼里始終通過(guò)字段名setField而不是按下標(biāo)設(shè)置。9.3 小文件數(shù)量失控寫入頻率高、分區(qū)粒度過(guò)細(xì)都會(huì)導(dǎo)致小文件爆炸。我見(jiàn)過(guò)一張表分區(qū)字段是分鐘級(jí)時(shí)間列結(jié)果每小時(shí)生成上萬(wàn)個(gè)文件查詢性能直線下降。解決辦法有兩條路一是調(diào)大寫入批次降低commit頻率二是周期性跑rewriteDataFiles()合并小文件。兩者建議同時(shí)做前者治標(biāo)后者治本。9.4 常見(jiàn)問(wèn)題速查表現(xiàn)象可能原因解決方案寫入報(bào)CommitFailedException并發(fā)寫沖突捕獲異常后重試查詢報(bào)了FileNotFound快照過(guò)期或路徑變更檢查快照策略和warehouse配置寫進(jìn)去查不到Catalog不一致統(tǒng)一Catalog配置數(shù)據(jù)列錯(cuò)亂Schema字段順序不一致嚴(yán)格用字段名操作Manifest文件過(guò)多提交頻繁調(diào)大commit.manifest.target-size-bytes查詢很慢但文件數(shù)不多統(tǒng)計(jì)信息關(guān)閉檢查write.metadata.metrics.default配置10. 關(guān)于Java API的高級(jí)用法與后續(xù)擴(kuò)展10.1 自定義寫入器的實(shí)現(xiàn)思路如果對(duì)寫入性能有極致要求或者在寫之前需要做復(fù)雜的數(shù)據(jù)清洗可以考慮自定義FileAppenderFactory。Java API暴露了DataWriter和DataReader接口這意味著你可以在寫入前做數(shù)據(jù)轉(zhuǎn)換、按目標(biāo)文件大小切分、甚至自定義文件格式的數(shù)據(jù)打包邏輯。不過(guò)這里要提醒一句普通業(yè)務(wù)用IcebergGenerics或Table.newAppend()就夠了自定義DataWriter是給二次開(kāi)發(fā)框架用的殺雞用牛刀反而增加維護(hù)成本。10.2 與其他組件集成的經(jīng)驗(yàn)把Iceberg Java API集成到Spring Boot服務(wù)里是完全可行的而且可以做到很輕量。建議使用Configuration來(lái)創(chuàng)建全局的Catalog和Table管理對(duì)象而不是每次操作時(shí)臨時(shí)創(chuàng)建這樣可以復(fù)用連接池配置和元數(shù)據(jù)緩存。另一個(gè)注意點(diǎn)是線程安全。Iceberg的Table對(duì)象在并發(fā)讀寫上是線程安全的嗎實(shí)測(cè)結(jié)果是讀取階段安全寫入提交階段因?yàn)橛袠?lè)觀鎖機(jī)制大多也能并發(fā)提交但如果你在同一線程里同時(shí)維護(hù)多個(gè)Append操作容易出現(xiàn)不可預(yù)期的狀態(tài)。建議一個(gè)事務(wù)對(duì)應(yīng)一個(gè)獨(dú)立對(duì)象不要跨線程共享未提交的寫入上下文。11. 基于Java API的實(shí)戰(zhàn)總結(jié)與個(gè)人心得做了一年多的Iceberg Java API開(kāi)發(fā)個(gè)人最大的體會(huì)是這個(gè)API設(shè)計(jì)得很講究但學(xué)習(xí)曲線確實(shí)陡。好處是它把表的讀寫、元數(shù)據(jù)管理、Schema演進(jìn)全部統(tǒng)一成一個(gè)事務(wù)模型不用像以前那樣同時(shí)維護(hù)幾十張Hive表結(jié)構(gòu)腳本。如果你正準(zhǔn)備上手我的建議是先用HadoopCatalog加本地文件系統(tǒng)把讀寫流程跑通別一上來(lái)就上HiveMetastore加分布式集群。等理解了快照、Manifest文件這些核心概念再遷移到生產(chǎn)環(huán)境會(huì)順很多。最后再分享一個(gè)實(shí)際工作中特別受益的小技巧所有提交操作無(wú)論時(shí)Append、Overwrite還是Schema更新都在外層包一個(gè)統(tǒng)一的重試工具類每次提交捕獲CommitFailedException后按指數(shù)退避重試。這個(gè)工具類我寫完之后幾乎所有并發(fā)沖突問(wèn)題都自動(dòng)消失了省去了大量手工排查時(shí)間。如果你后續(xù)還要做更復(fù)雜的事情比如跨集群復(fù)制、數(shù)據(jù)湖增量讀取Iceberg的Java API都會(huì)給你足夠的底子。多花點(diǎn)時(shí)間把這篇文章里的示例代碼跑一遍你會(huì)對(duì)Iceberg的工作機(jī)制有完全不一樣的理解。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.玖玖婷婷在线| 天天色综合天天| 五月激情婷婷在线| 五月丁香va| 伊人超碰在线| 午夜69成人做爰视频| 久久久五月婷婷| 精品人妻在线| 9色在线视频精品观看| AV电影在线播放| 99热这里有精品24| 久色视频在线| 99精品在线| 成人在线观看国产| 色婷婷成人做爰A片免费看网站 | www.久久久久久| 女人高潮内射99精品| 日日噜狠狠色综合久| 五月天社区| 91在线97视频| 日本91在线播放| 免费看成人747474九号视频在线观看| 久久综合丁香激情五月| 热99热9| 97婷婷狠狠| 亚洲熟妇AV乱码在线观看| 丁香六月狠狠干| 99热这里只有精品搜| 97干在线视频| 婷婷久久五月天| 综合色视频| 色色综合网www| 国产肥白大熟妇BBBB视频| 综合网激情| 六月婷婷网站| 色情综合网| 日本在线免费中文com.| 五月丁香五月激情综合色综合| 99热99色| 五月情综合| 任你草| 色噜噜五月天| 中文字幕在线日亚州9| 国内久久亭亭| 狠狠综合网| 99日本视频| 七七色综合| 丝袜熟女一区二区三区| 七七色色综合| 91热爆在线| 丁香五月首页| 丁香激情五月综合网| 五月丁香精品| 色国产五月| 777.色色| www.丁香六月婷婷久久天堂影院.con| 九九视频在线观看视频6 | 夜夜谢天天干| 91丨九色丨首页| 激情五月成年| 色五月激情综合| 激情丁香九九五月综合网| 丁香五月天婷婷91| 五月婷婷激情综合在线| 第四色婷婷色五月| 五月天天天天天天天天天天天婷婷婷| 狠狠干无码| 人人干人人看| 婷婷五月综合色小姐小说| 教师性爱毛片| 棕合影院色色| 99精品久久久久久久婷婷久久| 99aese| 99视频这里只有久久精品| 深爱激情六月| 狠狠干无码| 婷婷在线视频| 国产午夜精品一区二区| 婷婷成人在线| 999久久久国产精品| 爽天天天天天天天| 精品一二三区久久AAA片| 国产精产国品一二三在观看| 婷婷综合在线播放| 色插综合网| www激情com| 99re热在线视频观看| 色婷五月| www.一起草av| 午夜不卡成人一区二区| 丁香五月婷婷99| 五月天停停日日| 99色婷婷视频| 色播五月| 激情五月丁香五月色| 六月丁香AV| 超碰超碰在线| 啪啪小说五月天| 五月婷婷啪| 久久99国产综合精品免费| 亚洲成人AV在线| 玖热精品综合视频| 九色91国产| 69精品人人人人| 久久狠婷婷| 婷婷五月天改成什么了| 色婷婷丁香五月天| 在线视频激情网站| 久久色五月天综合网| 色婷婷亚洲| 亚洲AV成人无码精品| 9热精品| 狠狠色五月激情| 天天操综合网站| 99操视频| 婷婷色情网| 久久五月丁香综合17C| 91丨九色丨白浆| 中日韩美欧成人一区二区精品在线| 五月丁香五月丁香五月丁香五月丁香91| 色婷婷五月影视| 99热a片免| 被强行糟蹋的女人A片| 婷婷中文无码| 综合五月婷婷| 伊人久久五月天| 黄色AAAAA| A久久| 97操在线视频| 丁香桃色网| 好色婷婷| 超碰在线视屏| 大香蕉久久| 五月天丁香综合久久国产| 日本3级片一区2区| 婷婷五月天视| 久热91| 色情五月丁香| a在线观看| 丁香五月亚综合图片| AV色婷婷| 97人人做| 99热在线观看| 午夜成人天堂久久无码日韩久久| 99热这里只有精品99| 天天干,天天日| 激情四射五月天| 激情五月婷婷丁香| 亚洲乱码在线观看| 五月丁香综合激情网| 五月天婷综合| 大香蕉综合在线| Aα在线免费观看| 久热A| 99综合97| 婷婷网五月天| 五月天综合网| 免看黄大片AA | 婷婷五月天激情综合| 色婷婷小说| 色噜噜五月天| 激情五月天婷婷| 五月丁香六月在线欧美| 色狠狠色噜噜AV天堂五区| 色婷婷五月六月丁香综合视频| 五月婷婷六月丁香| 五月天久久www| 亚洲AV久久久久久久久久久久久久久久 | www.henhengan| 黄色成人AV在线| 五月婷婷激情综合视频| 97伊人综合婷婷| 激情www| 伊人玖玖网| 99久久这里只有精品| 中日韩狠狠色| 久久草大香蕉| 色五月婷婷一二| 天堂网色色| 亚洲婷婷91丁香| 国产一级片| 99视频只有精品| 色五月色综合| 五月丁香婷婷色色色| 丁香五月天堂网| 丁香六月激情综合网| 日韩无码AV电影网站| 色永久| 丁香五月综合激情性爱| AA片在线观看视频在线播放| 极品另类| 九九婷婷五月天影视| 五月天开心色色网| 婷婷五月天堂| 天天精品视频免费观看| 五月天激情婷婷五月天久久| 日本久热| www.9色色色| 996er热| 操操操av| 久久婷婷色色| 色色色五月| 操碰97| 久久婷婷五月草视频| 婷婷色中文| 亚洲视频在线观看| 婷婷操逼| 日本三久久| 五月婷婷丁香大陆免费| 超碰人人色| 久久桃花网色婷婷| www.激情| 亚洲色网址| 丁香 婷婷 亚洲 熟女| 激情久久久| 婷婷丁香黄色| 无码视频国内精品久久久| 日本狠狠色| tingtingzonghewang| www99久久| 五月婷婷很很色| 色五月首页| 蜜乳中文字| 五月丁香大香蕉| 丁香婷婷AV| 婷婷综合网| 这里有精品| 天天久久综合| 色五月aV| 狠狠狠狠狠狠草| 97热这里精品在线视频| 99re热在线观看| 国产毛片操B| 99热官网| 97色色婷婷| 婷婷欧美综合| 日本一级特黄大片AAAAA级| 婷婷婷五月天最新综合你懂的| 91精品久久久久久77777| 色欲色香,www,com| 综合久久综合综合| 丁香五月婷婷婷桃花影院| 午夜不卡久久精品无码免费| www,婷婷,com| 亚洲精级| 亚洲超级碰| 久久丁香婷婷色情综合| 毛片蕉地一二| 婷婷激情四射五月天| 久久免费少妇高潮99精品| 六月丁香啪啪| 成人做爰黄A片免费看直播室男男| 色色色99| 乱精品一区字幕二区| 色吧五月| 天天干天天日蜜臀av| 色伦专区97中文字幕| 日本狠狠干| 久久99精品视频| 欧美一级色| 成人在线精品| 99热伊人| 六月丁香婷婷爱| 精品国产a| 五月丁香在线观看国产| 欧美日本高清视频99| 变态另类色图 | 激情五月成年| 99久高清视频| 久久婷婷激情| 五月天综合区| 激情婷婷六月天| 深爱五月激情五月| 九九久久精品| 亚洲婷婷性爱| 欧美日韩成人免费在线| 99热在这里只有免费精品| 天天插综合在线| 超碰AAAAAAV| 五月天婷婷黄色| 国产亚洲精久久久久| 99热都是精品| 另类小说色婷婷| 99国产精品久久久久久久久久久 | 丁香六月在线| Aaa久久| 97久久久免费福利网址| 久久视这里只有精品| 草操AV在线| 99热12| 伊人婷婷色| 97狠狠色| 日韩有码一区| 国产99精品免费视频| 五月丁香久久久| av狠狠操| 欧美成人AAA片一区国产精品| www.夜夜爱.com| 五月丁香久人妻中文| 热热久久精品视频| 九九在线精品| 日本综合九九| 婷婷五月天激情文学小说| 日逼免费视频| 激情五月综合婷婷| 激情久久网| 99ri视频| 99视频35精品视频在线观看| 国产性爱大片久久| 日日色五月天| 色五月丁香五月| 人人色人人弄人人操| 四月婷婷五月丁香| 九九精品视频在线6| 熟女网站久久| 欧美日韩五月婷婷| 午夜婷婷六月天| 婷婷综合五月天| 人妻内射一区二区在线视频| 欧美内射AA| 这里只有精品免费观看网占| 另类少妇人与禽zOZZ0性伦| 91丁香| 婷婷五月天,影院| 天天爽天天爽| 99啪在线视频| 思思热99在线视频| 无码 av电影| 色九月婷婷| 日韩视频99| 无码免费人妻A片AAA毛片西瓜| 99久久婷婷五月综合| 丁香丝袜五月| 丁香五月大香蕉在线99| 六月丁香综合999| 97色碰| 99色在线观看视频| 九九热免费视频| 久久这里只有精品视频15| 另类五月婷婷| 狼人久草| 一个色的综合| 99色色| 日本高清久久| 99热8| 五月色婷婷影院| 夜夜夜夜夜骑撸| 激情五月婷婷综合秋霞| 五月婷婷手机在线| 久热精彩视频98| 国产精品激情五月天色婷婷| 欧美,日韩成人在线| 青青热久久综合| 深爱五月天| 亚洲天堂久久| 99热这里只有精品8| 日本a片网址| 九九色热| 婷婷五月综合婷婷| 亚洲乱码日产精品BD| 99在线观看精彩视频| 思思热在线精品视频| 久久免费9| 九九这里是免费的视频5| 97色97干| 日本九九九九| 日日操,夜夜撸| 99热香港| 精品99在线| 超碰在线观看9| 九九久久99精品免费观看www| 国产99久9在线| 人人视频人人干人人做| av色婷婷| 亚洲A片成人无码久久精品青桔| 久久精品国产色| 亚洲综合色网| 丁香五月婷久久| 美国天天操无码| 色五月五月婷婷| 97干视频在线| 国产亚洲精品AAAAAAA片| 南京搡BBBB搡BBBB| 91综合网| 九九精品热| 天天色天天爱天天舔| 色五月婷婷成人| 五月 婷婷 成人| 在线99色| 99精品国产在热久久| 天天夜天天色天天| 丁香五月香蕉| 色婷婷色综合久久精品V| 天天天天爽爽天干| 99婷婷| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 婷婷开心五月| 久久只有这里精品免费| 九九热9| 色色综合激情| 欧美综合在线五月天色婷婷| 超碰97干| 人五月天婷婷喷水| 久久激情网| 久久久久99精品成人片| 日本一道久久| 日本道久久91| 99热久久这里只有精品| 91干在线| 色丁香婷婷| www.91操| 日本三日本三级少妇三级66| 五月色综合| 久久奄也去色色网站| 国产干逼片| 97人人超| EEUSS鲁片一区二区三区| 久久综合网免费视频| 五月丁香亚州综合网| 色婷婷久久综合| 婷婷五月天深爱| www.五月婷婷.com| 日韩AV成人电影| 激情开心五月天| 五月丁香婷婷成人网| 五月丁香婷婷色| 免费操超碰| 国产肥白大熟妇BBBB视频| 99在线小视频| 激情五月婷婷丁香综合网| 婷婷五月天色色| 秋霞少妇毛片| 97婷婷五月丁香| 色色色色综合网| 免费视频无码| 色婷婷久久综合久色综| 开心婷婷五月中文字幕组| 亚洲色色色色色| 五月婷婷丁香啪啪| 五月天停婷基地| 五月天婷婷婷| 国产婷婷婷| 天天干天天干天天干| 欧美 日韩 成人 在线| 婷婷丁香基地在线| 人人干人人操人人摸人人做| www.婷婷五月天啪啪| 综合AV在线| 九九综舍久久| 亚洲人妻Av| 亚洲色基地| 久久33视频| www.91.com黄| 久久久久久99精品无码| 人人干女人| 性色综合网| 大香蕉丁香五月| 三十熟女| 国内自拍97在线| 日日噜噜夜夜狠狠久久丁香五月| 久久色六月| 亚洲中文字幕在线观看| 天天干一干| 成人综合网站| 五月婷A V在线| 1024操逼| 91丁香色五月| 激情宗合 激情宗合| 丁香五月综合激情久久潮喷| 久久网婷婷| 欧美色色日韩| 51成人| 色婷婷综合网| 婷婷五月丁香综合激情小说| 婷婷五月天熟妇| 五月丁香六月合| 天天综合干| 思思热再线视频| 五月天黄色激情小说| 天天天天爽爽天干| 97碰碰视频| 天天操无码| 懂色av蜜臀av粉嫩av永陈冠希| 超碰cap| www.久操| www久| 在线区区区| 色插综合网| av网站中文| 五月丁香激情综合久久| 亚洲精品婷婷| 欧美A A A A A| 日韩精品电影| 激情四射五月天偷偷看婷婷| 狠狠色 综合色区| 99爱在线精品视频免费观看| 亚洲九区| 久久久久久久久久久久久久久久一道本| 狠狠狠狠草草| 91精品91久久久中77777| 激情婷婷五月天网址| 日韩综合大黄| 性一交一乱一交A片久久四色| 99综合视频| 五月天婷婷青青草| 欧美婷婷| 五月婷婷激情久久| 五月色网| 91丁香婷婷综合资源| 欧美乱码国产一级A片| 综合久久综合| 婷婷99狠| wuyuedingxiang99| 色婷婷电影网| 亚洲亚洲人成综合网络| 91成人看片| 激情婷婷丁香五月| 亚洲成人免费在线| 六月丁香婷婷大香蕉| 久久男人网婷婷| 天天插天天射| 激情四射婷婷色色色| 亚洲婷婷五月天综合| 亚洲AV成人无码久久精品老人法拉利| 婷婷色色五月天| 婷婷香蕉香| 久久99精品九九久久久婷婷| 开心五月深爱五月丁香五月激情五月| 天天日日夜夜| 亚洲情色一区| 人妻操逼视频| 大香蕉伊人丁香五月| 色综合婷婷| 啪到高潮激情丁香五月| 成人综合网站| 操操操操操操婷婷五月天| 六月丁AV| 五月丁小婷婷激情四射| 日本va网站| 538任你爽| 久久无意婷婷| 久热播这里只有精品| 人妻久久久| 手机旧版看人妻1025| 综合网五月天123| 成人av免费观看| 成人午夜免费电影| 天天综合中文| 黄色AAAA韩国guochansanji| 久久只这里有精品| 亚洲无AV在线中文字幕| 人人爱干人人爱草| 99色视频在线| 久久永久网址| 99人人干| 蜜臀A∨在线水帘洞| 亚洲综合婷婷| 日韩色五月| 人人摸人人| 玖玖婷婷五月天毛片| 五月婷婷成人网首页| 婷婷基地爱| 综合色色网| 色婷婷9| 婷婷综合视频| 丁香五月色情| 狠狠五月激情在线| 被男人添B超爽视频| 第2色五月婷| 亚洲综合另类| 天天色天天干天天插| 色婷婷六月| 99这里只有精品国产| 二色av| 另类综合激情| 亚洲免费综合一区| 激情五月天开心总和网| 美欧成人视频| 五月天婷婷在线AN| 五月婷婷丁香伦理网| 99ER热精品视频| 久久99最新| 久久久国产精品黄毛片| 99热这里只有精品搜| 人操91在线| 深爱五月天| 成人亚洲精品| 国产毛片欧美毛片久久久| 色欲五月天| 高清a片基地| 色五月激情| 综合色影| 噼里啪啦在线观看免费完整版视频 | 亚洲色激情| 97碰碰碰| 天天日夜夜| 五月天激情网址| 人人操人人妻| 国产成人AV在线| 免费的日逼视频| 国产成人综合电影| 任你爽精品免费视频6| 丁香婷婷人妻| 色五月激情问网站| 97人人干| 色色丁香激情五月| 欧美婷婷| 在线色婷婷| 成人婷婷| 婷婷五月激情在线| 性一交一乱一交A片久久四色| 五月丁香成人网| 色五月综合激情| 99精品一二三四视频| 超碰免费在线| 婷婷丁香五月综合免费视频百花| 色婷婷五月天激情| 婷婷色偷拍| 五月激情综合网| 深爱激情网五月天| 五月天合网| 色婷婷精品视频在线播放| 国产精品成人AV在线| 六月丁香激情最新更新| 97人人操人人| www.久久色.com| www.色婷婷| 六月丁香激情网| 丁香婷婷精品视频| 久青操| 九九热视频精品999| 大香蕉五月天| 99热97| www婷婷色情网| 六月丁香婷婷综合狠狠爱夜夜爱| 亚洲狠狠丁香婷婷香蕉| 另类小说色婷婷| 激情五月久久| 久久aaaa片一区二区| 99热这里只有99| 五月开心久久| 性爱五月婷婷| 一级视频网址| 亚洲中文字幕在线观看| 日本色色色| 激情网婷婷五月天| 天天做天天爱天天综合| 另类婷婷丁香| 狠狠色婷婷7| 五月丁香少妇| 超碰9在| 亚洲欧美成人在线观看| 日韩成人中文| 欧美69久成人做爰视频| 99自拍视频| WWW.婷婷| 婷婷婷婷色| 婷婷五月电影| 九艹在线| 中美日韩成人在线| 天天射美女| 国产精品色色| 国产激情在线| 99在线精品视频| 五月激情婷婷播播开心| 99只有这里有精品在线视频| 五月婷婷香| 婷婷五月天欧美| 五月婷婷丁香狠狠撸久久| 久久机热这里只有 | 99热久久日本| 婷五月天六| 婷婷色基地在线看| WWW·色色色·COM| 中文字幕av在线播放| 中文字幕五月久久婷| 日韩无码人妻一区二区| 日韩精品一区二区亚洲AV观看| 婷婷丁香综合色AV| 成人短视频在线免费观看| 天堂亚洲 在线| 国产精品国产| 97碰超级人人看| 色狠狠综合| www.粉嫩av.com| 丁香婷婷丁香五月欧美人| 99热99热在线观看| 久久精彩视频99| www.六月丁香看AV| 色婷婷五月天激情在线观看| 五月天丁香| 中文字幕在线播放视频| 女人天堂AV| 日韩中文字幕| 免费操超碰| 操逼视频一区| 亚洲视频色色| 久热网在线视频| 停停五月色宗合| 五月丁香啪啪网| JAPANRCEP老熟妇乱子伦视频| 免费无码毛片一区二区A片| WWW色五月| 久久一级免费黄色片| 婷婷激情六月综合| 91操色| 香蕉AV777XXX色综合一区| 99精品视频免费观看| 大香蕉九九| 欧美精品在线观看| 国产亚洲99久久| 播五月婷婷开心| 久久久精品人妻录| 99热91| 日本eVa一区=区视频| 九草性爱| 色五月天天| 色婷婷色99国产综合精品| 狠狠色综合网| 69久久久| 天堂婷婷五月在线| 五月婷婷六月丁香在线| 99热亚洲| 9久久网| 欧美激情 日韩无码 婷婷 五月天| 五月丁香黄色| 五月丁香六月婷婷网| 91九色PORNY大屁股| 91丨九色丨高潮丰满日本| 婷婷玉月丁香五月在线视频| 丁香五月婷婷av| 亚洲妇女熟BBW| 婷婷激情人妻| 99视频这里只有久久精品 | 婷婷性爱综合| 天天插天天很| 综合激情五月丁香| 久热婷婷在线视频| 青青草日本亚洲| 精品久久艹| 五月天丁香综合在线| 狠狠五月丁香色婷| 婷婷久草| 91人人超碰在线| 天天色综合综合| 六月色色| 久久xxxx| 精品网站:999WWW| 午夜AV网| 婷婷五月丁香五月天| 成片免费观看视频大全| 亭亭五月基地在线| 五月婷婷免费看| 中文成人在线| 日本狠狠爽| 色色色免费视频| 五月婷婷六月丁香玖玖玫瑰91| 五月色天五月色| 丁香成人五月天| 日良久久| 日良久久| 91九色熟女| 色五月婷婷九月| 免费V片在线| 精久久色| 日本美女97在线视频| 停停色综合伊人| 人人草人人爱| 天天色月| 久久性爱视频网站| 午夜婷婷丁香| 丁香五月影院| sS丁香五月婷婷| 亚洲热综合| 婷婷丁香六月| 五月在线| wwW天天干| 五月天成人综合| 深爱五月月天| 亚洲激情AV| 人妻内射麻豆视频| 免费视频WWW在线观看网站| 99re这里只有精品国产99| 激情五月婷婷五月| 热无码A∨| 激情五月激情综合网| 这里只精品| 国产毛片欧美毛片久久久| 99高级会所久久| 国产成人精品一区二三区熟女在线| 琪琪秋霞| 99噜噜噜在线播放| 色色色色色爱| 婷婷丁香五月天熟女丝袜| 五月婷婷激情综合av| 噜噜狠狠色综合久| 精品在线网站| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 99热在线观看| 天天射天天射一道本日本社区| 九九综合九| 中文在线视频久1| 日韩在线观看亚洲| 五月天激情小说| 人人色性网| 北条麻妃伊人| 色色五月天丁香婷婷| 激情五月丁香五月| 人与禽A片啪啪| 丁香月六月| 五月婷啪啪| 爱射综合| 五月婷婷AV| 五月婷婷激情性爱| 嫩草AV久久伊人妇女超级A| 久久人妻高清中文| 大香蕉免费9| 思思热在线观看| 婷婷五月激情在线| 9热视频在线观看| 能看的AV| 伊人五月综合网| 91久热| 亚洲xx在线| 伊人久久大香线蕉av一区| 六月丁香婷婷综合色播| 精品热青草| www,久久久| 丁香五月人妻熟女| 激情婷婷久久| 色婷婷丁香花五月天| 99久精品视频| 开心五月综合激情综合五月| 色婷婷五月天成人网| 欧美性爱五月天| 天天舔天天操| 婷婷六月爽| 五夜丁香| 婷婷综合仓库中文| 丁香五月性| 骚。com| 九九sese| 操逼视频一区| 激情玖玖综合网| 这里只有精品视频| 久久婷婷五月综合啪| 免费久久这里只有精品99| 国产精品成人AV在线| 婷婷色影音天| 婷婷社区五月天| 亚洲六月婷婷| 99.色| 丁香亭亭久久| 手机在线日韩视频中文字幕| av婷婷丁香| 嫩BBB槡BBBB搡BBBB| 天天综合五月| 26uuu欧美日本| 五月丁香综合啪啪対白| 五月天激情黄色小说在线观看| 亚洲AV永久无码影院黑人| 强壮公让我夜夜高潮A片视频| 色99色| 久久免费婷婷视频| 亚洲激情图文小说| 激情五月天色色网| 六月丁香婷婷色狠狠久久| 超91热| 2018国产大陆天天弄| 色五月综合网| 色婷婷免费视频| 婷婷丁香18| 亚洲天天综合| 久久婷婷五月综合啪| 丁香五月日本| 丁香五月另类小说在线阅读| 五月丁婷香| 色五月天激情| 欧美人人操| 久99久热| 久久99久久99精品免观看粉| 超碰不卡在线| 性色av大香综合| 天天综合91入口| 婷婷激情四射五月天| av一区免费看| 久久天堂女人| 9色在线视频精品观看| 99热草草| 天堂网操| 免费成人中文字幕| 狠狠色婷婷7777久综合| Www.狠狠| 成人网在线视频| 国产免费一区二区三区三州老师F1F1.CC| 97人人干。| 99在线爽| 天天肏天天肏天天肏| 五月丁香色综合| 91人人网| 天天干,天天舔| 99久久a线观| www.五月天婷婷姐姐| 国产精品蜜臀99| 久久A V无码视频| 天天做天天爱天天爽综合网| 色五月婷婷基地| 久久久久婷| 九九香蕉网| 婷婷俺去也| 国产欧美性成人精品午夜| 思思9久久| 久久久久九九九九视屏小说88| 人妻在线网站| 26.uuu丁香五月婷婷| 97在线精品视频| 五月丁香激情片| 五月婷婷色情| 亚洲男女激情| 色5月婷婷| 欧美交换配乱吟粗大25P| 色青青电影色五月| 免费AV在线网址| 97操在线视频| 丁香五月激情月| 夜夜干夜夜操| 亚洲热久久| 欧美综合激情| 天天综合色丁香| 99热只有精品在线播放| 色婷五月| 激情六月天婷婷| 麻豆AV一区二区三区| 9999热在线| 大香蕉精品视频| 五月婷婷综合色啪首页| 天天干天天操天天爽| 婷婷金品综合视频| 色婷婷很很丝袜| 91丁香五月| 五月色婷婷综合丁香精品无遮挡| 丁香五月电影| 丁香六月婷| 国产亚洲成人综合| 午夜大香蕉| 五月丁香无码| 丁香五月电影| 激情五月天.色网| 91色久| 亚洲亚洲永久无码777777| 九九热黄色| 九月婷婷综合色干| 六月婷婷天天操夜夜爽视频| 五月天另类小说久久小说网| 亚洲黄色影视| 婷婷五月天大香蕉在线视频观看| 天天做天天爱天天搞| 五月丁香六月激情欧美综合| 久久九九网| 婷婷五月色情| 丁香五月综合在线播放 | 欧美三日本三级少妇三99| 日本熟妇乱妇熟色A片蜜桃| 婷婷久久精品| 伊人深爱综合| 狠狠狠狠狠干| 超碰成人av| 开心五月深爱五月丁香五月激情五月 | 99热这里只有精品8| 日本成人综合| 五月天久久丁香| 久热99| 大香蕉五月丁香| 无人精品在线视频| 成人AV在线中文版| 国产xxxxx在线观看| 色色五月天丁香婷婷| WWW.HENHENL.| 六月丁香婷婷开心综合基地| 亚洲色视频| www.五月天色色.com| 99热6这里只有精品| 五月婷婷视频| 亚洲AV激情五月综合网| 丁香五月电影| 丁香五月激情啪| 婷婷五月天播播| 国产jd1024基地手机看国产| 都市激情五月婷婷综合| 五月丁香影视| 免费黄色视频网址| 97丁香婷婷| 色激情五月| 色综合色| www.激情com| 97色色在线视频| 伊人喵咪a V| 91dy.av| 国产成人精品一区二三区熟女在线| 久久综合中文| 亭亭色色五月天| 亚州操操| 久久婷丁香五月| 五月天色色婷婷| 啪色综合| av在线播放网址| 国产婷婷五月天| 91九色无码日韩| 久久久久激情| av在线免费播放| 亚洲中文字幕AV| 久久五月婷| 五月天桃色深爱网| WWW.五月天9999| 欧美顶级少妇做爰HD| 99热久久最新地址| 七月婷婷色香综合网| 深爱丁香激情| 激情五月天婷婷播播久久综合91| 色婷婷五月天| se99高清无码| 久99热| 五月丁香人人婷婷在线观看| 香蕉婷婷五月| 丁香六月情| 大香蕉狼人久久| 激情五月丁香五月| 影音先锋xfplay资源男人网| 国产日韩精品SUV| 射久久丁香五月| 99国产欧美视频| 成人电影在线免费试看| www.zbzhongsen.com| 99ri视频| 五月六月激情| 色婷婷影| 97色色色| 青草激情在线| 免费AV在线| 日日色综合| 思思色综合网站| 久久久九九九 99| 狠狠人妻色综合| 秋霞三级影视资源| 69久久久| 男女99免费视频| 六月丁香深深爱| 久久色午夜在线导航| 91在线日| 97色伦另类图片小说视频| 日笨久久网| 五月丁香影院| 五月丁香六月激情综合在线| 婷婷亚洲久久| 五月天激情小说网| 啄木鸟丝袜美女福利视频| 日本久久视频| 国产精品色情AAAAA片软件| 79精品视频在线观看,| 国产成人网址| 99情色五月天| 久久婷婷成人综合色怡春院| 婷婷五月天熟妇| 极品色丁香| 超碰在线caop| 久久久.COM| 俺去也在线官网| 色综合九九色综合88| 亚洲乱码日产精品BD| 开心激情综合| 九九热这里有精品23| 青青999| 狠狠搞狠狠操| 欧美xx激情视频在线观看| 亚洲国产精品成人免费一区久久久在线观看AAAA| 影音先锋美国A| caop在线视频| 男人的天堂五月丁香| 99热这里在线精品| 激情熟女网| 无码人妻丰满熟妇奶水区码| 91超碰在线播放| 天天舔天天摸视频| 538在线| AV动漫不卡无码免费| 九九色婷| 六月婷婷激情| 婷婷五月天Av| 婷婷精品性性性性性性性| AV在线资源| 五月婷婷五月天亚洲无码| 综合激情伊人影视在线| 伦99热| 婷婷五月综合社区在线| 成人午夜无码视频| 超碰免费99| 久久六月综合| 婷婷六月伊人| 五月丁香WWW| 热九九精品| 亚洲成人av在线| 亚洲成人无码片| 欧美日韩成卜| 色五月婷婷五月天| www.yw尤物| 久综合| 婷婷五月影院| 六月丁AV| 天天xxxxxx天天日| 五月综合亚洲婷婷| 五月激情精品视频| 九九精品视频免费在线| 91干视频| 亚洲人人操| www.婷婷五月天,com| 亚洲三A| 欧美电影在线观看| 婷婷久久五月天| 婷婷激情小说| 五月天色图| 婷婷伊人网| 丁香五月日韩| 九九这里是免费的视频5| 五月综合婷婷五月| 丁香五月婷婷六月| 色婷婷AV久久久久久久| 开心五月婷婷在线| 六月婷色六月| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 激情久久综合网| 97超碰欧美中文字幕| 婷婷五月丁香99| 婷婷六久久| 亚洲国产成人AV在线| 亚洲AV日韩在线观看| 五月丁小婷婷激情四射| 日韩在线视频9色| 九九色video| 色婷婷久久7777| ...婷婷五月综合不卡,国产在线手机| 九九久99免费视频| 免费成人网在线观看| 综合五月丁香六月婷婷| 久久99看免费| 色婷婷操逼| 婷婷五月天成人五月天| 欧日韩AV| 呦呦视频无码播放| 丁香婷婷色| 婷婷色综合av| 九九99免费视频| 激情婷婷五月天| 欧美性生交XXXXX无码小说| 婷婷综合中文字幕| 亚洲人人艹| 9999三级片| Av性爱网| 五月色俺婷婷| 99精品在线观看| 国产日比| 少妇人妻偷人精品无码视频新浪| a免费在线| 欧美性爱中文字幕| 色色精品色| 激情5月天天天| 少妇性按摩无码中文A片| 色色色免费视频| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 色婷婷成人做爰A片免费看网站 | 婷婷伊人綜合中文字幕| 日韩成人综合网| 我淫我色婷婷五月天激情四射| 色爱综合五月| 97丁香婷婷| 日 日干 日日做| 久色视频| 色999五月色| 九九热狼人| 丁香蜜臀黄色婷婷五月天| anquye伊人| 欧美丁香婷婷五月| 99热在线精品观看| 97色精品视频| 五月丁香 啪啪| 影音先锋 91工厂| 五月激情天| 影音先锋女人AA鲁色资源| 天天射色五月天| 只有精品视频在线观看| 99热这里只有精品官网| aa久久| 五月天sesese| 综合久| 婷婷 月 丁香| 天天天干夜夜夜操| 婷婷久久爱| 入口五月婷婷六月香| 日日夜夜狠狠干| 99色色网| 97热久久| 亚洲男人的天堂婷婷色五月| 91爱操| www.久操| 这里只有精品热| 久久九九@| 九九精品9| 丁香五月婷婷无码AV| 思思热在线精品视频| 202丰满熟女妇大| 色色色地址| 夜夜操天天爽| 五月丁香综合激情| 色情久久久| 青草少妇激情| 精品人妻午夜一区二区三区四区| 久久在这里99| 五月婷综合| 婷婷中文字幕网站| 综合丁香婷婷五月天| 日韩99视频| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 婷婷五月天伊人在线| 九九热re99re6在线精品| 狠狠婷婷日韩| 色噜噜,噜噜色| 夜夜干天天操| 色99热| 天天色天天日| 婷婷丁香五月在线观看91| 色婷婷4| 91热爆在线| 久久婷婷亚洲| 日本久久人人| 久久色9| 激情五月婷婷综合| 久久密臀婷婷| 激情五月天婷婷视频| 无码AV免费精品一区二区三区 | 婷婷激情综合色五月久久图片| 夜夜撸天天日| 日本黄色三级片内射| 人妻性爱| 亚洲综合五月| 欧美日韩成人在线| www.99在线| 中文字幕永久免费| 殴美日比视频| 美女网黄| 婷婷久久五月丁香| 久热69| 激情亚洲婷婷| 狼人婷婷综合| 成人五月天丁香| 97影院一级片| 999婷婷综合| 超碰99久久| 日本精品99网站| 九九色人| 久久只有18视频| 日本老女人黄页在线播放| 九九热99热| 婷婷欧美色| 色五月激情五月| 日日夜夜噜噜爽爽| 99五丁香月| 亚洲综合五月天|