精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Flink SQL知其所以然:Flink SQLTumble Window 的奇妙解析之路

數據庫 其他數據庫
本文主要介紹了 tumble window 聚合類指標的常見場景案例以及其底層運行原理。而且也介紹了在查看 flink sql 任務時的一些技巧。

[[423315]]

1.序篇-本文結構

針對 datastream api 大家都比較熟悉了,還是那句話,在 datastream 中,你寫的代碼邏輯是什么樣的,它最終的執行方式就是什么樣的。

但是對于 flink sql 的執行過程,大家還是不熟悉的。上節使用 ETL,group agg(sum,count等)簡單聚合類 query 帶大家走進一條 flink sql query 邏輯的世界。幫大家至少能夠熟悉在 flink sql 程序運行時知道 flink 程序在干什么。

此節就是窗口聚合章節的第一篇,以一個最簡單、最常用的分鐘 tumble window 聚合案例給大家介紹其使用方式和原理。

由于 flink 1.13 引入了 window tvf,所以 1.13 和 1.12 及之前版本的實現不同。本節先介紹 flink 1.12 及之前的 tumble window 實現。這也是大家在引入 flink sql 能力時最常使用的。

本節依然從以下幾個章節給大家詳細介紹 flink sql 的能力。

1.目標篇-本文能幫助大家了解 flink sql 什么?

  • 回顧上節的 flink sql 適用場景的結論

2.概念篇-先聊聊常見的窗口聚合

  • 窗口竟然拖慢數據產出?
  • 常用的窗口

3.實戰篇-簡單的 tumble window 案例和運行原理

  • 先看一個 datastream 窗口案例
  • flink sql tumble window 的語義
  • tumble window 實際案例
  • GeneratedWatermarkGenerator - flink 1.12.1
  • BinaryRowDataKeySelector - flink 1.12.1
  • AggregateWindowOperator - flink 1.12.1

4.總結與展望篇

先說說結論,以下這些結論已經在上節說過了,此處附上上節文章:

場景問題:flink sql 很適合簡單 ETL,以及基本全部場景下的聚合類指標(本節要介紹的 tumble window 就在聚合類指標的范疇之內)。

語法問題:flink sql 語法其實是和其他 sql 語法基本一致的。基本不會產生語法問題阻礙使用 flink sql。但是本節要介紹的 tumble window 的語法就是略有不同的那部分。下面詳細介紹。

運行問題:查看 flink sql 任務時的一些技巧,以及其中一些可能會碰到的坑:

  • 去 flink webui 就能看到這個任務目前在做什么。包括算子名稱都會給直接展示給我們目前哪個算子在干啥事情,在處理啥邏輯。
  • sql 的 watermark 類型要設置為 TIMESTAMP(3)。
  • 事件時間邏輯中,sql api 和 datastream api 對于數據記錄時間戳存儲邏輯是不一樣的。datastream api:每條記錄的 rowtime 是放在 StreamRecord 中的時間戳字段中的。sql api:時間戳是每次都從數據中進行獲取的。算子中會維護一個下標。可以按照下標從數據中獲取時間戳。

2.目標篇-本文能幫助大家了解 flink sql tumble window 什么?

關于 flink sql tumble window 一般都會有以下問題。本文的目標也是為大家解答這些問題:

場景問題:場景問題就不必多說,datastream 在 tumble window 場景下的應用很多了,分鐘級別聚合等常用場景

語法問題:flink sql 寫 tumble window 任務時是一種與 hive sql 中沒有的語法。下文詳細介紹。

運行問題:使用一條簡單的 tumble window sql 幫大家從 transformation、runtime 幫大家理解 tumble window 的整體運行機制。

理解誤區:既然是 sql 必然要遵循 sql 語義,sql tumble window 聚合是輸入多條,產出一條數據。并不像 datastream 那樣可以在窗口 udf 中做到多對多。

在正式開始聊 tumble window 之前,先看看上節 flink sql 適用場景的結論。讓大家先有 flink sql 的一個整體印象以及結論。

2.1.回顧上節的 flink sql 適用場景的結論

不裝了,我坦白了,flink sql 其實很適合干的活就是 dwd 清洗,dws 聚合。

此處主要針對實時數倉的場景來說。flink sql 能干 dwd 清洗,dws 聚合,基本上實時數倉的大多數場景都能給覆蓋了。

flink sql 牛逼!!!

但是!!!

經過博主使用 flink sql 經驗來看,并不是所有的 dwd,dws 聚合場景都適合 flink sql(截止發文階段來說)!!!

其實這些目前不適合 flink sql 的場景總結下來就是在處理上比 datastream 還是會有一定的損失。

先總結下使用場景:

1. dwd:簡單的清洗、復雜的清洗、維度的擴充、各種 udf 的使用

2. dws:各類聚合

然后分適合的場景和不適合的場景來說,因為只這一篇不能覆蓋所有的內容,所以本文此處先大致給個結論,之后會結合具體的場景詳細描述。

適合的場景:

簡單的 dwd 清洗場景

全場景的 dws 聚合場景

目前不太適合的場景:

復雜的 dwd 清洗場景:舉例比如使用了很多 udf 清洗,尤其是使用很多的 json 類解析清洗

關聯維度場景:舉例比如 datastream 中經常會有攢一批數據批量訪問外部接口的場景,flink sql 目前對于這種場景雖然有 localcache、異步訪問能力,但是依然還是一條一條訪問外部緩存,這樣相比批量訪問還是會有性能差距。

3.概念篇-先聊聊常見的窗口聚合

窗口聚合大家都在 datastream api 中很熟悉了,目前在實時數據處理的過程中,窗口計算可以說是最重要、最常用的一種計算方式了。

但是在拋出窗口概念之前,博主有幾個關于窗口的小想法說一下。

3.1.窗口竟然拖慢數據產出?

一個小想法。

先拋結論:窗口會拖慢實時數據的產出,是在目前下游分析引擎能力有限的情況下的一種妥協方案。

站在數據開發以及需求方的世界中,當然希望所有的數據都是實時來的,實時處理的,實時產出的,實時展現的。

舉個例子:如果你要滿足一個一分鐘窗口聚合的 pv,uv,或者其他聚合需求。

olap 數據服務引擎 就可以滿足上述的實時來的,實時處理的,實時產出的,實時展現的的場景。flink 消費處理明細數據,產出到 kafka,然后直接導入到 olap 引擎中。查詢時直接用 olap 做聚合。這其中是沒有任何窗口的概念的。但是整個鏈路中,要保障端對端精確一次,要保障大數據量情況下 olap 引擎能夠秒級查詢返回,更何況有一些去重類指標的計算,等等場景。把這些壓力都放在 olap 引擎的壓力是很大的。

因此在 flink 數據計算引擎中就誕生了窗口的概念。我們可以直接在計算引擎中進行窗口聚合計算,然后等到窗口結束之后直接把結果數據產出。這就出現了博主所說的窗口拖慢了實時數據產出的情況。而且窗口在處理不好的情況下可能會導致數據丟失。

關于上述兩種情況的具體優劣選擇,都由大家自行選擇。上述只是引出博主一些想法。

3.2.常用的窗口

目前已知的窗口分為以下四種。

1. Tumble Windows2. Hop Windows3. Cumulate Windows4. Session Windows

這些窗口的具體描述直接見官網,有詳細的說明。此處不贅述。

https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/table/sql/queries/window-agg/

此處介紹下 flink 中常常會涉及到的兩個容易混淆的概念就是:窗口 + key。這里來形象的說明下。

窗口:時間周期上面的劃分。將無限流進行縱向切分,將無限流切分為一個一個的窗口,窗口相當于是無限流中的一段時間內的數據。

key:數據類別上面的劃分。將無限流進行橫向劃分,相同 key 的數據會被劃分到一組中,這個 key 的數據也是一條無限流。

如下圖所示。

4.實戰篇-簡單的 tumble window 案例和運行原理

源碼公眾號后臺回復flink sql tumble window 的奇妙解析之路獲取。

4.1.先看一個 datastream 窗口案例

在介紹 sql tumble window 窗口算子執行案例之前,先看一個 datastream 中的窗口算子案例。其邏輯都是相通的。會對我們了解 sql tumble window 算子有幫助。

我們先看看 datastream 處理邏輯。

以下面這個為例。

  1. public class _04_TumbleWindowTest { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.  
  5.         StreamExecutionEnvironment env = 
  6.                 StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration()); 
  7.  
  8.         env.setParallelism(1); 
  9.  
  10.         env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); 
  11.  
  12.         env.addSource(new UserDefinedSource()) 
  13.                 .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Tuple4<String, String, Integer, Long>>(Time.seconds(0)) { 
  14.                     @Override 
  15.                     public long extractTimestamp(Tuple4<String, String, Integer, Long> element) { 
  16.                         return element.f3; 
  17.                     } 
  18.                 }) 
  19.                 .keyBy(new KeySelector<Tuple4<String, String, Integer, Long>, String>() { 
  20.                     @Override 
  21.                     public String getKey(Tuple4<String, String, Integer, Long> row) throws Exception { 
  22.                         return row.f0; 
  23.                     } 
  24.                 }) 
  25.                 .window(TumblingEventTimeWindows.of(Time.seconds(10))) 
  26.                 .sum(2) 
  27.                 .print(); 
  28.  
  29.         env.execute("1.12.1 DataStream TUMBLE WINDOW 案例"); 
  30.     } 
  31.  
  32.     private static class UserDefinedSource implements SourceFunction<Tuple4<String, String, Integer, Long>> { 
  33.  
  34.         private volatile boolean isCancel; 
  35.  
  36.         @Override 
  37.         public void run(SourceContext<Tuple4<String, String, Integer, Long>> sourceContext) throws Exception { 
  38.  
  39.             while (!this.isCancel) { 
  40.  
  41.                 sourceContext.collect(Tuple4.of("a""b", 1, System.currentTimeMillis())); 
  42.  
  43.                 Thread.sleep(10L); 
  44.             } 
  45.  
  46.         } 
  47.  
  48.         @Override 
  49.         public void cancel() { 
  50.             this.isCancel = true
  51.         } 
  52.     } 

datastream 生產的具體的 transformation 如下圖:

其中我們只關注最重要的 WindowOperator 算子。

其中 WindowOperator 算子包含的重要屬性如下圖。

來看看 WindowOperator 的執行邏輯。窗口執行的整體詳細流程可以參考:http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/

4.2.flink sql tumble window 的語義

介紹到 tumble window 的語義,總要有對比的去介紹。這里的參照物就是 datastream api。

在 datastream api 中。tumble window 一般用作以下兩種場景。

業務場景:使用 tumble window 很輕松的計算出窗口內的聚合數據。一般是多條輸入數據,窗口結束時一條輸出數據。

優化場景:窗口聚合一批數據然后批量訪問外部存儲擴充維度、或者有一些自定義的處理邏輯。一般是多條輸入數據,窗口結束時多條輸出數據。

但是在 sql api 中。tumble window 是聚合(group by)語義,聚合在 sql 標準中的數據處理邏輯是多條輸入,在窗口觸發時就輸出一條數據的語義。而上面的常常用在 datastream 中的優化場景是多對多的場景。因此和 sql 語義不符合。所以 flink sql tumble window 一般都是用于計算聚合運算值來使用。

4.3.tumble window 實際案例

滾動窗口的特性就是會將無限流進行縱向劃分成一個一個的窗口,每個窗口都是相同的大小,并且不重疊。

本文主要介紹 flink 1.12 及之前版本的實現。下一篇文章介紹 flink 1.13 的實現。

來,在介紹原理之前,總要先用起來,我們就以下面這個例子展開。

1.(flink 1.12.1)場景:簡單且常見的分維度分鐘級別同時在線用戶數、總銷售額

數據源表:

  1. CREATE TABLE source_table ( 
  2.     -- 維度數據 
  3.     dim STRING, 
  4.     -- 用戶 id 
  5.     user_id BIGINT
  6.     -- 用戶 
  7.     price BIGINT
  8.     -- 事件時間戳 
  9.     row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)), 
  10.     -- watermark 設置 
  11.     WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND 
  12. WITH ( 
  13.   'connector' = 'datagen'
  14.   'rows-per-second' = '10'
  15.   'fields.dim.length' = '1'
  16.   'fields.user_id.min' = '1'
  17.   'fields.user_id.max' = '100000'
  18.   'fields.price.min' = '1'
  19.   'fields.price.max' = '100000' 
  • Notes - 關于 watermark 容易踩得坑:sql 的 watermark 類型必須要設置為 TIMESTAMP(3)。

數據匯表:

  1. CREATE TABLE sink_table ( 
  2.     dim STRING, 
  3.     pv BIGINT
  4.     sum_price BIGINT
  5.     max_price BIGINT
  6.     min_price BIGINT
  7.     uv BIGINT
  8.     window_start bigint 
  9. WITH ( 
  10.   'connector' = 'print' 

數據處理邏輯:

可以看下下面語法,窗口聚合的寫法有專門的 tumble(row_time, interval '1' minute) 寫法,這就是與平常我們寫的 hive sql,mysql 等不一樣的地方。

  1. insert into sink_table 
  2. select dim, 
  3.        sum(bucket_pv) as pv, 
  4.        sum(bucket_sum_price) as sum_price, 
  5.        max(bucket_max_price) as max_price, 
  6.        min(bucket_min_price) as min_price, 
  7.        sum(bucket_uv) as uv, 
  8.        max(window_start) as window_start 
  9. from ( 
  10.      select dim, 
  11.             count(*) as bucket_pv, 
  12.             sum(price) as bucket_sum_price, 
  13.             max(price) as bucket_max_price, 
  14.             min(price) as bucket_min_price, 
  15.             -- 計算 uv 數 
  16.             count(distinct user_id) as bucket_uv, 
  17.             cast(tumble_start(row_time, interval '1' minuteas bigint) * 1000 as window_start 
  18.      from source_table 
  19.      group by 
  20.             -- 按照用戶 id 進行分桶,防止數據傾斜 
  21.             mod(user_id, 1024), 
  22.             dim, 
  23.             tumble(row_time, interval '1' minute
  24. group by dim, 
  25.          window_start 

2.運行:可以看到,其實在 flink sql 任務中,其會把對應的處理邏輯給寫到算子名稱上面。

  • Notes - 觀察 flink sql 技巧 1:這個其實就是我們觀察 flink sql 任務的第一個技巧。如果你想知道你的 flink 任務在干啥,第一反應是去 flink webui 看看這個任務目前在做什么。包括算子名稱都會給直接展示給我們目前哪個算子在干啥事情,在處理啥邏輯

先看一下整個算子圖,如下圖。從左到右總共分為三個算子。

第一個算子就是數據源算子

第二個算子就是分了桶的窗口聚合算子,第一個算子和第二個算子之間 hash 傳輸就是按照 group key 進行 hash 傳輸

第三個算子就是外層進行合桶計算的算子,同樣也是 hash 傳輸,將分桶的數據在一個算子中進行合并計算

來看看每一個算子具體做了什么事情。

第一個算子:

table scan 讀取數據源

從數據源中獲取對應的字段(包括源表定義的 rowtime)

分配 watermark(按照源表定義的 watermark 分配對應的 watermark)

將一些必要的字段抽取。比如 group by 中的字段。在 hash 時需要使用。

第二個算子:

窗口聚合,計算窗口聚合數據

將數據按照第一層 select 中的數據進行計算以及格式化

第三個算子:

group 聚合合桶計算

將數據按照第二層 select 中的數據進行計算以及格式化

將數據 sink 寫出

3.(flink 1.12.1)結果:

  1. +I(9,1,32682,32682,32682,1,1631026440000) 
  2. -U(9,1,32682,32682,32682,1,1631026440000) 
  3. +U(9,2,115351,82669,32682,2,1631026440000) 
  4. +I(2,1,76148,76148,76148,1,1631026440000) 
  5. +I(8,1,79321,79321,79321,1,1631026440000) 
  6. +I(a,1,85792,85792,85792,1,1631026440000) 
  7. +I(0,1,12858,12858,12858,1,1631026440000) 
  8. +I(5,1,36753,36753,36753,1,1631026440000) 
  9. +I(3,1,19218,19218,19218,1,1631026440000) 

4.(flink 1.12.1)原理:

關于 sql 開始運行的機制見上一節詳述。

此處只介紹相比前一節新增內容。可以看到上述代碼的具體 transformation 如下圖。

4.4.GeneratedWatermarkGenerator - flink 1.12.1

按照順序,首先看看 watermark 算子。同 datastream 的自定義 watermark 分配策略。

watermark 生成的具體代碼 WatermarkGenerator$6,主要獲取 watermark 的邏輯在 currentWatermark 方法中。如下圖。

4.5.BinaryRowDataKeySelector - flink 1.12.1

接著就是 group by(同 datastream 中的 keyby)。

group by key 生成的具體代碼 KeyProjection$19,主要邏輯在 apply 方法中。

下一個就是窗口聚合算子。

4.6.AggregateWindowOperator - flink 1.12.1

兄弟們!!!兄弟們!!!兄弟們!!!

本節的重頭戲來了。sql 窗口聚合算子解析搞起來了。

關于 WatermarkGenerator 和 KeyProjection 沒有什么可以詳細介紹的,都是輸入一條數據,輸出一條數據,邏輯很簡單。

但是窗口聚合算子的計算邏輯相比上面兩個算子復雜很多。窗口算子又承載了窗口聚合的主要邏輯,所以本文重點介紹窗口算子計算的邏輯。

先來看看 sql 窗口整體處理流程。其實與 datastream 處理流程基本一致,但只是少了 Evictor。如下圖所示。

接著來看看上述 sql 生成的窗口聚合算子 AggregateWindowOperator,截圖中屬性也很清晰。

具體生成的窗口聚合代碼 GroupingWindowAggsHandler$59。

計算邏輯 GroupingWindowAggsHandler$59#accumulate。

上面那段都是在 flink 客戶端初始化處理的。包括窗口算子的初始化等。

下面這段處理邏輯是在 flink TM 運行時開始執行的,包括窗口算子資源的初始化以及運行邏輯。就到了正式的數據處理環節了。

窗口算子 Task 運行。

窗口算子 Task 初始化。

StreamTask 整體的處理流程。

窗口算子 open 初始化。

窗口算子 open 初始化后的結果。如下圖,對應的具體組件。

初始化完成之后,開始處理具體數據。

循環 loop,一直 run 啊 run。

判斷記錄的具體類型,然后執行不同的邏輯。

來看看處理一條數據的 processElement 方法邏輯,進行 acc 處理。代碼中的的 windowAggregator 就是之前代碼生成的 GroupingWindowAggsHandler$59。

  • Notes:事件時間邏輯中,sql api 和 datastream api 對于數據記錄時間戳存儲邏輯是不一樣的。datastream api:每條記錄的 rowtime 是放在 StreamRecord 中的時間戳字段中的。sql api:時間戳是每次都從數據中進行獲取的。算子中會維護一個下標。可以按照下標從數據中獲取時間戳。

來看看 watermark 到達并且觸發窗口計算時,執行 onEventTime 邏輯。

觸發窗口計算時,onEventTime -> emitWindowResult,產出具體數據。

至此整個 sql tumble window 的處理邏輯也就很清楚了。和 datastream 基本上都是一致的。是不是整個邏輯就理清楚了。

5.總結與展望篇

本文主要介紹了 tumble window 聚合類指標的常見場景案例以及其底層運行原理。

而且也介紹了在查看 flink sql 任務時的一些技巧:

去 flink webui 就能看到這個任務目前在做什么。包括算子名稱都會給直接展示給我們目前哪個算子在干啥事情,在處理啥邏輯。

sql 的 watermark 類型要設置為 TIMESTAMP(3)。

事件時間邏輯中,sql api 和 datastream api 對于數據記錄時間戳存儲邏輯是不一樣的。datastream api:每條記錄的 rowtime 是放在 StreamRecord 中的時間戳字段中的。sql api:時間戳是每次都從數據中進行獲取的。算子中會維護一個下標。可以按照下標從數據中獲取時間戳。

本文轉載自微信公眾號「大數據羊說」

 

責任編輯:姜華 來源: 大數據羊說
相關推薦

2022-07-05 09:03:05

Flink SQLTopN

2022-05-22 10:02:32

CREATESQL 查詢SQL DDL

2022-05-18 09:02:28

Flink SQLSQL字符串

2022-05-15 09:57:59

Flink SQL時間語義

2022-06-10 09:01:04

OverFlinkSQL

2022-06-06 09:27:23

FlinkSQLGroup

2021-12-09 06:59:24

FlinkSQL 開發

2022-06-29 09:01:38

FlinkSQL時間屬性

2022-05-27 09:02:58

SQLHive語義

2022-05-12 09:02:47

Flink SQL數據類型

2021-11-28 11:36:08

SQL Flink Join

2022-08-10 10:05:29

FlinkSQL

2021-11-27 09:03:26

flink join數倉

2021-11-24 08:17:21

Flink SQLCumulate WiSQL

2021-12-17 07:54:16

Flink SQLTable DataStream

2022-06-18 09:26:00

Flink SQLJoin 操作

2021-12-06 07:15:47

開發Flink SQL

2021-12-13 07:57:47

Flink SQL Flink Hive Udf

2021-11-30 23:30:45

sql 性能異步

2022-05-09 09:03:04

SQL數據流數據
點贊
收藏

51CTO技術棧公眾號

免费精品视频一区| 国内精品久久久久久久| 欧美男女交配视频| 麻豆tv入口在线看| 成人福利在线看| 国产精品电影网站| 九九免费精品视频| 影视先锋久久| 日韩欧美中文一区二区| 久久久999免费视频| yiren22亚洲综合伊人22| 国产最新精品免费| 欧美在线观看视频| 天天综合天天做| 亚洲理论电影| 日韩精品一区二区三区老鸭窝 | 亚洲欧美日韩中文字幕在线观看| heyzo高清在线| 欧美国产乱子伦| 国产精品久久久久久免费观看| 男人天堂av在线播放| 久久久久午夜电影| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧美手机在线| 中文不卡1区2区3区| 亚洲人成亚洲人成在线观看图片| 欧美日韩在线观看一区| 精品区在线观看| 日本亚洲天堂网| 欧美一区二区三区免费观看| 外国一级黄色片| 精品久久美女| 国产视频久久久久久久| 亚洲精品一区二区18漫画| av成人亚洲| 色综合天天做天天爱| 大胆欧美熟妇xx| av在线1区2区| 国产午夜精品理论片a级大结局| 国产精品视频免费观看| 国产视频在线观看免费| 奇米色一区二区三区四区| 91av在线网站| av大片免费在线观看| 欧美日韩日本国产亚洲在线 | 中文字幕伦理免费在线视频 | av资源免费观看| 亚洲福利免费| 久久久久久久一区二区三区| 好吊日在线视频| 一区二区三区四区电影| 中文字幕日韩精品在线观看| 青青草福利视频| 欧美日韩一本| 精品五月天久久| 午夜一区二区三区免费| 精品国产乱子伦一区二区| 欧美xxxx在线观看| 欧美肉大捧一进一出免费视频 | 久久成人羞羞网站| 国产精品久久久久久网站 | 春色校园综合激情亚洲| 亚洲国产成人av好男人在线观看| 97中文字幕在线| 国产盗摄在线视频网站| 亚洲国产欧美另类丝袜| 999一区二区三区| 第一福利在线视频| 欧美日韩在线第一页| 日韩国产一级片| 欲香欲色天天天综合和网| 日韩欧美中文在线| 大香煮伊手机一区| 欧美激情不卡| 日韩一区二区在线观看视频播放| 少妇欧美激情一区二区三区| 91精品国产自产在线丝袜啪| 日韩大片免费观看视频播放| 成年人网站免费看| 成人影视亚洲图片在线| 久久视频免费观看| 国产一级大片在线观看| 国产乱码精品| 国产日韩欧美综合| 内射后入在线观看一区| 久久影院午夜论| 一区二区三区的久久的视频| 在线xxxx| 色综合久久中文字幕| 中文字幕成人在线视频| 91麻豆精品激情在线观看最新| 日韩av在线一区二区| www.99热| 很黄很黄激情成人| 国产成人+综合亚洲+天堂| 在线观看中文字幕av| 国产精品亚洲一区二区三区妖精 | 亚洲综合无码一区二区| 黄www在线观看| 国产一精品一av一免费爽爽| 亚洲第一二三四五区| 国产91丝袜美女在线播放| 欧美福利视频| 国产精品福利网| 亚洲免费一级片| 国产女人水真多18毛片18精品视频| 最近免费观看高清韩国日本大全| 国产在线精彩视频| 在线91免费看| 少妇av片在线观看| 一区在线免费观看| 成人疯狂猛交xxx| 青青色在线视频| 亚洲一二三四在线| 久久撸在线视频| 尤物tv在线精品| 久久男人资源视频| 国产99对白在线播放| 国产欧美精品一区二区色综合朱莉 | 亚洲一区二区精品久久av| 国产精品久久a| 亚洲精品亚洲人成在线观看| 欧美激情第1页| 91丨porny丨在线中文| 久久中文字幕电影| 国产精品专区在线| 久久久久久久久久久久电影| 一本色道久久88精品综合| 国产精品日日夜夜| 久久精品国产99久久6| 精品一区久久久| 伦xxxx在线| 色诱亚洲精品久久久久久| 噜噜噜久久亚洲精品国产品麻豆| 精品欧美视频| 一区二区亚洲精品国产| 欧美亚洲天堂网| 精品一二线国产| 欧洲亚洲一区| 亚洲夜夜综合| 91精品国产色综合久久| 国产亚洲精品熟女国产成人| 极品日韩av| 91久色国产| 免费超碰在线| 色婷婷综合激情| 91成年人网站| 亚洲一区二区伦理| 国产精品视频在线免费观看| 免费网站看v片在线a| 91国产福利在线| 永久免费毛片在线观看| 丝袜诱惑制服诱惑色一区在线观看| 成人国产一区二区| 日本在线视频www鲁啊鲁| 欧美巨大另类极品videosbest | 久久婷婷久久一区二区三区| 污污污污污污www网站免费| 9999精品| 久久综合色影院| 亚洲高清在线观看视频| 一区二区三区中文字幕精品精品| 日本免费色视频| 国产欧美日韩视频在线| 欧美专区中文字幕| 青青草免费在线| 欧美性xxxxxxx| 久久久无码人妻精品一区| 精品91在线| 成人在线资源网址| 色爱综合区网| 日韩亚洲欧美一区二区三区| 中文字幕在线有码| 国产盗摄视频一区二区三区| 亚洲精品国产精品久久| 9999在线精品视频| 久99久在线视频| 亚洲精品一区二区三区区别| 亚洲综合图片区| 星空大象在线观看免费播放| 红桃视频欧美| 精品国产_亚洲人成在线| 黄色影院在线看| 亚洲精品视频中文字幕| 午夜精品一区二| 中文字幕欧美激情| 超碰中文字幕在线观看| 欧美三级网页| 日本在线观看一区二区三区| 成人国产一区| 欧美成人午夜剧场免费观看| 欧美在线 | 亚洲| 亚洲男人天堂一区| 久久久久久婷婷| 视频在线观看91| 午夜午夜精品一区二区三区文| 另类视频一区二区三区| 国内精品久久影院| 噜噜噜噜噜在线视频| 欧美精品电影在线播放| 久久久久久久久久91| 91麻豆蜜桃一区二区三区| 在线观看免费亚洲| 欧美夫妇交换xxx| 一区二区三区国产盗摄| 亚洲日本japanese丝袜| 亚洲一区二区三区中文字幕在线观看 | 夜夜夜精品看看| 风间由美一二三区av片| 国内精品伊人久久久久影院对白| 欧洲精品在线播放| 欧美精品一区二区久久| 91在线视频一区| 忘忧草在线日韩www影院| 尤物yw午夜国产精品视频明星| 国产高潮流白浆喷水视频| 欧美日韩国产在线看| 亚洲欧美另类日本| 97精品视频在线观看自产线路二| 手机视频在线观看| 国产九九精品| 9191国产视频| 欧美日韩水蜜桃| 国产精品一区在线播放| 日本欧美在线| 4p变态网欧美系列| 宅男在线观看免费高清网站| 亚洲精品美女久久| 99精品国产99久久久久久97| 色综合一个色综合| 欧美美女性生活视频| 久久久久国产精品免费免费搜索| 亚洲在线观看网站| 久久五月激情| 成人黄色av片| 午夜亚洲福利| 成人黄色片免费| 91精品综合久久久久久久久久久 | 亚洲奶汁xxxx哺乳期| 欧美色国产精品| 在线天堂中文字幕| 精品久久久在线观看| 免费在线看黄网址| 国产精品久久一级| 天天爽天天爽天天爽| 久久久亚洲国产美女国产盗摄| 可以看的av网址| 精品一区二区三区免费观看| 久久艹国产精品| 亚洲精品123区| 奇米777四色影视在线看| 欧美色图国产精品| 欧美精品成人一区二区在线观看 | 欧美日本一道本在线视频| 免费看污视频的网站| 色综合天天狠狠| 国产一区二区99| 欧美日韩性生活视频| 日本一区二区网站| 亚洲小说欧美激情另类| 日韩黄色精品视频| 午夜精品福利一区二区三区蜜桃| 九九九在线视频| 亚洲一区二区三区四区的| 日韩在线一卡二卡| 亚洲综合丁香婷婷六月香| 午夜69成人做爰视频| 亚洲欧美日韩精品久久久久| 色哟哟一一国产精品| 国产精品午夜免费| 可以直接看的黄色网址| 怡红院av一区二区三区| 成人免费视频网站入口::| 一区二区三区视频在线观看| 国产成年人免费视频| 婷婷久久综合九色综合伊人色| 国产第100页| 天天综合网天天综合色| 五月天激情国产综合婷婷婷| 欧美色老头old∨ideo| 国产一区二区小视频| 欧美一区二区三区免费观看视频| www.爱爱.com| 亚洲第一精品久久忘忧草社区| 免费看黄网站在线观看| 亚洲色图美腿丝袜| 尤物视频在线免费观看| 久久影视免费观看| 俄罗斯一级**毛片在线播放| 国产91热爆ts人妖在线| 久久久久伊人| 99国产精品久久久久老师| 都市激情亚洲| 视频在线99| 欧美1区2区3区| 欧美精品一区二区三区三州| 久久一区视频| 四季av一区二区| 成人亚洲一区二区一| 久久精品成人av| 亚洲摸摸操操av| 日韩xxxxxxxxx| 51精品国自产在线| 日本黄色大片视频| 一区二区三区视频免费在线观看| 91国内在线| 国产日韩欧美视频| 国内自拍欧美| 中文网丁香综合网| 国产日韩欧美一区在线| 亚洲综合激情视频| 国产精品69久久久久水密桃| 免费不卡的av| 久久综合国产精品| 男人与禽猛交狂配| 日本高清视频一区二区| 人人妻人人玩人人澡人人爽| 一区二区三区回区在观看免费视频| 污视频在线看网站| 国产精品激情自拍| 中文字幕精品影院| 伊人网在线免费| 日韩av一二三| 亚洲一级av无码毛片精品| 国产精品免费av| 国产视频91在线| 欧美一区二区三区四区久久| 黄色片在线看| 97视频网站入口| 国产亚洲高清在线观看| 亚洲一区二区在| 国产亚洲一级| 美女流白浆视频| 中文字幕在线一区免费| 在线播放精品视频| 亚洲欧美另类国产| 1234区中文字幕在线观看| 92福利视频午夜1000合集在线观看| 欧美三级情趣内衣| 男人日女人bb视频| 波多野结衣在线一区| 欧美日韩黄色网| 在线免费观看不卡av| 香蕉视频免费在线看| 久久久久久久网站| 2020最新国产精品| 国产二区视频在线| 国产91精品一区二区麻豆网站| 国产午夜精品久久久久久久久| 亚洲va欧美va人人爽午夜| 性欧美videos另类hd| 久久精品一偷一偷国产| 久久国内精品| 国产91av视频在线观看| 男女性色大片免费观看一区二区| 精品无码人妻一区| 色系网站成人免费| 都市激情一区| 国产精品海角社区在线观看| 国产日产精品_国产精品毛片| 欧美变态另类刺激| 成人v精品蜜桃久久一区| 久久一级黄色片| 精品久久一二三区| 美女在线视频免费| 精品日产一区2区三区黄免费| 亚洲久久成人| 精品人妻伦一二三区久| 一二三区精品视频| 免费a视频在线观看| 国内外成人免费激情在线视频网站 | 中文幕一区二区三区久久蜜桃| 国产91av在线播放| 中文字幕久久久| 国产福利91精品一区二区| 午夜精品亚洲一区二区三区嫩草| 麻豆国产精品一区二区三区| 五月婷婷综合激情网| 日韩欧美一二三四区| 丰乳肥臀在线| 欧美精品在线一区| 国产日韩亚洲欧美精品| 毛片aaaaaa| 日韩久久久精品| 国产黄大片在线观看| 亚洲色图自拍| 国产成人免费视频一区| 国产污片在线观看| 亚洲精品97久久| 欧美成人福利| 欧美日韩视频免费| www国产亚洲精品久久麻豆| 91片黄在线观看喷潮| 欧美激情视频一区二区三区不卡| 国产精品极品国产中出| 日b视频免费观看| 国产午夜精品一区二区| 国产精品一区二区av白丝下载| 久久影视电视剧免费网站清宫辞电视| 日韩最新在线|