精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

www.91精品| 啊v在线视频| 在线视频亚洲| 亚洲欧美另类在线观看| 狠狠操狠狠干视频| 国产蜜臀在线| 欧美激情在线一区二区三区| 91色p视频在线| 六月丁香在线视频| 欧美va久久久噜噜噜久久| 欧美一级午夜免费电影| 色欲av无码一区二区人妻| 毛片在线不卡| 91日韩精品一区| 91欧美激情另类亚洲| 五月天综合激情网| 一本到12不卡视频在线dvd| 亚洲精品成人免费| 亚洲男人天堂2021| 亚洲第一二三四区| 亚洲国产综合人成综合网站| 日韩亚洲视频在线| 天天干天天插天天操| 精品在线亚洲视频| 日本精品久久久久影院| 国产一级在线视频| 亚洲一级毛片| 深夜福利91大全| 法国伦理少妇愉情| 国产精品中文字幕制服诱惑| 在线91免费看| 成人午夜激情av| 中日韩脚交footjobhd| 一区二区三区四区中文字幕| 欧美在线日韩精品| 婷婷色在线视频| 国产很黄免费观看久久| 91精品国产综合久久香蕉| 亚洲国产综合久久| 欧美精品福利| 欧美精品午夜视频| 99精品中文字幕| 激情五月综合| 亚洲区中文字幕| 可以直接看的无码av| 久久99精品国产自在现线| 欧美刺激午夜性久久久久久久| 天天干天天玩天天操| 高清成人在线| 在线精品国精品国产尤物884a| 国产一级爱c视频| 9765激情中文在线| 亚洲电影在线免费观看| 国产二区视频在线| 国产美女高潮在线| 午夜成人免费电影| 亚洲 高清 成人 动漫| 97人澡人人添人人爽欧美| 亚洲综合一区二区三区| 99er在线视频| 阿v视频在线| 欧美香蕉大胸在线视频观看| aa免费在线观看| 亚洲欧洲高清| 欧美日韩日日夜夜| 日韩av影视大全| 91成人午夜| 精品一区电影国产| 精品人妻一区二区三区四区| 成人av资源电影网站| 日韩视频免费在线观看| 欧美爱爱免费视频| 亚洲夜间福利| 欧美影院久久久| 国产精品国产精品国产| 久久99九九99精品| 国产精品视频在线免费观看 | 国产精品9999久久久久仙踪林| 亚洲国产剧情在线观看| 久久大综合网| 日韩精品免费一区二区在线观看| 亚洲精品小视频在线观看| 给我看免费高清在线观看| 国产真实有声精品录音| 久久精品久久久久电影| 欧美极品视频在线观看| 亚洲综合国产| 成人午夜小视频| 欧美一级性视频| 国产午夜精品福利| 伊人再见免费在线观看高清版 | 亚洲草久电影| 午夜精品久久久久久久久久久久| 日韩一级在线视频| 国产精品一区二区三区99| 久久久一本精品99久久精品66| 国产尤物视频在线| 一区二区三区**美女毛片| 国产精品333| 亚洲综合伊人| 日韩成人在线免费观看| 三级黄色在线观看| 国产一区白浆| 91九色蝌蚪成人| 国产玉足榨精视频在线观看| 一区二区高清免费观看影视大全 | 国产成人综合亚洲网站| 美脚丝袜一区二区三区在线观看| 超鹏97在线| 在线免费亚洲电影| 污污免费在线观看| 色琪琪久久se色| 欧美在线一级视频| 韩国av电影在线观看| 成人欧美一区二区三区视频网页 | 在线视频cao| 日韩欧美中文一区二区| 国产黄色录像视频| 老鸭窝亚洲一区二区三区| www日韩av| 免费a在线看| 精品久久久久久中文字幕| 在线免费观看av网| 欧洲杯半决赛直播| 日韩av电影在线播放| 日本精品一区二区在线观看| 亚洲桃色在线一区| 国产xxxxx在线观看| 成人av资源网址| 欧美日韩国产91| 国产精品久久久久久久一区二区| 国产亚洲人成网站| 国产伦精品一区二区三区四区视频_| 亚洲青青一区| 色婷婷综合久久久久| 成人h动漫精品一区二区下载| 成人的网站免费观看| 中文字幕一区二区三区有限公司| 欧洲精品一区二区三区| 亚洲天堂开心观看| 四虎成人在线观看| 久久精子c满五个校花| 大陆极品少妇内射aaaaa| 哺乳一区二区三区中文视频 | 国产不卡高清在线观看视频| 在线一区高清| 精品午夜视频| 欧美国产第二页| 亚洲国产精品久久久久久6q| 亚洲欧美偷拍卡通变态| 人妻体体内射精一区二区| 中文字幕免费一区二区| 91亚洲永久免费精品| av毛片在线看| 日韩欧美国产电影| 日韩激情在线播放| 99精品黄色片免费大全| 777米奇影视第四色| 少妇精品久久久一区二区| 国产91露脸中文字幕在线| 国外av在线| 欧美日韩精品欧美日韩精品 | 香蕉av福利精品导航| 男人网站在线观看| 久久欧美肥婆一二区| 色播亚洲婷婷| 国产精品亚洲综合在线观看| 欧美国产第一页| 日av在线播放| 欧美日韩一二三区| 欧美三级免费看| 91网站在线观看视频| 熟妇人妻无乱码中文字幕真矢织江| 欧美美女一区| 亚洲va国产va天堂va久久| 91九色在线播放| 亚洲夜晚福利在线观看| 国产精品一区二区人人爽| 亚洲在线成人精品| 免费污网站在线观看| 久久成人羞羞网站| 国产精品久久久久7777| 国产精品一在线观看| 91在线国产电影| jizzjizz中国精品麻豆| 亚洲色图25p| 国产成人精品毛片| 欧美日在线观看| 国产精品视频看看| 波多野结衣一区二区三区 | 影音成人av| 欧美人交a欧美精品| 亚洲区小说区图片区| 欧美日韩一区精品| 日本三级理论片| 亚洲国产成人在线| 国产a级黄色片| 免费观看久久久4p| 国产特级淫片高清视频| 色综合狠狠操| 久久精品美女| 麻豆一二三区精品蜜桃| 琪琪第一精品导航| 牛牛精品视频在线| 中文字幕日韩在线观看| 亚洲三区在线观看无套内射| 欧美美女一区二区| 亚洲精品男人的天堂| 一区二区久久久久| 一二三四国产精品| 91小视频在线| 在线观看免费视频黄| 老司机一区二区| 久久综合久久色| 国产色综合网| 日韩欧美猛交xxxxx无码| 久久人体视频| 日韩av图片| 麻豆精品av| 成人片在线免费看| 警花av一区二区三区| 国产精品普通话| 美女福利一区二区三区| 久久久亚洲天堂| 手机av免费在线| 久久天天躁狠狠躁夜夜爽蜜月| 国产中文在线| 亚洲少妇激情视频| 日韩精品一二| 日韩av在线免费| 日批免费在线观看| 亚洲а∨天堂久久精品喷水| 成人高潮片免费视频| 69p69国产精品| 97人妻精品一区二区三区动漫| 欧美亚洲国产一区二区三区| 秋霞精品一区二区三区| 狠狠躁夜夜躁人人爽超碰91| 日本中文字幕免费观看| 亚洲线精品一区二区三区 | 欧美视频不卡中文| 久久久久久久久久久久久av| 亚洲国产综合在线| 国产一级二级三级视频| 亚洲综合清纯丝袜自拍| 久久精品www| 亚洲成人激情av| 成年人免费看毛片| 欧美日韩一区二区免费在线观看| 日韩欧美a级片| 欧美性猛xxx| 区一区二在线观看| 欧美色综合影院| 一级黄色片在线| 欧美一区二区在线视频| 国产激情久久久久久熟女老人av| 日韩一区二区三区高清免费看看| 精品人妻一区二区三区日产乱码| 日韩欧美电影在线| 日韩在线视频观看免费| 亚洲欧美日韩在线一区| 高清av在线| 久久久精品国产| 毛片网站在线看| 5252色成人免费视频| 黑人巨大亚洲一区二区久 | 亚洲最好看的视频| 日韩亚洲视频在线| 中文精品久久| 日韩av高清在线看片| 久久综合影音| 天天做天天干天天操| 成人在线综合网| 亚洲天堂视频一区| 亚洲欧洲另类国产综合| 国产在线观看成人| 一本到不卡免费一区二区| 怡红院男人天堂| 日韩限制级电影在线观看| 午夜小视频在线播放| 宅男66日本亚洲欧美视频| av在线免费网站| 57pao成人永久免费视频| av成人亚洲| 国产精品9999久久久久仙踪林| 久久av资源| 国产精品88久久久久久妇女| av成人毛片| 天堂一区在线观看| 成人精品亚洲人成在线| 午夜影院黄色片| 亚洲福中文字幕伊人影院| 超碰在线97观看| 精品欧美一区二区三区精品久久| 嫩草在线播放| 欧美另类极品videosbest最新版本| 色网在线免费观看| 91久久国产婷婷一区二区| 亚洲欧洲av| 日韩国产小视频| 免费xxxx性欧美18vr| 国产综合内射日韩久| 国产精品免费aⅴ片在线观看| 国产精品变态另类虐交| 欧美精品777| 好男人免费精品视频| 久久免费在线观看| 国产精品18| 亚洲欧美日韩精品久久久| 亚洲一区日韩| 亚洲av成人精品一区二区三区| ●精品国产综合乱码久久久久| 一级黄色在线视频| 欧美精品一区二区三区久久久| av免费看在线| 91亚洲永久免费精品| 色婷婷亚洲mv天堂mv在影片| 国产日韩一区二区在线| 不卡高清视频专区| 九九热精品免费视频| 91麻豆精品国产91久久久资源速度 | www.国产一区二区| 日韩视频不卡中文| 国产视频中文字幕在线观看| 国产精品国产亚洲伊人久久 | 日本xxxxx18| 久久精品国产精品亚洲红杏 | 一区二区三区波多野结衣在线观看| 久久精品国产亚洲av麻豆蜜芽| 亚洲精品自产拍| 国产传媒在线| 国产精品国产精品国产专区蜜臀ah| 91精品一区二区三区综合在线爱| 在线观看免费视频高清游戏推荐 | 欧美日韩在线观看成人| 在线播放91灌醉迷j高跟美女 | 精品欧美不卡一区二区在线观看| 久久久爽爽爽美女图片| 成人中文字幕视频| 国产精品亚洲天堂| 国产专区欧美精品| 小泽玛利亚一区二区免费| 欧美日韩成人激情| 生活片a∨在线观看| 成人美女av在线直播| 国产精品成久久久久| 成人性生交免费看| 国产精品久久免费看| 国产精品久久久久久免费| 伊人久久久久久久久久久| 欧亚一区二区| 亚洲一二三区在线| 狠狠色综合色综合网络| 成人高潮免费视频| 日韩一区二区三区电影| 欧美性爽视频| 国产一区国产精品| 美女日韩在线中文字幕| 91网站免费视频| 欧美视频精品在线观看| 美女黄视频在线观看| 99影视tv| 亚洲永久在线| 亚洲毛片亚洲毛片亚洲毛片| 欧美猛男超大videosgay| 在线午夜影院| 国模精品一区二区三区| 久久一区视频| 成人一级黄色大片| 欧美成人一区二区三区在线观看| 国产盗摄精品一区二区酒店| 精选一区二区三区四区五区| 久久亚洲精选| 午夜激情视频在线播放| 精品国产免费视频| 欧美黑人巨大xxxxx| 亚洲自拍的二区三区| 国产ts人妖一区二区| 精品免费囯产一区二区三区| 在线精品91av| 1204国产成人精品视频| 日日摸日日碰夜夜爽av| 18成人在线观看| 天天干天天草天天射| 国产精品亚洲自拍| 亚洲二区免费| 国产三级黄色片| 精品国产一区二区三区久久久蜜月| 樱花草涩涩www在线播放| 黄瓜视频免费观看在线观看www | 麻豆91蜜桃| 国产一区亚洲一区| 中文字幕第四页| 久久成人一区二区| 少妇精品久久久| 中文字幕天堂av| 欧美另类久久久品| 少妇视频一区| 大陆极品少妇内射aaaaaa| 久久久久久久久久看片|