日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

發布時間:2023/12/3 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自??實戰 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

供稿 |?eBay ADI-Carmel Team

作者?| 金瀾濤

編輯 | 顧欣怡

本文7309字,預計閱讀時間22分鐘

?

導讀

本文介紹eBay Carmel團隊利用Delta Lake,使Spark SQL支持Teradata的Update/Delete語法。主要從源碼角度介紹了CRUD操作的具體實現和優化,以及delta表的管理工作。希望對同業人員有所啟發和幫助。

?

摘要

大數據處理技術朝傳統數據庫領域靠攏已經成為行業趨勢,目前開源的大數據處理引擎,如Apache Spark、Apache Hadoop、Apache Flink等等都已經支持SQL接口,且SQL的使用往往占據主導地位。各個公司使用以上開源軟件構建自己的ETL框架和OLAP技術,但在OLTP技術上,仍然是傳統數據庫的強項。其中的一個主要原因是傳統數據庫對ACID的支持。具有ACID能力的傳統商用數據庫基本都實現了完整的CRUD操作。而在大數據技術領域,由于缺少ACID的支持,基本只實現了C/R操作,對U/D操作很少涉及。

eBay數據倉庫的部分基礎設施是構建在商用數據產品Teradata之上的,近年來,隨著公司整體朝開源技術遷移,數據倉庫的基礎設施已基本遷移到Apache Hadoop、Apache Spark平臺。但要完全從Teradata上遷移下來,必須構建具有相同能力的SQL處理引擎。在Teradata上的分析型SQL,有超過5%的查詢使用Update/Delete操作,目前Apache Spark并不具備這個能力。

本文介紹eBay Carmel團隊利用Delta Lake,使Spark SQL支持Teradata的Update/Delete語法。對比標準SQL的Update/Delete語法,以及目前尚未正式發布的Apache Spark 3.0 提供的語法(不含實現),我們還實現了Teradata的擴展語法,可以進行跨表更新和刪除的SQL操作。

1.簡介

Carmel Spark是Carmel團隊基于Apache Spark進行魔改的SQL-on-Hadoop引擎。主要改善了交互式分析的使用體驗,提供即席查詢(ad-hoc)服務。Carmel Spark是“Teradata退出”項目的重要組成部分,在功能性和性能上,都做了大量開發和優化。例如全新的CBO、并發調度、物化視圖、索引、臨時表、Extended Adaptive Execution、Range Partition、列級訪問權限控制,以及各類監控和管理功能等,目前已經在線上使用且滿足業務需求。

但由于Apache Spark缺少ACID事務能力,并沒有提供Update/Delete語法。去年年初,Databricks開源了存儲層Delta Lake,為Apache Spark?提供可伸縮的?ACID 事務,提供事務管理、統一流批、元數據管理、版本回溯等數據庫領域常見功能。一年過去了,Delta Lake的版本也更新到了0.5.0,但開源版本始終沒有提供Update/Delete的SQL實現。目前只提供Dataframe API,用戶需通過編寫代碼來對數據進行更新和刪除等操作。此外,根據Apache Spark 3.0分支上提供的SQL語法接口,也只支持基本的單表Update/Delete操作,對于復雜的帶有join語義的跨表操作,則完全不支持。而Teradata用戶已經在廣泛使用擴展的SQL語法對數據進行更新和刪除操作。

基于Delta Lake存儲層提供的ACID事務能力,Carmel Spark實現了Update/Delete的SQL語法,且該語法完全兼容Teradata的擴展語義,即能進行跨表的更新和刪除。同時,我們拓展了delta表的數據分布,支持bucket delta表,并對其進行了bucket join等優化。此外,由于Carmel Spark集群部署是多租戶的,所以同一套代碼會長期運行在YARN的不同隊列中。雖然Delta Lake存儲層提供了良好的事務隔離性,但仍會出現重復操作的風險(非同一事務)。因此,我們使用delta表本身來治理delta表,即將所有delta表的元信息存儲在一張delta表中,通過對該元數據表的增刪改查操作,來對用戶使用的所有delta表進行管理。

本文的組織結構如下:第二節介紹相關技術和產品;第三節闡述項目的整體架構和實現;第四節詳細介紹如何利用Delta Lake使SparkSQL支持CRUD操作;第五節介紹delta表的bucket優化;第六節介紹delta表的自治和管理;最后兩節分別談一下未來的工作和對本文的總結。

?

2.相關工作

2.1 Spark SQL

Apache Spark[1]是一款開源的分布式計算框架,誕生于2009年加州大學伯克利分校AMPLab的一個研究項目,于2013捐贈給了Apache軟件基金會。在處理結構化數據上,Spark提供了DataFrame API和Spark SQL模塊。DataFrame API允許用戶通過表、行和列的概念對數據進行操作。

同樣,用戶可以使用SQL來操作它們。Spark SQL模塊將SQL查詢轉成一棵查詢計劃樹(query plan tree)。給定一個原始SQL查詢,該查詢首先經詞法分析和解析,轉換為邏輯查詢計劃(logical plan)。該邏輯查詢計劃經過查詢優化器,產生優化的查詢計劃(optimized plan)。最終,優化的查詢計劃被轉換為物理計劃(physical plan),物理計劃會被轉成job和task最終提交到集群上執行。

Apache Spark 3.0開始,SQL模塊提供了Update/Delete的語法定義,定義在Antlr4的語法文件里,但并沒有具體實現,而是交由第三方實現。如圖1所示:

圖1 Spark 3.0 的Update/Delete語法

?

2.2 Teradata

Teradata[2]是Teradata Corp.開發的可橫向擴展的關系型數據庫管理系統,設計用于分析型查詢,主要用于數據倉庫領域,采用大規模并行處理(MPP)架構。Teradata對Update/Delete等語法支持非常完備,除了ANSI SQL: 2011定義的標準Update/Delete語法,Teradata還做了大量擴展,如跨表更新和刪除。其所提供的豐富的語法也給我們遷移到Spark帶來了挑戰。圖2所示為Teradata支持的更新和刪除語法:

圖2 Teradata的單表以及跨表Update/Delete語法

?

2.3 Delta Lake

2018年初,Databricks開源了存儲層Delta Lake[3],為Apache Spark 提供可伸縮的 ACID 事務,提供事務管理、統一流批、元數據管理、版本回溯等數據庫領域常見功能。Delta Lake將其數據存儲在Parquet文件中,并提供ACID事務。它使用名為Delta Log的事務日志來跟蹤對表所做的所有更改。

與開源的Delta Lake相比,Databricks內部版本可以通過SQL來進行Update/Delete操作,而目前開源版本只支持DataFrame的API,只能通過Parquet[4]文件推斷表的Schema信息,對Hive?Metastore[5]的支持較弱,且不支持bucket表等等。Apache Iceberg[6]和Apache Hudi[7]雖然實現形式與Delta Lake不同,但在Update/Delete的SQL語法支持上,目前都不完善。表1給出了這三個系統的對比(截止2019年11月)。

表1 三個ACID庫的簡單對比

?

3.項目概述

有了Delta Lake在存儲層提供ACID事務保障,我們的主要工作就是利用Delta Lake,在我們的Spark版本上實現和Teradata相同的Update/Delete功能。要達到這個目標,有以下任務有待完成:

1. Delta Lake目前只支持Apache Spark?2.4+版本,而Carmel團隊使用的Spark版本是基于2.3版本的,所以我們改了Delta Lake的部分實現并為我們的Spark版本打了一些補丁。

2. Spark 3.0中雖然沒有Update/Delete語法的具體實現,但仍然在Catalyst[8]中加入了相關的邏輯計劃節點。不過這些新增的接口都是基于DataSourceV2的,我們需要將這部分代碼在DataSourceV1上進行重寫:

3. Teradata支持跨表的Update/Delete語法,目前Delta Lake和Spark都不支持,我們需要自己實現帶join的跨表連接更新和刪除操作

4. Delta Lake目前對Catalog[9]的訪問還不成熟,delta表的schema是通過Parquet文件推斷出來的,通過Catalog訪問Hive Metastore是使用SQL訪問delta表的重要一環。

5. 由于上述原因,delta表無法識別bucket信息,更沒有考慮讀寫bucket表時的分布(distribution)。

6. 在以上3,4,5步驟完成之后,還要對跨表操作進行優化,這里將主要介紹bucket join的優化

7. 開源版本的Delta Lake缺少一定的管理機制,需要實現一些自動化管理功能,如自動清理和合并文件等。

?

4.CRUD的實現

4.1 前置工作

首先,要在我們的Spark 2.3內部版本中使用Delta Lake,就需要從社區打一些補丁。這里重點說一下SPARK-28303。

SPARK-28303引入了基于DataSource V2的DELETE / UPDATE / MERGE語法。由于Spark 2.3不支持DataSource V2,因此我們需要將此功能移植到V1版本,在ddl.scala中增加了UpdateTableStatement和DeleteFrom Statement。Antlr4[10]的語法結構如下所示:

?

4.2 實現單表更新

Delta Lake目前不支持Update/Delete SQL的解析,我們增加了兩個類:DeltaSqlResolution和PreprocessTableUpdateDelete,通過SparkSessionExtensions注入到Analyzer:

DeltaSqlResolution主要是用于解析condition和assignments表達式:

再由PreprocessTableUpdateDelete生成RunnableCommand。如果是delta表的話,這里可以從LogicalRelation中拿出delta表的TahoeFileIndex(在DataSource.scala的resolveRelation中添加的),如果是非delta表,則會拋出AnalysisException。

UpdateCommand是Delta Lake自帶的類,我們對其改動不多,主要改了如下幾個地方:

一個是鑒于目前Update操作不會更新表的統計信息(Statistics),造成delta表在進行join等操作時無法正確判斷是走SortMergeJoin還是BroadcastJoin,我們增加了catalog的訪問使delta表的CRUD操作都能更新表的統計信息。

第二個改動是增加了update/delete的row級別metrics信息。Delta Lake已經發布的0.5.0版本update和delete缺少row級別的metrics。社區最新的代碼已經做了添加,但當更新或刪除單個partition或全表時仍舊是缺少的,而我們的實現在無論何種情況下都做了收集。

?

4.3 實現跨表更新

目前Spark3.0定義的Update/Delete語法不支持跨表操作,而跨表更新和刪除操作卻十分普遍,比如更新目標表中具有(在inner join情況下)或可能沒有(在left outer join情況下)另一個表匹配行的行。

許多數據庫都提供跨表更新和刪除的語法。下面給出了幾種常用數據庫的跨表更新的例子。

MYSQL[11]跨表更新:

Teradata的跨表更新:

PostgreSQL[12]的跨表更新:

Teradata的語法和PostgreSQL的基本一致,只是FROM子句和SET子句順序調換了一下,而MYSQL支持在一條SQL里同時更新多張表。Carmel Spark目前參考的是Teradata的語法,同時在DeltaSqlResolution中增加了帶join的解析:

和單表Update一樣,首先對condition和SET子句進行解析。不同的是,除了被更新的target是一個LogicalRelation以外,這里的source可以是一個LogicalRelation,也可以是多張表連接在一起的join plan。

我們從WHERE條件的condition中分離出哪些是target和source之間的join criteria,哪些是source中自身的join criteria(source可以是多表join的plan),以及哪些是分別作用在target或source上的普通Filter。同樣地,再由PreprocessTableUpdateDelete生成Runnable Command:

上述代碼中,跨表更新和單表更新的區別是多構建了一個DeltaMergeAction。可見跨表更新的實現參考了MergeInto。

UpdateWithJoinCommand是跨表更新的主要執行類,一共分為三步:

1. 通過將需要被更新的target表和source(可以是一個帶join的plan)進行內連接(inner join)找出所有會被更新的行所涉及的文件,標記為removeFiles。這一步還能簡化后續的步驟,例如不涉及任何文件或者只涉及partition目錄時,不用全表執行第2步。

2. 將target和source使用左外連接(left outer join),對于join條件匹配的行,使用build side iterator的數據(右表),不匹配的行使用stream side iterator的數據(左表)。將數據寫出到target表,寫出的數據文件標記為addedFiles

3. 將1中removeFiles和2中的addedFiles寫入transaction log中,即delta log

刪除操作和更新操作基本類似,可以視為更新操作的簡化版,這里就不展開了。

?

4.4 實現SELECT/INSERT

對delta表的讀操作(SELECT)實際上是對delta表的解析。Delta表是DataSource表的一種。在FindDataSourceTable這條rule中,通過resolveRelation方法對delta表進行特殊處理:

這里我們把catalogTable對象傳入到DeltaDataSource的createRelation方法里。補充一點,之所以這個case可以匹配到DeltaDataSource,是因為我們在ConvertToDelta Command里,通過alterTable,把provider從parquet改成了delta:

回到createRelation。通過傳入的catalogTable對象,我們在DeltaLog.scala里將表的信息填到HadoopFsRelation里面:

Delta表的INSERT操作也很簡單。在DataSourceStrategy中添加InsertIntoData SourceCommand:

普通delta表的insert我們沒有進行修改,這里就不展開了,下一節講bucket表的insert時再詳細闡述這部分的改動。

?

4.5 創建Delta表

創建delta表(CREATE操作)目前完全復用了普通Parquet表的CREATE,只是需要在建完表后執行CONVERT TO DELTA命令。我們簡單做了一些修改,使其可以CONVERT一張空的Parquet表,目前社區版是不支持的。其他的修改主要是針對管理上的,在第六節會詳細介紹。

到此,CRUD功能的SQL實現已經基本完成。在這一節里,我們引入了跨表更新操作,但是跨表更新涉及到join算子,這在大表之間進行更新操作時會有性能問題。在下一節中會介紹如何針對bucket表進行優化。

?

5.Bucket優化

跨表更新操作中,會有多次連接算子,當進行連接操作的表是上TB數據量的大表時,整個更新操作就會變得非常慢。甚至,大量數據的SortMergeJoin可能拋出OutOfMemory。事實上,在我們實際的業務場景中,就存在著大量的大表更新。例如被更新的表往往是一張幾個TB的大表,然后和另一張或幾張中型表進行連接操作。為了優化這類SQL,最容易想到的方法是通過bucket join來避免大表數據的shuffle。現實中,我們用戶的許多大表也的確做了分桶(bucket)。

然而目前delta表并不支持分桶表,相關代碼的BucketSpec都被默認填了None,對更新和刪除的操作也沒有考慮數據的分布(Distribution)。那么該如何實現bucket表的數據分布呢?

5.1

創建delta bucket表和讀取

首先和Parquet表一樣,我們需要在建表時指定分桶字段。形如:CLUSTERED BY (col*) [SORTED BY (col*) ] INTO number BUCKETS。

4.3小節中我們提到了在ResolveRelation時將CatalogTable對象傳入了HadoopFsRelation。有了這個CatalogTable對象,就可以幫我們在后續的各類操作中識別bucket表了。

5.2

插入數據到delta bucket表

上一步只是告訴Spark,這是一張bucket表,真正寫入數據的時候發現數據并沒有分桶分布。這是因為Insert操作在delta表上是走InsertIntoDataSource -> InsertIntoDataSourceCommand的,而不是通過DataWritingCommand,所以也就走不到ensureDistributionAndOrdering的邏輯。以下代碼是社區版InsertIntoDataSourceCommand的實現:

如上代碼所示,它的實現非常簡單,將需要insert的邏輯計劃“query”封裝成一個data frame,然后傳入到實現類的insert方法里。在Delta Lake中這個data frame會被傳入到TransactionalWrite的writeFiles方法中。最終從這個data frame中取出physical plan并傳入DataFormatWriter的write方法。之后就是真正的生成job并分發執行了。

從整個流程可以看出,從一開始的邏輯計劃對象“query”到最后的物理計劃,并沒有機會進行數據分布的實現。所以不管在建表時是否指定分桶,插入數據時都不會滿足數據分布。

鑒于目前DataSource并沒有考慮數據分布的問題,我們在resolution階段就需要進行處理。大體就是在Catalyst里增加一個InsertIntoDataSource的邏輯計劃節點和一個InsertIntoDataSourceExec的物理計劃節點。在InsertIntoDataSourceExec這個物理計劃中實現了requiredChildDistribution和requiredChildOrdering方法(代碼可以參考InsertIntoHadoopFsRelationCommand的requiredDistribution和requiredOrdering方法)。

這里說一下整體流程。首先,DataSourceStrategy原本是匹配到了InsertIntoTable就會將邏輯計劃“query”原封不動地傳入InsertIntoDataSource Command。我們現在做出如下改變:增加一個新的邏輯計劃節點InsertIntoDataSource,為其添加partition,bucket等信息,并將“query”作為該新節點的child:

然后在SparkStrategy.scala的BasicOperators里將InsertIntoDataSource節點轉成物理計劃節點InsertIntoDataSourceExec,通過planLater(i.query)得到物理計劃作為該物理節點的child。這樣InsertIntoDataSourceExec的requiredChildDistribution和requiredChildOrdering方法就可以對數據進行分布了:

?

5.3 在跨表更新或刪除操作中利用bucket join

到目前為止,對delta表的改造已經使其具有了bucketSpec字段和數據分布的特性。在跨表更新或刪除時,無論是inner join還是left outer join,只要target和source都是bucket表且滿足bucket join條件,就能走bucket join而不是SortMergeJoin。這就解決了大表之間join產生大量shuffle帶來的性能問題。

下面這個例子是跨表更新一張3.9TB的表,source則是一張5.2TB的表。圖3所示是left outer join階段,右表雖然有一個Filter,但是仍然不滿足broadcast join閾值,這個更新操作在非bucket join的情況下,會造成大量Executor OOM,最終導致job失敗。通過引入bucket join,該job在2分鐘左右就能順利完成。從圖3可以看到在SortMergeJoin的前后,已經沒有ShuffleExchange了。

圖3 跨表更新中利用bucket join避免shuffle

?

但是,這里仍然可能存在問題,因為被更新的表仍然是一張bucket表,而圖3的輸出沒有考慮數據的分布。對于bucket表尚不滿足數據分布的情況,我們需要在SortMergeJoin之后增加一輪HashRepartition,以保證最終的結果輸出符合被更新表的數據分布特性:

?

6.Delta的自治和管理

介紹完CRUD的功能和相關優化,這一節講一下我們是如何管理delta表的,主要包括:如何統計delta的使用情況,如何自動進行文件清理,如何管理TimeTraval[13]等。

在這之前我們需要簡單介紹一下eBay Carmel Spark的基本架構。eBay的Carmel Spark平臺是計算存儲分離的。數據存儲有一個專門的Hadoop集群(Apollo),Carmel Spark集群(Hermes)主要是由大內存加SSD的計算節點組成,通過YARN[14]進行調度。除了本地SSD以外,也有一部分存儲容量搭建了一個小容量的HDFS,主要是拿來做Relation Cache和物化視圖,這部分以后有機會另起一篇文章進行介紹。

我們使用Spark Thriftserver來提供JDBC和ODBC服務,但所有的Thriftserver并不是固定在某個機器上的,而是通過YARN進行調度,通過cluster mode將Spark Thriftserver提交到集群內部。同時,根據Budget Group對YARN集群分queue,不同的Budget Group有一個YARN的queue,例如廣告部門有一個queue,數據部門有一個queue,每個queue可以有多個Spark Thriftserver。Carmel Spark對scheduler模塊做過大量并發優化,經過壓測,一個Driver調度起來的任務能把200臺物理機的所有CPU壓滿。所以Driver調度并不是瓶頸,目前最大的一個queue僅使用一個Thriftserver就可以調度近7000個executors。

圖4 Carmel Spark集群部署

?

目前有多少個queue,就有多少個Thriftserver,也就有多少個Application。但不同的Thriftserver仍然共享了一些組件,例如HDFS,Hive Metastore等。這就要求我們對所有的queue做一些管理。例如在物化視圖功能中,當對一張基礎表構建物化視圖后,所有的queue都需要在內存里構建一些邏輯計劃樹。delta表的管理也類似,不過相比物化視圖簡單的多。例如我們要對所有的delta表進行自動化的文件清理工作,一種方式是起一個后臺線程遍歷Hive Metastore的所有表,對provider是delta的表進行處理。這樣的好處是不需要跨Thriftserver進行任何消息的同步,壞處自然是不斷遍歷Hive Metastore帶來的壓力(多集群公用的Hive Metastore壓力已經比較大了)。所以我們使用了一種更加直觀的方式進行管理,即用delta表來管理delta表。

我們創建了一張名為carmel_system.carmel_ delta_meta的表,記錄了如表名、owner、deltalog路徑、是否自動清理、清理周期等元信息,并將其CONVERT成一張delta表。所以carmel_delta_meta表的第一條記錄就是自己的信息。然后我們提供了一套操作這張表的API,以調用靜態方法的方式放在DeltaTableMetadata類的半生對象中:

如下所示,當用戶對一張表執行CONVERT TO DELTA命令時,會生成一個事件,通過DeltaTableListener捕獲后將該delta表的元信息寫入carmel_delta_meta,當用戶刪除delta表時,DropTableEvent同樣可以觸發上圖的刪除操作API,從carmel_delta_meta刪除這條記錄:

?

另外在YARN的保留隊列(reserved queue只允許管理員權限連接)里啟動一個DeltaValidate線程,通過讀取carmel_delta_meta中的數據進行驗證,觸發如刪除記錄等操作。同時,如果用戶在CONVERT TO DELTA時指定了Vacuum保留時間:

或是一開始沒有指定保留時間,后續通過命令VACUUM AUTO RUN進行修改:

DeltaValidate線程會自動生成Vacuum任務,并丟到Vacuum線程池調度執行。這里就不貼代碼了。整個架構如圖5所示:

圖5 delta表的自治管理

?

此外,我們還增加了TimeTravel的SQL語義,用戶可以通過在SELECT命令里增加AT關鍵字,單次讀取delta表某個version的快照。也可以通過ROLLBACK命令永久回到某個版本:

?

通過carmel_delta_meta中記錄的一些表的血緣信息,可以實現delta表的及聯回滾。在某個delta表rollback后,觸發器根據carmel_delta_meta的血緣信息,自動回滾其他相關表(這需要事先定義在carmel_delta_meta的rollback依賴樹和觸發器條件,該功能目前還未上線)。

上面介紹了通過delta表來管理delta表的方式,這一方法能很好地幫我們解耦隊列同步和外部系統依賴的問題,既方便靈活,又快捷安全。

?

7.未來的工作

7.1 持續的性能優化

Carmel Spark項目經過兩年的技術迭代,已經具備非常多的功能和優化,例如Range Partation、Optimized Bucket Join、Broadcast/Local Cache、Extended Adaptive Execution、Parquet File Index、Materialized View、ACL、Volcano CBO、Adaptive Runtime Filter、Mutiple Files Scan等,如何讓新的功能如CRUD復用以上優化和特性,也變得越來越富有挑戰了。例如我在測試時發現Broadcast Cache和Mutiple Files Scan兩個功能在和CRUD功能集成時存在bug,又或者目前的Volcano CBO和Parquet File Index還不能應用在delta表上等。

此外,在跨表更新操作上,大表連接的優化目前只針對bucket表,但是當兩張非bucket表進行連接時,性能仍然不夠好。這里就有多個優化點,比如Adaptive Runtime Filter,就是Join Pushdown,可以將join表的min/max或者join key的bloomfilter推到兩邊進行過濾,以減少參與連接的記錄數,目前只完成了在inner join下的部分功能。

7.2更完備的語義

除了性能的優化,Carmel Spark作為Teradata戰略代替品,需要盡可能兼容Teradata的語義,后續如果有用戶需要MERGE INTO或者UPSERT操作,這部分還要繼續擴展。此外,目前UPDATE和DELETE的WHERE條件還不支持子查詢,CONVERT TO DELTA不支持Parquet Format的Hive表,這些都將是后續的工作。

7.3高度自治的管理

第6節最后提到過的及聯回滾功能,以及對delta表的審計和監控都屬于平臺管理的范疇。這些有的已經具備成熟的解決方案,如我們已經有完全和Teradata對標的列級訪問權限控制和審計功能。有的還在不斷完善,如用于File Index和Materialized View的Hive Metastore同步機制還沒有上線,目前用的還是過渡方案。這部分不止針對delta表,有些還可以應用于整個Carmel Spark。

?

8.實施和總結

8.1技術之外

最后簡單說一下項目的情況。這個項目找到我的時候是在2019年的10月底,我剛上線完Spark臨時表功能,物化視圖項目也還陸陸續續有一些bug fix的工作要做,所以真正開始投入去做應該是在11月中旬。CRUD功能目標上線時間是在2020年的2月份,不像物化視圖這類優化型項目,功能型項目承諾上線時間的要求往往更高一些。加之期間還有春節假期,oncall和各種bug fix的工作,對于該項目來說排期還是比較緊的。

此外,我們對Delta Lake的成熟度和性能也比較擔憂(現實也驗證了Delta Lake的開源版本在SQL成熟度上的確不足)。實踐中發現除了ACID這個核心功能不用操心以外,基本上都要二次開發。最后和我們使用的基于社區2.3版本進行魔改的Carmel Spark的集成相比,也存在許多挑戰。

再說一下為什么選擇Delta Lake。目前來看,除了Delta Lake之外,Apache Hudi和Apache Iceberg也能完成ACID的功能。當時選擇Delta Lake一是因為它是Databricks的產品,在Databricks內部版本比較成熟,長期來看其開源版本也會和Apache Spark更加緊密。二是當時公司內部還有一個準實時數倉的項目,立項也是使用Delta Lake。考慮到盡可能保持技術棧一致,我們選擇了Delta Lake,而且單從這個項目上Apache Hudi和Apache Iceberg并沒有特別的優勢。

最后說一下用戶支持,其實做一個項目最復雜也是最耗時的并不是編碼階段,而是上線后接受用戶的考驗。該功能的第一批用戶是來自eBay瑞士的財務部門分析師團隊,因為不在同一個時區,春節假期里幾乎每晚都會通過Zoom和我溝通。這種在用戶和開發者之間的持續交流,使得一些隱藏的問題即時浮現出來,用戶也得到了較好的使用體驗。我們的Carmel Spark每周都會有半個小時的例行發布窗口,用戶遇到的bug幾乎都在下次發布窗口時得到了修復。在這一周中,我們也會找出workaround方式,幫助用戶進度的推進。目前該功能已經在所有隊列上啟用,越來越多的用戶開始參與試用。

8.2總結

本文從源碼角度講解如何利用Delta Lake使老版本的Spark SQL支持跨表的CRUD操作,以及我們所做的優化和管理工作。最后,簡單介紹了未來的工作方向以及項目實施上的一些感悟,希望能對閱讀者有所幫助。

?

參考文獻

[1] https://spark.apache.org/

[2] https://www.teradata.com/

[3] https://delta.io/

[4] https://parquet.apache.org/

[5] https://hive.apache.org/

[6] https://iceberg.apache.org/

[7] https://hudi.apache.org/

[8]https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html

[9]http://blog.madhukaraphatak.com/introduction-to-spark-two-part-4/

[10] https://www.antlr.org/

[11] https://www.mysql.com/

[12] https://www.postgresql.org/

[13]https://databricks.com/blog/2019/02/04/introducing-delta-time-travel-for-large-scale-data-lakes.html

[14]https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html

總結

以上是生活随笔為你收集整理的实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久草综合在线观看 | 国产精品久久久区三区天天噜 | 天天操天天舔天天干 | 中文字幕第一页在线播放 | 国产精品久99| 看片网站黄色 | 日韩中文字 | 久草在线观看 | 国产小视频你懂的 | 久久精品视频在线观看免费 | 在线成人国产 | 久久精视频 | 久久伊人八月婷婷综合激情 | 丁香六月国产 | 中文在线a在线 | 国产一区二区在线视频观看 | 国产精品视频永久免费播放 | 麻豆视频在线 | 毛片网在线播放 | 国产视频美女 | 亚洲涩涩网| 国语麻豆 | 国产护士在线 | 色搞搞 | av九九| 欧美激情第八页 | 亚洲成av人片一区二区梦乃 | 国产色中涩| 亚洲成年片 | 成人免费在线观看电影 | 日韩成人黄色 | 国产视频99 | 日批视频国产 | www.五月婷婷 | 国产一区成人 | 国产精品一区二区久久 | 免费看片成年人 | 992tv在线成人免费观看 | 国产精品婷婷 | 日韩欧美一区二区不卡 | 亚洲一区二区麻豆 | 蜜臀av在线一区二区三区 | 丁香一区二区 | 久久男人中文字幕资源站 | 91在线中字| 又黄又爽又刺激的视频 | 欧美亚洲国产日韩 | 草久在线播放 | 免费在线一区二区 | 久久精品高清 | 男女视频久久久 | 日日操夜夜操狠狠操 | 成人免费在线视频观看 | 久久视频这里只有精品 | www.夜色321.com | 玖玖爱在线观看 | 九九免费在线视频 | 久久美女高清视频 | 日韩美视频 | 伊人国产女 | 成人av高清 | 国产精品黄色av | 99这里只有久久精品视频 | 91在线精品一区二区 | 2021国产在线 | 91桃色免费观看 | 欧美老人xxxx18 | 亚洲精品黄色在线观看 | 日韩免费网址 | 久热色超碰 | 国产一区视频在线 | 国产精品午夜久久 | 视频在线99| 欧美大片www | 五月婷婷六月丁香 | 四虎在线免费观看 | 国产精品theporn | 国产激情电影综合在线看 | 爱爱av在线| 亚洲精品久久久久中文字幕二区 | 中文字幕免费播放 | 樱空桃av| 狠狠狠色 | 天天摸天天操天天爽 | 国产亚洲视频系列 | 欧美成年黄网站色视频 | 国产精品久久久网站 | 免费av在| 国产一卡久久电影永久 | 亚洲经典视频 | 人人爱爱 | 天天操天天摸天天爽 | 国产亚洲免费的视频看 | 免费精品 | 亚洲japanese制服美女 | 久久无码精品一区二区三区 | 日本中文字幕久久 | 亚洲一区二区视频 | 嫩草av在线 | 激情久久久久久久久久久久久久久久 | 日韩欧美99 | 国产精品亚洲片夜色在线 | 国产精品影音先锋 | 精品一区二区三区电影 | 在线播放国产一区二区三区 | 亚洲第一av在线 | 色婷婷福利视频 | 日韩特黄一级欧美毛片特黄 | 国产二区视频在线观看 | 日韩在线网址 | 成人毛片一区二区三区 | 亚洲欧美视频 | 99久久国产免费看 | www.人人干 | 美女视频又黄又免费 | 久久无码av一区二区三区电影网 | 久青草视频 | 中文字幕在线久一本久 | 国产精品久久久久久久婷婷 | 色婷婷综合久久久久中文字幕1 | 超碰在线观看97 | 国产系列在线观看 | 在线www色| 久久久黄色| 国产精品免费在线播放 | 国产精品毛片久久久久久 | 西西444www大胆高清图片 | 精品久久一区 | 欧美日韩精品在线免费观看 | 黄色三级在线观看 | 国产视频999| 欧美日韩精品综合 | 波多野结衣电影一区二区 | 欧美日韩亚洲在线观看 | 日韩精品视频在线免费观看 | 精品欧美小视频在线观看 | 天天插视频 | av电影 一区二区 | 九色琪琪久久综合网天天 | 91麻豆精品国产91久久久无需广告 | 亚洲第一中文字幕 | 久久久久综合 | 久久草在线视频国产 | 久久一级电影 | 天天操夜夜看 | 亚洲精品动漫成人3d无尽在线 | 欧美日韩一区二区三区免费视频 | 九九久| 久久亚洲欧美日韩精品专区 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产精品18久久久久久久久 | www,黄视频 | 久久久影院一区二区三区 | 一区二区三区在线影院 | 欧美亚洲一级片 | 日韩欧美高清一区二区 | 午夜少妇| 免费网址在线播放 | 日韩av视屏在线观看 | 一区二区三区免费在线观看视频 | 亚洲成a人片在线观看网站口工 | 香蕉影院在线播放 | 丁香av| 国产亚洲精品久久久久秋 | 欧美日韩国产一二 | 超碰人人在线 | 一区二区精品视频 | 国产一区二区不卡在线 | 中文字幕一区二区三区在线观看 | 久久综合色一综合色88 | 美女视频黄免费网站 | 亚洲精品视频网站在线观看 | 欧美极品xxx| 日韩av手机在线观看 | 久久久久久国产一区二区三区 | 欧美资源在线观看 | 久久99久久久久久 | 97在线观看 | 激情欧美日韩一区二区 | 免费av在线网站 | 欧美日韩在线网站 | 日韩手机在线观看 | 99电影456麻豆 | 日韩精品免费在线观看 | 国产成人精品久久二区二区 | 精品国产一区二区三区四区在线观看 | 精品国产理论 | av成人黄色| 欧美a级片网站 | 精品天堂av| 欧美小视频在线观看 | 久久久久久久久久久久久影院 | 久久精品99国产精品亚洲最刺激 | 亚洲狠狠婷婷综合久久久 | 一区二区三区电影在线播 | 夜色.com | 国产精品久久久久高潮 | 日韩高清免费在线观看 | 天天操天天操天天操 | 久久精品免费观看 | 园产精品久久久久久久7电影 | 一区二区三区四区免费视频 | 欧美性高跟鞋xxxxhd | 天天干天天摸 | 久久五月天婷婷 | 日韩v在线91成人自拍 | 国产精品都在这里 | 亚洲国产日韩一区 | 婷婷精品在线视频 | 欧美精品乱码久久久久久 | 日韩免费高清在线观看 | 国产精品久免费的黄网站 | 日韩久久精品一区二区 | 黄a网站 | 亚洲午夜剧场 | 伊人看片 | 又黄又爽又色无遮挡免费 | 在线看一级片 | 五月婷婷综合在线视频 | 99久久视频| 免费观看全黄做爰大片国产 | 国产亚洲精品日韩在线tv黄 | 国产亚洲精品福利 | 久久av高清 | 91成年人视频| 精品日韩在线一区 | 日韩在线观看电影 | 日本公妇色中文字幕 | 91av蜜桃 | 国产福利不卡视频 | 91九色在线视频 | 在线亚洲欧美视频 | 精品久久久成人 | 国产亚洲永久域名 | 国产.精品.日韩.另类.中文.在线.播放 | 久久草网 | 国产精品久久久久久一区二区 | www黄色软件 | 亚洲在线网址 | 国产精品亚洲片夜色在线 | 久久视频免费在线 | 香蕉视频免费在线播放 | 麻豆视传媒官网免费观看 | 国产一区二区在线免费视频 | 国产精品久久久免费 | 麻豆视频在线免费 | 欧美精品第一 | 成人av高清在线观看 | 欧美日韩xxxxx | 高潮久久久久久 | 国产成人精品一区二区三区免费 | 色婷婷国产| 日韩在线视频国产 | 国产欧美综合在线观看 | 97视频免费在线观看 | 欧美大片www | 久久国产精品影视 | 色之综合网 | 亚洲精品色婷婷 | 五月婷婷欧美视频 | 绯色av一区 | 亚洲激情校园春色 | 亚洲视频精选 | 欧美小视频在线 | 久久综合久久久久88 | 欧美极品少妇xbxb性爽爽视频 | 久久国产一二区 | 日韩高清国产精品 | 91人人干| www.夜色321.com | 精品亚洲va在线va天堂资源站 | 亚州国产视频 | 中文字幕精品三级久久久 | 精品国产视频在线观看 | 国产精品免费久久久 | 亚洲婷婷综合色高清在线 | 久草香蕉在线视频 | 麻豆一区在线观看 | 色悠悠久久综合 | 天天天天干 | av 一区二区三区 | 夜夜骑首页| 韩国精品一区二区三区六区色诱 | 成年人黄色大片在线 | 亚洲电影一级黄 | 日韩免费视频在线观看 | 日韩激情中文字幕 | 99热精品国产 | 中文字幕网站视频在线 | 欧美大片第1页 | 在线免费观看不卡av | 伊人伊成久久人综合网站 | 国产录像在线观看 | 国产精品男女啪啪 | 草 免费视频 | 在线观看 国产 | 精品国内自产拍在线观看视频 | 91视频88av | 韩国av电影在线观看 | 亚洲最新精品 | 2021国产在线视频 | 在线观看一区 | 国产一级片网站 | 婷婷伊人五月 | 中文字幕888 | 丁香五婷 | 九九热久久免费视频 | 草久在线 | 国产一线在线 | 国产淫片免费看 | 日韩高清免费在线观看 | 999久久国产精品免费观看网站 | 国产尤物在线视频 | 久草视频在线免费播放 | 亚洲一级在线观看 | 久久免费视频在线观看30 | 丁香 久久 综合 | 国产美腿白丝袜足在线av | 99中文字幕在线观看 | 国产一卡二卡在线 | 亚洲国产小视频在线观看 | avlulu久久精品| 亚洲专区中文字幕 | 日本女人逼 | 免费网址你懂的 | 久久国产一区二区 | 激情综合电影网 | 亚洲国内精品视频 | 国产96在线观看 | 五月婷婷激情五月 | 天天玩天天操天天射 | 日韩精品一区二区在线观看视频 | 九九激情视频 | 69精品久久 | 日日夜夜爱 | 天天综合精品 | 高清有码中文字幕 | 成年人黄色免费看 | 91亚洲精品国产 | 国产日韩精品在线观看 | 精品婷婷 | 在线免费黄色av | 色婷婷九月 | 成人三级网站在线观看 | 又紧又大又爽精品一区二区 | 亚洲天堂va | 91日本在线播放 | www.五月天激情 | 久久视频在线观看 | 日韩综合视频在线观看 | 婷婷天天色| 久久任你操 | 欧美久久久久久久久久 | 丁香激情五月婷婷 | 去干成人网 | 婷婷九月激情 | 日韩黄色免费看 | 91麻豆免费版 | 国产成人在线综合 | 亚洲第一中文字幕 | 9久久精品 | 99精品亚洲 | 精品国产欧美一区二区 | 欧美国产高清 | 成人黄色大片在线观看 | 日韩一级黄色片 | 一区在线观看 | 久久99偷拍视频 | 日韩中文在线电影 | 亚洲精品国产视频 | 中字幕视频在线永久在线观看免费 | 亚洲精品成人网 | 91九色成人蝌蚪首页 | 91福利免费 | www.97色.com| 久久视频免费观看 | 日韩精品网址 | 亚洲电影图片小说 | 亚洲精品www久久久久久 | 色丁香综合 | 日韩有码在线观看视频 | 婷婷激情综合五月天 | 久久一精品 | 国产一区二区在线观看视频 | 国产流白浆高潮在线观看 | 伊人宗合网 | 日韩久久视频 | 国产一区二区精品久久91 | 久草网视频在线观看 | 亚洲一区二区视频在线播放 | 国产成人一区二区精品非洲 | 亚洲精品五月天 | 国产视频 久久久 | 色综合久久88色综合天天6 | 国产一级精品在线观看 | 亚洲全部视频 | 狠狠干五月天 | av电影在线不卡 | 久草在线观看资源 | 91成人短视频在线观看 | 欧美日韩91 | 成人在线观看资源 | 日日干天天操 | 欧美九九视频 | ,午夜性刺激免费看视频 | av成年人电影 | 久久综合狠狠综合久久狠狠色综合 | 成人免费一区二区三区在线观看 | 少妇超碰在线 | 亚洲闷骚少妇在线观看网站 | 国产精品 日本 | 国产高清av | 91视频网址入口 | 国产精品麻豆91 | 久久国产欧美日韩精品 | 九九热精品在线 | 精品久久久久久亚洲综合网 | 狠狠干夜夜操天天爽 | 婷婷精品国产欧美精品亚洲人人爽 | 毛片一区二区 | 日韩一区二区三区不卡 | 四川bbb搡bbb爽爽视频 | 久久精品免费观看 | 久艹视频在线观看 | 亚洲精品午夜aaa久久久 | 在线免费观看的av网站 | 亚洲人成人在线 | 日韩精品不卡在线观看 | 99精品视频一区 | 国产在线免费av | 成av人电影 | 欧美性色网站 | japanesexxx乱女另类 | 亚洲精品美女久久久久网站 | 国产伦理久久精品久久久久_ | 夜夜操天天干, | 国产理伦在线 | 成人va视频| 国产精品久久久久免费 | 亚洲人久久久 | 超碰人人av | 日韩乱色精品一区二区 | 日韩av一区二区在线影视 | 精精国产xxxx视频在线播放 | 久久久久久久久影视 | 国产精品免费在线观看视频 | 中文字幕亚洲五码 | 黄色一级大片免费看 | 欧美日韩视频在线观看一区二区 | 久久久高清一区二区三区 | 韩日精品在线观看 | 日韩精品免费一区二区三区 | 久久国产精品系列 | 天天操天天操天天操天天 | 91久久奴性调教 | 国产精品一区二区在线观看免费 | 久久视频这里有精品 | 国产精品激情在线观看 | 久久精品人 | 亚洲国产电影在线观看 | 国产精品毛片一区二区三区 | 狠狠狠狠狠狠狠干 | 久久国产精品视频观看 | 99热这里精品 | 日韩黄色免费 | 午夜视频欧美 | 国产精品va在线 | 久久国产精品99国产精 | 日日干干夜夜 | 91视频在线观看下载 | 欧美精品久久 | 99久久99久久精品免费 | 日韩手机视频 | 狠狠色婷婷丁香六月 | 91精品视屏| 观看免费av | 久久人人爽人人爽人人片av免费 | 久久免费精彩视频 | www.神马久久 | 99视频免费 | 久久精品99久久 | a在线免费观看视频 | 天天干.com| 久久久久久久网 | 亚洲精品婷婷 | 在线观看一级视频 | 特级西西444www高清大视频 | 中文字幕在线久一本久 | 99电影| 欧美特一级片 | 亚洲视频一区二区三区在线观看 | 欧美精品一区二区三区四区在线 | 不卡视频国产 | 精品一区二区三区久久久 | 亚洲乱码在线观看 | 国产乱对白刺激视频在线观看女王 | 六月丁香久久 | 国产黄色大片免费看 | 国产 日韩 在线 亚洲 字幕 中文 | av网站播放 | 丁香午夜 | 久久国产一二区 | 中国精品一区二区 | 精品久久久久久久久久久久 | 成人网在线免费视频 | 最新日韩精品 | 亚洲精品人人 | 国产h在线播放 | 亚洲一二三在线 | 久久免费在线观看视频 | 日日爽天天 | 精品99久久| 国产精品99久久久久久久久久久久 | 国产精品成人一区 | 国产精品xxxx18a99 | 九九99 | 91尤物国产尤物福利在线播放 | 在线播放日韩av | 丁香免费视频 | 国产精品一区二区三区在线看 | 天天在线视频色 | 亚洲国产精品女人久久久 | 亚洲蜜桃av | 一区二区久久久久 | 在线观看片 | 国产高清精品在线观看 | 国内精品久久久久影院一蜜桃 | 中文字幕丰满人伦在线 | 国产电影黄色av | 亚洲国产精品电影 | 日韩欧美一区二区三区在线 | 免费三级网 | 欧美成人性战久久 | 天天操夜夜摸 | 成人小视频免费在线观看 | 亚洲最大在线视频 | 首页中文字幕 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产精品a久久久久 | 99爱视频| 五月婷婷中文网 | 久久视影 | 91最新在线视频 | 91视频在线国产 | 在线中文字幕一区二区 | 一区二区三区高清在线观看 | 欧美精品久久久久久久久久久 | 天天爽夜夜爽人人爽曰av | 91福利视频免费观看 | 一区二区三区影院 | 国内精品视频免费 | 国产又粗又猛又爽又黄的视频先 | 99视频在线精品国自产拍免费观看 | 久操免费视频 | 91精品人成在线观看 | 狠狠操综合| 天天天天色射综合 | 五月婷在线播放 | 亚洲精品国产精品乱码在线观看 | 99视频网站| 日韩网站在线看片你懂的 | 国产69久久久欧美一级 | 四月婷婷在线观看 | 欧美激情精品久久久久久免费 | 国产精品久久久久久久7电影 | 91探花视频 | 久久久久成人免费 | 国产精品综合在线观看 | 欧美精品你懂的 | 色多多视频在线观看 | 国产精品久久久久久久久久免费看 | 成人9ⅰ免费影视网站 | 午夜成人免费影院 | 亚洲精品黄色片 | 国产中文字幕三区 | 综合在线观看 | 久草在线视频首页 | 欧美在线a视频 | 国产精品免费久久久久久久久久中文 | 久99久久 | 1000部18岁以下禁看视频 | 日韩久久久久久久 | 中文字幕一区二区三区精华液 | 97电影手机| 黄色小说视频在线 | 精品福利网 | 蜜臀av网站 | 国产一区视频导航 | 国产黄免费看 | 97操碰| 99精品视频在线观看免费 | 国产精品毛片网 | 色婷婷一区 | 日日婷婷夜日日天干 | 免费97视频 | 91成版人在线观看入口 | 日韩免费观看一区二区三区 | 国产精品免费观看视频 | 五月婷婷一区二区三区 | 91精品国产电影 | 久草在线手机观看 | 日日夜夜精品免费 | 日韩av高清在线观看 | 成人一级黄色片 | 国产成人精品女人久久久 | 免费色网站 | 亚洲精品伦理在线 | 日韩在线中文字幕视频 | 国产久草在线 | 97超碰色偷偷 | 免费福利视频导航 | 日韩大片在线免费观看 | 成人一区二区三区在线 | japanese黑人亚洲人4k | 亚洲精品视频www | 黄色大全免费观看 | 91视频首页 | 超碰97人人射妻 | 在线观看精品一区 | 中文国产字幕 | 欧美韩国日本在线 | 成人在线电影观看 | 欧美一区二区免费在线观看 | 久久精品在线免费观看 | 免费看黄色小说的网站 | 黄色在线观看免费 | 香蕉97视频观看在线观看 | 免费看色的网站 | 亚洲理论在线观看 | 日韩毛片在线一区二区毛片 | 成人免费大片黄在线播放 | 日韩一区在线播放 | 午夜视频不卡 | 日韩精品在线看 | 麻豆免费视频网站 | 久草在线免费看视频 | 综合色站 | 婷婷网址 | 免费在线观看毛片网站 | 最新国产一区二区三区 | 久久久久免费看 | 91探花视频| 精品国内自产拍在线观看视频 | 婷婷久久综合网 | 在线观看色网站 | 欧美男同视频网站 | 欧美精品在线观看 | 一区二区三区影院 | 激情 婷婷 | 99热最新网址 | 日韩中文三级 | 国产一级高清 | 亚洲春色综合另类校园电影 | 亚州精品天堂中文字幕 | 国产成人精品一区二 | 91手机在线看片 | 亚洲午夜久久久久久久久 | 日韩黄视频 | 国产专区日韩专区 | 五月婷网 | 国产护士hd高朝护士1 | 日韩精品一区二区三区三炮视频 | 91九色国产在线 | 国产黄影院色大全免费 | 97精产国品一二三产区在线 | 国产精品久久久久久麻豆一区 | 免费一级片在线 | 97日日碰人人模人人澡分享吧 | 亚洲一二三在线 | 成人av一区二区在线观看 | 高清中文字幕 | 久久免费视频在线观看 | 欧美日韩在线电影 | 久久免费精品国产 | 九九九热精品免费视频观看 | 国产亚洲视频在线免费观看 | 国产视频中文字幕在线观看 | 久久噜噜少妇网站 | 国产视频欧美视频 | 中文在线 | 最新91在线视频 | 亚洲成年人在线播放 | 草久热| 国产免费人成xvideos视频 | 亚洲视屏一区 | 中文字幕一区二区三区四区在线视频 | 99精品亚洲 | 黄色av观看| 国产精品久久久久久久久久妇女 | 国产成人久久av977小说 | 99精品观看| 国产色黄网站 | 四虎影视成人精品国库在线观看 | 久久免费国产精品 | 狠狠色丁香久久综合网 | 国产精品乱码一区二三区 | 超碰国产97 | 久久婷亚洲五月一区天天躁 | 精品一区二区在线观看 | 久久99国产一区二区三区 | 欧美日韩精品免费观看视频 | 91网址在线 | 国产精品福利久久久 | 久久免费视频这里只有精品 | 天天操夜夜想 | 精品无人国产偷自产在线 | 在线观看成人福利 | av资源在线观看 | 色婷婷综合视频在线观看 | 久草在线这里只有精品 | 成人app在线免费观看 | 999久久 | 狠狠狠色丁香综合久久天下网 | 黄色av网站在线观看免费 | 久久久久久免费视频 | 婷婷精品国产一区二区三区日韩 | 国内精品久久久久影院日本资源 | 久久av免费观看 | 欧美性色xo影院 | 欧美91视频 | 韩国精品在线 | 久久99九九99精品 | 97成人精品视频在线观看 | 国产一级a毛片视频爆浆 | www.夜色321.com | 97视频免费在线观看 | 久草免费看 | 亚洲天天看 | 一区三区视频 | 国产又粗又猛又黄又爽的视频 | 不卡电影免费在线播放一区 | 91九色蝌蚪在线 | 久久久久久久久久久免费av | 日韩欧美综合精品 | 久综合网 | 久久久国产毛片 | 久久久穴| 色狠狠一区二区 | 久草a在线 | 深夜免费网站 | 中文字幕电影高清在线观看 | 国产中文字幕在线免费观看 | 欧美一区二区精品在线 | 99精品视频免费观看视频 | 91大片网站 | 欧美亚洲成人免费 | 免费看的国产视频网站 | 中文字幕高清在线 | 国产一级片久久 | 97在线视频免费 | 亚洲欧洲日韩 | 国产成人精品在线播放 | 久久视频在线观看中文字幕 | 精品久久一区 | 欧美韩日视频 | 欧美激情精品久久久久久免费印度 | 五月开心网 | 欧美ⅹxxxxxx | 欧美日韩aa | 午夜精品视频一区二区三区在线看 | 在线综合色 | 激情综合国产 | www好男人 | 91免费在线视频 | 免费看的av片| 欧美作爱视频 | 热久久视久久精品18亚洲精品 | 亚洲永久精品国产 | 成年人在线看片 | 一区视频在线 | 91av视频在线观看 | 四虎5151久久欧美毛片 | 日本大尺码专区mv | 久久精品人人做人人综合老师 | 欧美一级乱黄 | 日韩视频在线观看免费 | 久久人人爽人人人人片 | 91污在线观看 | 免费av片在线 | 久久99精品国产99久久6尤 | 国产偷在线 | 久久久久国产一区二区三区 | 激情视频二区 | 国产高清在线免费 | 免费视频三区 | free. 性欧美.com | 久久九九久久九九 | 国产一级特黄电影 | 久久国产一区二区 | 91福利视频在线 | 在线观看免费 | 免费视频久久久 | 精久久久久 | 日韩中文字幕第一页 | 极品嫩模被强到高潮呻吟91 | 超碰97国产精品人人cao | 欧美日韩久久久 | 免费日p视频 | 欧美日韩国产综合一区二区 | 亚洲狠狠操 | 久热色超碰 | 中文字幕乱码电影 | 波多野结衣最新 | 日韩a级免费视频 | 日韩精品中文字幕一区二区 | 国产中文字幕视频在线观看 | 欧美性极品xxxx做受 | 天堂av色婷婷一区二区三区 | 成年人视频在线免费 | avav片| 久久婷婷精品 | 久久三级视频 | 4438全国亚洲精品在线观看视频 | 人人艹视频 | 日韩免费视频网站 | 91av在线免费播放 | 在线中文字幕av观看 | 精品久久久久一区二区国产 | 国产伦理一区二区 | 91福利社区在线观看 | 中文字幕成人在线 | 中文字幕一区在线观看视频 | 国产精品一区二区三区在线免费观看 | 在线免费中文字幕 | www.天天干.com | 日本韩国中文字幕 | 99久久婷婷国产综合亚洲 | 婷婷午夜 | 亚洲精选在线观看 | 丝袜制服天堂 | 亚洲视频在线观看免费 | 国产福利一区二区三区视频 | 精品视频久久 | 人人干天天干 | 在线精品视频免费观看 | 狠色狠色综合久久 | 九九久久精品 | 国产精品久久久久久久av大片 | 国产一级免费片 | 国产精品久久久久999 | 国产日韩欧美网站 | 日韩av中文字幕在线免费观看 | 成人久久久精品国产乱码一区二区 | av中文字幕第一页 | 成人黄色中文字幕 | 五月婷婷播播 | www.夜色321.com | 正在播放日韩 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久亚洲美女 | 亚洲,播放| 九色最新网址 | 青青草在久久免费久久免费 | 狠狠色噜噜狠狠狠合久 | 天天天插 | 国产精品18久久久久vr手机版特色 | 成人va视频 | 国产精品女人久久久 | 在线 国产一区 | 国产一在线精品一区在线观看 | 91成人精品一区在线播放69 | 国产vs久久| 免费视频xnxx com | 一区二区三区高清在线 | 怡红院av久久久久久久 | 日韩欧美网址 | 国产高清视频免费观看 | 久操中文字幕在线观看 | 日韩毛片在线免费观看 | 91精品国产自产老师啪 | 国产亚洲欧洲 | 少妇bbw撒尿 | 涩av在线| 人人dvd| 最新日韩在线 | 欧美老人xxxx18 | 天天爱天天 | 日韩精品一二三 | 精品乱码一区二区三四区 | 国产 日韩 中文字幕 | 国产成人三级在线 | 成人久久 | 天天久久综合 | 婷婷色在线视频 | 国产视频二区三区 | 国产亚洲人成网站在线观看 | 国产精品一区二区免费 | 国产高清福利在线 | 国产精品 999 | 亚洲精品一区二区三区四区高清 | 911国产精品| 亚洲第五色综合网 | 九九视频免费在线观看 | 中文字幕高清视频 | 免费在线观看中文字幕 | 高清免费av在线 | 欧美aⅴ在线观看 | 香蕉在线视频观看 | 99久久99久久精品国产片果冰 | 欧美日韩在线精品一区二区 | 日韩精品久久久久久久电影竹菊 | 韩国av在线 | 久久黄色网址 | 日韩欧美一区二区三区在线观看 | 美女视频是黄的免费观看 | 日本一区二区三区免费观看 | 婷婷六月天在线 | 97色涩| 在线观看av黄色 | 日韩高清不卡一区二区三区 | 久久综合精品一区 | 在线免费观看麻豆 | 国产日韩欧美视频在线观看 | 欧美日韩在线免费视频 | 99精品视频99 | 亚洲精选在线 | 五月婷婷久久丁香 | 西西444www | 色综合国产 | 九九精品无码 | 久久综合射 | 久久一区国产 | 午夜精品久久久久久久99婷婷 | 99久久婷婷国产综合亚洲 | 99久久成人 | 一区二区精品视频 | 91成人免费在线视频 | 精品久久久久久久久久久久久久久久久久 | 免费观看v片在线观看 | 亚洲人成综合 | 久操视频在线播放 | 欧美精品做受xxx性少妇 | 日韩欧美在线观看一区二区三区 | 99久久精品国产一区 | 久久a国产 | 国产成人精品综合久久久 | 91传媒免费观看 | 少妇高潮冒白浆 | 亚洲激情一区二区三区 | 四虎影院在线观看av | av亚洲产国偷v产偷v自拍小说 | 久久久国产精品一区二区中文 | 精品国产黄色片 | 国产成人一区二区三区电影 | 久久久久久久国产精品影院 | 黄色视屏在线免费观看 | 久草免费色站 | 久久精品一区二区 | www.国产高清 | 亚洲男人天堂a | 久久综合久久鬼 | 国产精品一区一区三区 | 国产美女网 | 精品视频在线视频 | 日本夜夜草视频网站 | 国产一区自拍视频 | 日韩免费一区二区三区 | 色多多在线观看 | 亚洲精品tv久久久久久久久久 | 91九色性视频 | 91丨porny丨九色| 日韩videos| 欧美伦理一区二区三区 | 人人视频网站 | 亚洲精品国偷拍自产在线观看 | 久久精品99国产精品亚洲最刺激 | 久久综合久久综合九色 | 夜夜躁狠狠燥 | 日本激情中文字幕 | av夜夜操| 99久久99久久免费精品蜜臀 | 日韩一三区 | 99热99热| 中文视频在线播放 | 精品国产一区二区三区在线 | 色婷婷福利视频 | 亚洲91视频 | 精品一区电影国产 | 天天操狠狠干 | 91精品国产高清自在线观看 | 成人午夜影视 | 天天干天天拍天天操天天拍 | 美女视频黄网站 | 中文字幕区 | 91麻豆精品国产午夜天堂 | 91视频国产免费 | 国产视频一区二区在线播放 | 国产不卡网站 | 男女日麻批 | 97偷拍在线视频 | 国产黄a三级三级 | 久久精品日产第一区二区三区乱码 | 成人精品视频久久久久 | 久热爱| 国产精品日韩高清 | 国产一区不卡在线 | 国产九九九精品视频 | 婷婷av综合|