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

一個SparkSQL作業的一生可能只是一集瑯琊榜

大數據 Spark
小紅是數據分析,她某天寫了個SQL來統計一個分院系的加權均值分數匯總。她提交了這個查詢到某個SQL On Hadoop平臺執行,然后她放下工作,切到視頻網頁看一會《瑯琊榜》……

Spark是時下很火的計算框架,由UC Berkeley AMP Lab研發,并由原班人馬創建的Databricks負責商業化相關事務。而SparkSQL則是Spark之上搭建的SQL解決方案,主打交互查詢場景。

人人都說Spark/SparkSQL快,各種Benchmark滿天飛,但是到底Spark/SparkSQL快么,或者快在哪里,似乎很少有人說得清。因為Spark是基于內存的計算框架?因為SparkSQL有強大的優化器?本文將帶你看一看一個SparkSQL作業到底是如何執行的,順便探討一下SparkSQL和Hive On MapReduce比起來到底有何區別。

SQL On Hadoop的解決方案已經玲瑯滿目了,不管是元祖級的Hive,Cloudera的Impala,MapR的 Drill,Presto,SparkSQL甚至Apache Tajo,IBM BigSQL等等,各家公司都試圖解決SQL交互場景的性能問題,因為原本的Hive On MapReduce實在太慢了。

那么Hive On MapReduce和SparkSQL或者其他交互引擎相比,慢在何處呢?讓我們先看看一個SQL On Hadoop引擎到底如何工作的。

現在的SQL On Hadoop作業,前半段的工作原理都差不多,類似一個Compiler,分來分去都是這基層。

小紅是數據分析,她某天寫了個SQL來統計一個分院系的加權均值分數匯總。

  1. SELECT dept, avg(math_score * 1.2) + avg(eng_score * 0.8) FROM students 
  2. GROUP BY dept; 

其中STUDENTS表是學生分數表(請不要在意這個表似乎不符合范式,很多Hadoop上的數據都不符合范式,因為Join成本高,而且我寫表介紹也會很麻煩)。

她提交了這個查詢到某個SQL On Hadoop平臺執行,然后她放下工作,切到視頻網頁看一會《瑯琊榜》。

在她看視頻的時候,我們的SQL平臺可是有很努力的工作滴。

首先是查詢解析。

這里和很多Compiler類似,你需要一個Parser(就是著名的程序員約架專用項目),Parser(確切說是Lexer加Parser)的作用是把一個字符串流變成一個一個Token,再根據語法定義生成一棵抽象語法樹AST。這里不詳細展開,童鞋們可以參考編譯原理。比較多的項目會選 ANTLR(Hive啦,Presto啦等等),你可以用類似BNF的范式來寫Parser規則,當然也有手寫的比如SparkSQL。AST會進一步包裝成一個簡單的基本查詢信息對象,這個對象包含了一個查詢基本的信息,比如基本語句的類型是SELECT還是INSERT,WHERE是什么,GROUP BY是什么,如果有子查詢,還需要遞歸進去,這個東西大致來說就是所謂的邏輯計劃。

  1. TableScan(students) 
  2. -> Project(dept, avg(math_score * 1.2) + avg(eng_score * 0.8)) 
  3. ->TableSink 

上面是無責任示意,具體到某個SQL引擎會略有不同,但是基本上都會這么干。如果你想找一個代碼干凈易懂的SQL引擎,可以參考Presto(可以算我讀過的開源代碼寫的最漂亮的了)。

到上面為止,你已經把字符串轉換成一個所謂的LogicalPlan,這個Plan距離可以求值來說還比較殘疾。最基本來說,我還不知道dept是個啥吧,math_score是神馬類型,AVG是個什么函數,這些都不明了。這樣的LogicalPlan可以稱為Unresolved(殘疾的)Logical Plan。

缺少的是所謂的元數據信息,這里主要包含兩部分:表的Schema和函數信息。表的Schema信息主要包含表的列定義(名字,類型),表的物理位置,格式,如何讀取;函數信息是函數簽名,類的位置等。

有了這些,SQL引擎需要再一次遍歷剛才的殘廢計劃,進行一次深入的解析。最重要的處理是列引用綁定和函數綁定。列引用綁定決定了一個表達式的類型。而有了類型你可以做函數綁定。函數綁定幾乎是這里最關鍵的步驟,因為普通函數比如CAST,和聚合函數比如這里的AVG,分析函數比如Rank以及 Table Function比如explode都會用完全不同的方式求值,他們會被改寫成獨立的計劃節點,而不再是普通的Expression節點。除此之外,還需要進行深入的語義檢測。比如GROUP BY是否囊括了所有的非聚合列,聚合函數是否內嵌了聚合函數,以及最基本的類型兼容檢查,對于強類型的系統,類型不一致比如date = ‘2015-01-01’需要報錯,對于弱類型的系統,你可以添加CAST來做Type(類型) Coerce(茍合)。

然后我們得到了一個尚未優化的邏輯計劃:

  1. TableScan(students=>dept:String, eng_score:double, math_score:double
  2. ->Project(dept, math_score * 1.2:expr1, eng_score * 0.8:expr2) 
  3. ->Aggregate(avg(expr1):expr3, avg(expr2):expr4, GROUP:dept) 
  4. ->Project(dept, expr3+expr4:avg_result) 
  5. ->TableSink(dept, avg_result->Client) 

所以我們可以開始上肉戲了?還早呢。

剛才的計劃,還差得很遠,作為一個SQL引擎,沒有優化怎么好見人?不管是SparkSQL還是Hive,都有一套優化器。大多數SQL on Hadoop引擎都有基于規則的優化,少數復雜的引擎比如Hive,擁有基于代價的優化。規則優化很容易實現,比如經典的謂詞下推,可以把Join查詢的過濾條件推送到子查詢預先計算,這樣JOIN時需要計算的數據就會減少(JOIN是最重的幾個操作之一,能用越少的數據做JOIN就會越快),又比如一些求值優化,像去掉求值結果為常量的表達式等等。基于代價的優化就復雜多了,比如根據JOIN代價來調整JOIN順序(最經典的場景),對SparkSQL 來說,代價優化是最簡單的根據表大小來選擇JOIN策略(小表可以用廣播分發),而沒有JOIN順序交換這些,而JOIN策略選擇則是在隨后要解釋的物理執行計劃生成階段。

到這里,如果還沒報錯,那你就幸運滴得到了一個Resolved(不殘廢的)Logical Plan了。這個Plan,再配上表達式求值器,你也可以折騰折騰在單機對表查詢求值了。但是,我們不是做分布式系統的么?數據分析妹子已經看完《瑯琊榜》的片頭了,你還在悠閑什么呢?

為了讓妹子在看完電視劇之前算完幾百G的數據,我們必須借助分布式的威力,畢竟單節點算的話夠妹子看完整個瑯琊榜劇集了。剛才生成的邏輯計劃,之所以稱為邏輯計劃,是因為它只是邏輯上看起來似乎能執行了(誤),實際上我們并不知道具體這個東西怎么對應Spark或者MapReduce任務。

邏輯執行計劃接下來需要轉換成具體可以在分布式情況下執行的物理計劃,你還缺少:怎么和引擎對接,怎么做表達式求值兩個部分。

表達式求值有兩種基本策略,一個是解釋執行,直接把之前帶來的表達式進行解釋執行,這個是Hive現在的模式;另一個是代碼生成,包括 SparkSQL,Impala,Drill等等號稱新一代的引擎都是代碼生成模式的(并且配合高速編譯器)。不管是什么模式,你最終把表達式求值部分封裝成了類。代碼可能長得類似如下:

  1. // math_score * 1.2 
  2. val leftOp = row.get(1/* math_score column index */); 
  3. val result = if (leftOp == nullthen null else leftOp * 1.2; 

每個獨立的SELECT項目都會生成這樣一段表達式求值代碼或者封裝過的求值器。但是AVG怎么辦?當初寫wordcount的時候,我記得聚合計算需要分派在Map和Reduce兩個階段呀?這里就涉及到物理執行轉換,涉及到分布式引擎的對接。

AVG這樣的聚合計算,加上GROUP BY的指示,告訴了底層的分布式引擎你需要怎么做聚合。本質上來說AVG聚合需要拆分成Map階段來計算累加,還有條目個數,以及Reduce階段二次累加最后每個組做除法。

因此我們要算的AVG其實會進一步拆分成兩個計劃節點:Aggregates(Partial)和Aggregates(Final)。 Partial部分是我們計算局部累加的部分,每個Mapper節點都將執行,然后底層引擎會做一個Shuffle,將相同Key(在這里是Dept)的行分發到相同的Reduce節點。這樣經過最終聚合你才能拿到最后結果。

拆完聚合函數,如果只是上面案例給的一步SQL,那事情比較簡單,如果還有多個子查詢,那么你可能面臨多次Shuffle,對于MapReduce 來說,每次Shuffle你需要一個MapReduce Job來支撐,因為MapReduce模型中,只有通過Reduce階段才能做Shuffle操作,而對于Spark來說,Shuffle可以隨意擺放,不過你要根據Shuffle來拆分Stage。這樣拆過之后,你得到一個多個MR Job串起來的DAG或者一個Spark多個Stage的DAG(有向無環圖)。

還記得剛才的執行計劃么?它最后變成了這樣的物理執行計劃:

  1. TableScan->Project(dept, math_score * 1.2: expr1, eng_score * 0.8: expr2) 
  2. -> AggretatePartial(avg(expr1):avg1, avg(expr2):avg2, GROUP: dept) 
  3. -> ShuffleExchange(Row, KEY:dept) 
  4. -> AggregateFinal(avg1, avg2, GROUP:dept) 
  5. -> Project(dept, avg1 + avg2) 
  6. -> TableSink 

這東西到底怎么在MR或者Spark中執行啊?對應Shuffle之前和之后,物理上它們將在不同批次的計算節點上執行。不管對應 MapReduce引擎還是Spark,它們分別是Mapper和Reducer,中間隔了Shuffle。上面的計劃,會由 ShuffleExchange中間斷開,分別發送到Mapper和Reducer中執行,當然除了上面的部分還有之前提到的求值類,也都會一起序列化發送。

實際在MapReduce模型中,你最終執行的是一個特殊的Mapper和特殊的Reducer,它們分別在初始化階段載入被序列化的Plan和求值器信息,然后在map和reduce函數中依次對每個輸入求值;而在Spark中,你生成的是一個一個RDD變換操作。

比如一個Project操作,對于MapReduce來說,偽代碼大概是這樣的:

  1. void configuration() { 
  2. context = loadContext() 
  3. void map(inputRow) { 
  4. outputRow = context.projectEvaluator (inputRow); 
  5. write(outputRow); 

對于Spark,大概就是這樣:

  1. currentPlan.mapPartitions { iter => 
  2. projection = loadContext() 
  3. iter.map { row => projection(row) } } 

至此為止,引擎幫你愉快滴提交了Job,你的集群開始不緊不慢地計算了。

到這里為止,似乎看起來SparkSQL和Hive On MapReduce沒有什么區別?其實SparkSQL快,并不快在引擎。

SparkSQL的引擎優化,并沒有Hive復雜,畢竟人Hive多年積累,十多年下來也不是吃素的。但是Spark本身快呀。

Spark標榜自己比MapReduce快幾倍幾十倍,很多人以為這是因為Spark是“基于內存的計算引擎”,其實這不是真的。Spark還是要落磁盤的,Shuffle的過程需要也會將中間數據吐到本地磁盤上。所以說Spark是基于內存計算的說法,不考慮手動Cache的情景,是不正確的。

SparkSQL的快,根本不是剛才說的那一坨東西哪兒比Hive On MR快了,而是Spark引擎本身快了。

事實上,不管是SparkSQL,Impala還是Presto等等,這些標榜第二代的SQL On Hadoop引擎,都至少做了三個改進,消除了冗余的HDFS讀寫,冗余的MapReduce階段,節省了JVM啟動時間。

在MapReduce模型下,需要Shuffle的操作,就必須接入一個完整的MapReduce操作,而接入一個MR操作,就必須將前階段的MR結果寫入HDFS,并且在Map階段重新讀出來,這才是萬惡之源。

事實上,如果只是上面的SQL查詢,不管用MapReduce還是Spark,都不一定會有顯著的差異,因為它只經過了一個shuffle階段。

真正體現差異的,是這樣的查詢:

  1. SELECT g1.name, g1.avg, g2.cnt 
  2. FROM (SELECT nameavg(id) AS avg FROM students GROUP BY name) g1 
  3. JOIN (SELECT namecount(id) AS cnt FROM students GROUP BY name) g2 
  4. ON (g1.name = g2.name
  5. ORDER BY avg

而他們所對應的MR任務和Spark任務分別是這樣的:

 

一次HDFS中間數據寫入,其實會因為Replication的常數擴張為三倍寫入,而磁盤讀寫是非常耗時的。這才是Spark速度的主要來源。

另一個加速,來自于JVM重用。考慮一個上萬Task的Hive任務,如果用MapReduce執行,每個Task都會啟動一次JVM,而每次JVM啟動時間可能就是幾秒到十幾秒,而一個短Task的計算本身可能也就是幾秒到十幾秒,當MR的Hive任務啟動完成,Spark的任務已經計算結束了。對于短 Task多的情形下,這是很大的節省。

說到這里,小紅已經看完《瑯琊榜》回來了,接下去我們討論一下劇情吧。。。

責任編輯:Ophira 來源: 比特科技
相關推薦

2025-10-16 07:05:00

SparkSQLSpark 內核

2015-04-23 08:51:53

2015-08-03 09:33:21

PH程序員一生

2011-11-30 12:32:38

企業防毒防毒方案拯救三

2016-08-24 11:13:30

2023-07-11 13:34:19

Rust開發軟件

2023-01-10 08:20:55

RocketMQ消息源碼

2023-05-09 22:57:26

AI網絡

2020-05-03 14:00:29

程序員技能開發者

2025-08-25 02:00:00

2015-12-11 17:00:08

數據中心瑯琊榜

2017-06-26 10:05:49

開發編程程序員

2021-08-06 22:43:54

中斷架構傳遞

2020-07-09 17:37:47

Linux網絡包中斷

2018-01-18 09:05:05

存儲數據包分層

2023-12-26 18:47:32

2012-12-04 10:08:16

2024-06-04 00:01:00

2010-03-15 13:36:11

2021-06-08 07:48:26

iOS 15 Linux 操作系統
點贊
收藏

51CTO技術棧公眾號

成人精品影视| 成人性生活av| 国产福利一区二区| 久久青草精品视频免费观看| 精品人妻一区二区免费视频| 偷拍视频一区二区三区| 国产精品久久久久影院老司| 99国产精品久久久久老师| 99视频在线看| 国产精品99一区二区三| 精品av久久707| 手机在线看福利| 日本无删减在线| 久久精品免费在线观看| 92国产精品视频| 国产又大又黄视频| 香蕉综合视频| 亚洲欧美日韩另类| 国产精品999.| 国产精品扒开腿做爽爽爽视频软件| 国产精品国产三级国产aⅴ中文 | 久久精品视频5| 98精品视频| 国产视频精品久久久| 奇米777在线| 亚洲电影有码| 亚洲国产aⅴ成人精品无吗| 亚洲成人18| 亚洲欧洲综合在线| 国产成a人亚洲| 国产精品免费久久久久久| 日本三级欧美三级| 欧美日韩国产综合网| 中文字幕亚洲欧美日韩高清| 人人妻人人澡人人爽人人精品| 奇米一区二区| 欧美高清dvd| 久久久国产欧美| 亚洲黄色网址| 精品女厕一区二区三区| 97中文字幕在线| 国产视频中文字幕在线观看| 国产精品污污网站在线观看| 欧美系列一区| 欧洲成人一区二区三区| 国产九色精品成人porny| 成人在线视频网站| 96日本xxxxxⅹxxx17| 麻豆91在线观看| 国产精品免费一区| 中文字幕乱码视频| 男人的j进女人的j一区| 国产精品久久久久久久久久99| 欧产日产国产69| 国产亚洲精品v| 69视频在线播放| 免费在线不卡视频| 99在线精品免费视频九九视| 久久久最新网址| 日本少妇xxxx动漫| 国产欧美一级| 日本久久亚洲电影| www.五月婷婷.com| 看电视剧不卡顿的网站| 成人在线精品视频| 国产福利第一视频| 成人看片黄a免费看在线| 国产精品视频在线免费观看| 欧美熟妇另类久久久久久不卡 | 丰满圆润老女人hd| 国产探花一区| 中文字幕亚洲欧美日韩高清| 黑人狂躁日本娇小| 欧美xxx在线观看| 欧美激情第6页| 日韩高清精品免费观看| 免费一区视频| 国产热re99久久6国产精品| 国产精品女人久久久| 国产精品亚洲成人| 精品国产福利| 啊v视频在线| 亚洲欧洲日本在线| 丰满少妇大力进入| 快播电影网址老女人久久| 欧美日韩精品系列| 26uuu国产| 美女久久久久| 久久国产加勒比精品无码| 精品少妇theporn| 每日更新成人在线视频| 91精品久久久久久久| 亚洲欧美高清视频| 国产欧美1区2区3区| 自拍偷拍视频在线| 咪咪网在线视频| 精品视频一区 二区 三区| 久久久久亚洲av无码专区首jn| 日韩电影不卡一区| www.亚洲免费视频| 成人精品在线看| 麻豆精品在线播放| 国产在线一区二区三区欧美| 在线视频自拍| 精品美女国产在线| 男女视频在线观看网站| 夜夜春成人影院| 九九九热精品免费视频观看网站| 久久久国产高清| 国产一区二区免费看| 蜜桃欧美视频| 欧美videossex| 欧美日韩的一区二区| 日韩av手机在线播放| 97精品视频| 日本一区二区不卡| 人妻少妇精品无码专区久久| 国产精品国产三级国产普通话三级 | 国产女主播在线播放| 成人羞羞网站入口| 26uuu另类亚洲欧美日本老年| 国产精品久久久久精| 久久精品日产第一区二区三区高清版| a级片一区二区| 亚洲精品三区| 国产亚洲视频在线| 黄色在线免费观看| 99久久婷婷国产精品综合| 国产精品美女在线播放| av成人在线播放| 亚洲欧美国产高清va在线播| 日韩 国产 在线| 国产成人无遮挡在线视频| 永久免费精品视频网站| 国产一区二区精品调教| 亚洲欧美综合另类中字| 日产精品久久久久| 国产 欧美在线| 国产91av视频在线观看| 韩国理伦片久久电影网| 国产亚洲精品高潮| 久久久蜜桃一区二区| 99久久精品免费| 国产精品国产亚洲精品看不卡| 国产一区二区| 欧美成人精品一区二区| 国产视频第二页| 亚洲欧洲制服丝袜| www.污网站| 欧美一区精品| 成人动漫视频在线观看完整版| 国产精品va在线观看视色| 欧美日韩大陆一区二区| 亚洲精品卡一卡二| 国产综合一区二区| 天天做天天爱天天高潮| 国产情侣一区在线| 色综合导航网站| 亚洲福利在线观看视频| 亚洲高清在线视频| www.88av| 久久久久久夜| 亚洲高清在线观看一区| 亚洲伦理一区二区| 欧美尺度大的性做爰视频| 亚洲第一精品网站| 懂色aⅴ精品一区二区三区蜜月 | 日本一区二区视频在线观看| 国产免费999| 99久久.com| 亚洲最大福利视频| caoprom在线| 亚洲精品在线视频| 中国老头性行为xxxx| 亚洲欧洲另类国产综合| av在线天堂网| 国产精品一二| 亚洲欧洲精品一区二区| 免费一级欧美片在线观看网站| 久久久久久有精品国产| 日韩福利一区二区| 欧美欧美欧美欧美| 国产精品23p| 欧美韩日一区二区三区| 91插插插影院| 在线视频亚洲| 亚洲视频sss| 国产另类在线| 国产精品久久二区| 中文在线免费| 国产丝袜视频一区| 国产女18毛片多18精品| 婷婷六月综合网| 欧美性生给视频| 成人av动漫在线| 手机看片一级片| 亚洲激情视频| 亚洲午夜精品久久久久久浪潮| 视频国产精品| 国产精品久久久久久久久久久久| 成人国产免费电影| 亚洲男人天堂古典| av av片在线看| 色偷偷成人一区二区三区91| 日本少妇高清视频| 久久综合视频网| 性鲍视频在线观看| 久久综合导航| 欧美激情视频免费看| 欧美高清视频在线观看mv| 国产一区二区三区高清视频| 亚洲三级在线| 国产va免费精品高清在线观看| 在线电影福利片| 中文字幕精品国产| 天堂a√在线| 精品久久久久久久久久久久久久久 | 91亚洲精品视频| 波多视频一区| 国内精品久久久久久影视8| 老司机在线永久免费观看| 亚洲乱亚洲乱妇无码| 亚洲黄色片视频| 欧美精品vⅰdeose4hd| 波多野结衣家庭主妇| 天天色天天操综合| 久草视频中文在线| 亚洲精品亚洲人成人网| 丁香六月激情综合| 久久久久国产成人精品亚洲午夜| 91九色蝌蚪porny| 国产一区二区三区精品欧美日韩一区二区三区 | 精品少妇人妻一区二区黑料社区| 成人一二三区视频| 亚洲一区二区中文字幕在线观看| 麻豆精品一区二区| 中文字幕在线观看第三页| 久久男女视频| 欧美日韩在线中文| 亚洲一区黄色| 久久久999视频| 中文亚洲免费| 国产超级av在线| 国产日韩一区| 97超碰青青草| 美女日韩在线中文字幕| www国产黄色| 日日夜夜精品视频天天综合网| avav在线看| 久久国产日韩| 国内外免费激情视频| 久久青草久久| 亚洲欧美激情网| 麻豆成人av在线| 91pony九色| 高清在线不卡av| 大尺度在线观看| 99久久精品国产网站| 亚洲国产综合视频| 久久久久九九视频| 日本猛少妇色xxxxx免费网站| 中文字幕不卡在线播放| 很污很黄的网站| 亚洲精品国产a久久久久久| 国产亚洲精久久久久久无码77777| 亚洲国产精品久久久久秋霞影院 | 日本精品视频一区二区三区| 国产字幕在线观看| 欧美美女黄视频| 精品国产亚洲一区二区麻豆| 亚洲精品在线免费播放| 四虎在线免费看| 最近2019中文免费高清视频观看www99| 亚洲搞黄视频| 欧美极品少妇xxxxⅹ喷水| 丁香花在线观看完整版电影| 国色天香2019中文字幕在线观看| av资源新版天堂在线| 日本不卡免费高清视频| 欧美黄色网络| 91在线免费看片| 日韩伦理一区二区三区| 亚洲v国产v| 国产一区视频在线观看免费| 欧美日韩国产精品激情在线播放| 日韩不卡手机在线v区| 欧美国产在线一区| 91在线视频播放地址| 日本一区免费观看| 天堂网视频在线| 欧美在线免费观看视频| 国产情侣在线播放| 亚洲乱码一区二区| 丝袜综合欧美| 国产成人啪精品视频免费网| www.欧美| 日本不卡久久| 黄色欧美日韩| 亚洲天堂国产视频| 99久久伊人久久99| 中文字幕人妻一区二| 色婷婷香蕉在线一区二区| 国产视频一二三四区| 亚洲人成电影网站色www| 182tv在线播放| 国产精品久久久| 久久a爱视频| 色中文字幕在线观看| 丝袜亚洲精品中文字幕一区| 亚洲一区二区三区三州| 久久久午夜精品| 国产无码精品视频| 欧美另类一区二区三区| 男女污污视频在线观看| 欧美激情久久久久| 91精品麻豆| 色播亚洲婷婷| 国产日韩一区二区三区在线播放| 一级黄色片在线免费观看| 中文在线一区二区| 国产亚洲欧美日韩高清| 亚洲国产精彩中文乱码av| av网址在线免费观看| 国产精品日韩欧美大师| 亚洲第一福利专区| 免费看欧美黑人毛片| 国产在线精品免费av| 国精品人伦一区二区三区蜜桃| 日本韩国欧美一区二区三区| 黄色一级a毛片| 久久91精品国产91久久跳| 祥仔av免费一区二区三区四区| 欧美一区亚洲二区| 亚洲影院免费| 亚洲制服丝袜在线播放| 午夜在线电影亚洲一区| 好男人在线视频www| 欧美日韩xxxxx| 一区二区三区视频播放| 欧美精品久久96人妻无码| 久热成人在线视频| 久久久久久久久久97| 欧美精品自拍偷拍| 免费av在线网址| 91麻豆国产精品| 国产精品久久天天影视| 中文字幕视频三区| 国产精品的网站| 国产三级漂亮女教师| 日韩最新av在线| 99精品视频在线免费播放| 国产又黄又爽免费视频| 国内精品伊人久久久久影院对白| 三上悠亚作品在线观看| 成人资源在线播放| 99在线观看视频免费| 国产成人精品免费网站| 国产一级做a爱免费视频| 精品国产123| 妞干网免费在线视频| 免费精品视频一区二区三区| 久久久人人人| 国产aaaaaaaaa| 91精品国产乱码| 国产精品探花在线| 免费亚洲精品视频| 免费成人美女在线观看.| 777777国产7777777| 日韩视频免费观看高清完整版在线观看| 天堂av资源在线观看| 国产精品一区二区三区观看| 亚洲一区日本| 在线观看日本黄色| 欧美白人最猛性xxxxx69交| 麻豆免费在线| 亚洲制服欧美久久| 国产a视频精品免费观看| 中文字幕一区在线播放| 伊人av综合网| 中文字幕久久精品一区二区| 两根大肉大捧一进一出好爽视频| 欧美—级在线免费片| 精品女同一区二区三区| 17婷婷久久www| 欧美wwwww| xxxwww国产| 欧美日韩国产高清一区二区三区| 怡红院av在线| 日韩欧美亚洲日产国产| 国产精品1区2区| 天天天天天天天干| 欧美久久久精品| 国产精品亚洲片在线播放| 91欧美一区二区三区| 欧美性猛交xxxx免费看久久久| 免费黄网站在线观看| 999热视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲天堂黄色片| 亚洲欧美国产一本综合首页|