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

大數據計算平臺Spark內核全面解讀

大數據 Spark
Spark是起源于美國加州大學伯克利分校AMPLab的大數據計算平臺,在2010年開源,目前是Apache軟件基金會的頂級項目。隨著Spark在大數據計算領域的暫露頭角,越來越多的企業開始關注和使用。

1、Spark介紹

Spark是起源于美國加州大學伯克利分校AMPLab的大數據計算平臺,在2010年開源,目前是Apache軟件基金會的***項目。隨著Spark在大數據計算領域的暫露頭角,越來越多的企業開始關注和使用。2014年11月,Spark在Daytona Gray Sort 100TB Benchmark競賽中打破了由Hadoop MapReduce保持的排序記錄。Spark利用1/10的節點數,把100TB數據的排序時間從72分鐘提高到了23分鐘

Spark在架構上包括內核部分和4個官方子模塊--Spark SQL、Spark Streaming、機器學習庫MLlib和圖計算庫GraphX。圖1所示為Spark在伯克利的數據分析軟件棧BDAS(Berkeley Data Analytics Stack)中的位置。可見Spark專注于數據的計算,而數據的存儲在生產環境中往往還是由Hadoop分布式文件系統HDFS承擔。

圖1 Spark在BDAS中的位置 

Spark被設計成支持多場景的通用大數據計算平臺,它可以解決大數據計算中的批處理,交互查詢及流式計算等核心問題。Spark可以從多數據源的讀取數據,并且擁有不斷發展的機器學習庫和圖計算庫供開發者使用。數據和計算在Spark內核及Spark的子模塊中是打通的,這就意味著Spark內核和子模塊之間成為一個整體。Spark的各個子模塊以Spark內核為基礎,進一步支持更多的計算場景,例如使用Spark SQL讀入的數據可以作為機器學習庫MLlib的輸入。表1列舉了一些在Spark平臺上的計算場景。

表1 Spark的應用場景舉例

在本文寫作是,Spark的***版本為1.2.0,文中的示例代碼也來自于這個版本。

2、Spark內核介紹 

相信大數據工程師都非常了解Hadoop MapReduce一個***的問題是在很多應用場景中速度非常慢,只適合離線的計算任務。這是由于MapReduce需要將任務劃分成map和reduce兩個階段,map階段產生的中間結果要寫回磁盤,而在這兩個階段之間需要進行shuffle操作。Shuffle操作需要從網絡中的各個節點進行數據拷貝,使其往往成為最為耗時的步驟,這也是Hadoop MapReduce慢的根本原因之一,大量的時間耗費在網絡磁盤IO中而不是用于計算。在一些特定的計算場景中,例如像邏輯回歸這樣的迭代式的計算,MapReduce的弊端會顯得更加明顯。

那Spark是如果設計分布式計算的呢?首先我們需要理解Spark中最重要的概念--彈性分布數據集(Resilient Distributed Dataset),也就是RDD。 

 

2.1 彈性分布數據集RDD

RDD是Spark中對數據和計算的抽象,是Spark中最核心的概念,它表示已被分片(partition),不可變的并能夠被并行操作的數據集合。對RDD的操作分為兩種transformation和action。Transformation操作是通過轉換從一個或多個RDD生成新的RDD。Action操作是從RDD生成***的計算結果。在Spark***的版本中,提供豐富的transformation和action操作,比起MapReduce計算模型中僅有的兩種操作,會大大簡化程序開發的難度。

RDD的生成方式只有兩種,一是從數據源讀入,另一種就是從其它RDD通過transformation操作轉換。一個典型的Spark程序就是通過Spark上下文環境(SparkContext)生成一個或多個RDD,在這些RDD上通過一系列的transformation操作生成最終的RDD,***通過調用最終RDD的action方法輸出結果。

每個RDD都可以用下面5個特性來表示,其中后兩個為可選的:

  • 分片列表(數據塊列表)
  • 計算每個分片的函數
  • 對父RDD的依賴列表
  • 對key-value類型的RDD的分片器(Partitioner)(可選)
  • 每個數據分片的預定義地址列表(如HDFS上的數據塊的地址)(可選)

雖然Spark是基于內存的計算,但RDD不光可以存儲在內存中,根據useDisk、useMemory、useOffHeap, deserialized、replication五個參數的組合Spark提供了12種存儲級別,在后面介紹RDD的容錯機制時,我們會進一步理解。值得注意的是當StorageLevel設置成OFF_HEAP時,RDD實際被保存到Tachyon中。Tachyon是一個基于內存的分布式文件系統,目前正在快速發展,本文不做詳細介紹,可以通過其官方網站進一步了解。

  1. class StorageLevel private(
  2.     private var _useDisk: Boolean,
  3.     private var _useMemory: Boolean,
  4.     private var _useOffHeap: Boolean,
  5.     private var _deserialized: Boolean
  6.     private var _replication: Int = 1)
  7.   extends Externalizable { //… }
  8.  
  9. val NONE = new StorageLevel(false, false, false, false)
  10.   val DISK_ONLY = new StorageLevel(true, false, false, false)
  11.   val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
  12.   val MEMORY_ONLY = new StorageLevel(false, true, false, true)
  13.   val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
  14.   val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
  15.   val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
  16.   val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
  17.   val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
  18.   val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
  19.   val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
  20.   val OFF_HEAP = new StorageLevel(false, false, true, false)

 

2.2 DAG、Stage與任務的生成

Spark的計算發生在RDD的action操作,而對action之前的所有transformation,Spark只是記錄下RDD生成的軌跡,而不會觸發真正的計算。

Spark內核會在需要計算發生的時刻繪制一張關于計算路徑的有向無環圖,也就是DAG。舉個例子,在圖2中,從輸入中邏輯上生成A和C兩個RDD,經過一系列transformation操作,邏輯上生成了F,注意,我們說的是邏輯上,因為這時候計算沒有發生,Spark內核做的事情只是記錄了RDD的生成和依賴關系。當F要進行輸出時,也就是F進行了action操作,Spark會根據RDD的依賴生成DAG,并從起點開始真正的計算。

圖2 邏輯上的計算過程:DAG 

有了計算的DAG圖,Spark內核下一步的任務就是根據DAG圖將計算劃分成任務集,也就是Stage,這樣可以將任務提交到計算節點進行真正的計算。Spark計算的中間結果默認是保存在內存中的,Spark在劃分Stage的時候會充分考慮在分布式計算中可流水線計算(pipeline)的部分來提高計算的效率,而在這個過程中,主要的根據就是RDD的依賴類型。根據不同的transformation操作,RDD的依賴可以分為窄依賴(Narrow Dependency)和寬依賴(Wide Dependency,在代碼中為ShuffleDependency)兩種類型。窄依賴指的是生成的RDD中每個partition只依賴于父RDD(s) 固定的partition。寬依賴指的是生成的RDD的每一個partition都依賴于父 RDD(s) 所有partition。窄依賴典型的操作有map, filter, union等,寬依賴典型的操作有groupByKey, sortByKey等。可以看到,寬依賴往往意味著shuffle操作,這也是Spark劃分stage的主要邊界。對于窄依賴,Spark會將其盡量劃分在同一個stage中,因為它們可以進行流水線計算。

圖3 RDD的寬依賴和窄依賴

我們再通過圖4詳細解釋一下Spark中的Stage劃分。我們從HDFS中讀入數據生成3個不同的RDD,通過一系列transformation操作后再將計算結果保存回HDFS。可以看到這幅DAG中只有join操作是一個寬依賴,Spark內核會以此為邊界將其前后劃分成不同的Stage. 同時我們可以注意到,在圖中Stage2中,從map到union都是窄依賴,這兩步操作可以形成一個流水線操作,通過map操作生成的partition可以不用等待整個RDD計算結束,而是繼續進行union操作,這樣大大提高了計算的效率。

圖4 Spark中的Stage劃分 

#p#

Spark在運行時會把Stage包裝成任務提交,有父Stage的Spark會先提交父Stage。弄清楚了Spark劃分計算的原理,我們再結合源碼看一看這其中的過程。下面的代碼是DAGScheduler中的得到一個RDD父Stage的函數,可以看到寬依賴為劃分Stage的邊界。

  1. /**
  2.    * Get or create the list of parent stages for a given RDD. The stages will be assigned the
  3.    * provided jobId if they haven't already been created with a lower jobId.
  4.    */
  5.  
  6.   private def getParentStages(rdd: RDD[_], jobId: Int): List[Stage] = {
  7.     val parents = new HashSet[Stage]
  8.     val visited = new HashSet[RDD[_]]
  9.     // We are manually maintaining a stack here to prevent StackOverflowError
  10.     // caused by recursively visiting
  11.     val waitingForVisit = new Stack[RDD[_]]
  12.     def visit(r: RDD[_]) {
  13.       if (!visited(r)) {
  14.         visited += r
  15.         // Kind of ugly: need to register RDDs with the cache here since
  16.         // we can't do it in its constructor because # of partitions is unknown
  17.         for (dep <- r.dependencies) {
  18.           dep match {
  19.             case shufDep: ShuffleDependency[_, _, _] =>
  20.               parents += getShuffleMapStage(shufDep, jobId)
  21.             case _ =>
  22.               waitingForVisit.push(dep.rdd)
  23.           }
  24.         }
  25.       }
  26.     }
  27.  
  28.     waitingForVisit.push(rdd)
  29.     while (!waitingForVisit.isEmpty) {
  30.       visit(waitingForVisit.pop())
  31.     }
  32.     parents.toList
  33.   }

上面提到Spark的計算是從RDD調用action操作時候觸發的,我們來看一個action的代碼

RDD的collect方法是一個action操作,作用是將RDD中的數據返回到一個數組中。可以看到,在此action中,會觸發Spark上下文環境SparkContext中的runJob方法,這是一系列計算的起點。

  1. abstract class RDD[T: ClassTag](
  2.     @transient private var sc: SparkContext,
  3.     @transient private var deps: Seq[Dependency[_]]
  4.   ) extends Serializable with Logging {
  5.   //….
  6. /**
  7.    * Return an array that contains all of the elements in this RDD.
  8.    */
  9.   def collect(): Array[T] = {
  10.     val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray)
  11.     Array.concat(results: _*)
  12.   }
  13. }

SparkContext擁有DAGScheduler的實例,在runJob方法中會進一步調用DAGScheduler的runJob方法。在此時,DAGScheduler會生成DAG和Stage,將Stage提交給TaskScheduler。TaskSchduler將Stage包裝成TaskSet,發送到Worker節點進行真正的計算,同時還要監測任務狀態,重試失敗和長時間無返回的任務。整個過程如圖5所示。

 

圖5 Spark中任務的生成 

 

2.3 RDD的緩存與容錯

上文提到,Spark的計算是從action開始觸發的,如果在action操作之前邏輯上很多transformation操作,一旦中間發生計算失敗,Spark會重新提交任務,這在很多場景中代價過大。還有一些場景,如有些迭代算法,計算的中間結果會被重復使用,重復計算同樣增加計算時間和造成資源浪費。因此,在提高計算效率和更好支持容錯,Spark提供了基于RDDcache機制和checkpoint機制。

我們可以通過RDD的toDebugString來查看其遞歸的依賴信息,圖6展示了在spark shell中通過調用這個函數來查看wordCount RDD的依賴關系,也就是它的Lineage.

圖6 RDD wordCount的lineage 

如果發現Lineage過長或者里面有被多次重復使用的RDD,我們就可以考慮使用cache機制或checkpoint機制了。

我們可以通過在程序中直接調用RDD的cache方法將其保存在內存中,這樣這個RDD就可以被多個任務共享,避免重復計算。另外,RDD還提供了更為靈活的persist方法,可以指定存儲級別。從源碼中可以看到RDD.cache就是簡單的調用了RDD.persist(StorageLevel.MEMORY_ONLY)。

  1. /** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
  2.   def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
  3.   def cache(): this.type = persist()

同樣,我們可以調用RDD的checkpoint方法將其保存到磁盤。我們需要在SparkContext中設置checkpoint的目錄,否則調用會拋出異常。值得注意的是,在調用checkpoint之前建議先調用cache方法將RDD放入內存,否則將RDD保存到文件的時候需要重新計算。 

  1.   /**
  2.    * Mark this RDD for checkpointing. It will be saved to a file inside the checkpoint
  3.    * directory set with SparkContext.setCheckpointDir() and all references to its parent
  4.    * RDDs will be removed. This function must be called before any job has been
  5.    * executed on this RDD. It is strongly recommended that this RDD is persisted in
  6.    * memory, otherwise saving it on a file will require recomputation.
  7.    */
  8.   def checkpoint() {
  9.     if (context.checkpointDir.isEmpty) {
  10.       throw new SparkException("Checkpoint directory has not been set in the SparkContext")
  11.     } else if (checkpointData.isEmpty) {
  12.       checkpointData = Some(new RDDCheckpointData(this))
  13.       checkpointData.get.markForCheckpoint()
  14.     }
  15.   }

Cache機制和checkpoint機制的差別在于cache將RDD保存到內存,并保留Lineage,如果緩存失效RDD還可以通過Lineage重建。而checkpoint將RDD落地到磁盤并切斷Lineage,由文件系統保證其重建。

 

2.4 Spark任務的部署

Spark的集群部署分為Standalone、Mesos和Yarn三種模式,我們以Standalone模式為例,簡單介紹Spark程序的部署。如圖7示,集群中的Spark程序運行時分為3種角色,driver, master和worker(slave)。在集群啟動前,首先要配置master和worker節點。啟動集群后,worker節點會向master節點注冊自己,master節點會維護worker節點的心跳。Spark程序都需要先創建Spark上下文環境,也就是SparkContext。創建SparkContext的進程就成為了driver角色,上一節提到的DAGScheduler和TaskScheduler都在driver中運行。Spark程序在提交時要指定master的地址,這樣可以在程序啟動時向master申請worker的計算資源。Driver,master和worker之間的通信由Akka支持。Akka 也使用 Scala 編寫,用于構建可容錯的、高可伸縮性的Actor 模型應用。關于Akka,可以訪問其官方網站進行進一步了解,本文不做詳細介紹。

圖7 Spark任務部署

 

3、更深一步了解Spark內核

了解了Spark內核的基本概念和實現后,更深一步理解其工作原理的***方法就是閱讀源碼。***的Spark源碼可以從Spark官方網站下載。源碼推薦使用IntelliJ IDEA閱讀,會自動安裝Scala插件。讀者可以從core工程,也就是Spark內核工程開始閱讀,更可以設置斷點嘗試跟蹤一個任務的執行。另外,讀者還可以通過分析Spark的日志來進一步理解Spark的運行機制,Spark使用log4j記錄日志,可以在啟動集群前修改log4j的配置文件來配置日志輸出和格式。

責任編輯:林師授 來源: 明略數據
相關推薦

2012-12-20 13:02:20

2014-06-25 13:57:50

云計算大數據Spark

2019-06-27 11:18:00

Spark內存大數據

2019-04-08 17:11:46

大數據框架Spark

2018-06-07 16:33:31

大數據冷熱數據存儲平臺

2013-08-08 10:07:43

大數據存儲結構化數據

2014-07-04 10:01:08

Spark集群

2022-07-20 15:10:38

Docker大數據平臺

2017-04-24 12:07:44

Spark大數據并行計算

2015-08-18 13:35:42

spark

2009-12-15 15:35:56

Ruby symbol

2015-12-16 11:48:42

京東大數據

2015-08-04 09:22:37

2016-12-13 09:10:36

大數據人工智能計算工具

2017-09-02 10:03:10

大數據分析大數據數據

2015-12-17 11:23:44

京東大數據

2012-09-25 09:37:23

大數據云計算迪士尼

2017-05-05 12:59:00

大數據物聯網安全

2018-12-08 11:16:51

京東
點贊
收藏

51CTO技術棧公眾號

欧美精品成人91久久久久久久| 色成人在线视频| 国产高清精品一区| 六月丁香激情综合| 99久久99视频只有精品| 日韩女优电影在线观看| 免费成人午夜视频| 日本在线免费| 波多野结衣一区二区三区| 国产精品美女www爽爽爽视频| 欧美爱爱免费视频| 三级小说欧洲区亚洲区| 欧美超碰在线| www一区二区| 国产啪精品视频| 国产午夜视频在线播放| 奇米狠狠一区二区三区| 91麻豆精品国产91久久久久久| 国自产拍偷拍精品啪啪一区二区| 最新真实国产在线视频| 91丝袜高跟美女视频| 成人黄色免费网站在线观看| 六月丁香在线视频| 中文字幕亚洲精品乱码| 国产一区二区三区在线| 逼特逼视频在线观看| 成人精品国产亚洲| 欧美午夜美女看片| 久久这里只有精品23| 男人天堂久久久| 国产午夜亚洲精品不卡| 国产伦精品一区二区三区在线| 在线中文字幕网站| 麻豆九一精品爱看视频在线观看免费| 欧美国产亚洲精品久久久8v| 中文字幕黄色网址| 五月国产精品| 亚洲成人激情在线观看| 搡的我好爽在线观看免费视频| 国产亚洲一区二区手机在线观看 | 在线不卡a资源高清| 99精品视频在线看| 国产精品论坛| 午夜影视日本亚洲欧洲精品| 日本一道在线观看| 黄网站免费在线观看| 国产精品蜜臀av| 色女人综合av| 国产午夜在线视频| 久久久久久久久久久久久夜| 精品视频在线观看| 先锋av资源站| 91蝌蚪porny| 久久一区二区三区av| 国产一区自拍视频| 人妻 日韩精品 中文字幕| 精品96久久久久久中文字幕无| 理论片在线不卡免费观看| 强制高潮抽搐sm调教高h| 色中色综合网| 色老头一区二区三区在线观看| 中文字幕成人动漫| 欧美偷拍综合| 色婷婷综合成人| 亚洲熟女少妇一区二区| 亚洲电影在线一区二区三区| 欧美成人激情视频免费观看| 欧美日韩精品亚洲精品| 亚洲香蕉网站| 欧洲美女免费图片一区| 精品无码一区二区三区的天堂| 久久影院亚洲| 国产欧美日韩中文| 精品久久久久中文慕人妻| 成人黄色小视频在线观看| 国产美女精品久久久| 亚洲av成人无码久久精品老人| 26uuu亚洲综合色| 无遮挡亚洲一区| 欧美日韩国产一二三区| 黄色漫画在线免费看| 欧美性猛交xxxx富婆弯腰| 97xxxxx| 韩国精品主播一区二区在线观看| 欧美日韩国产免费| 久久久无码人妻精品无码| 国语一区二区三区| 一区二区欧美日韩视频| 91高清免费看| 亚洲国产精品一区| 国产精品久久久久久久久| 国产熟女一区二区丰满| 91色综合久久久久婷婷| 亚洲欧洲另类精品久久综合| 欧洲中文在线| 在线免费观看日本一区| 久久国产精品久久| 国产精品成人无码专区| 综合欧美亚洲| 最近2019免费中文字幕视频三| 波多野结衣亚洲色图| 免费在线成人| 91手机在线观看| 久久久pmvav| 亚洲人午夜精品天堂一二香蕉| 97中文字幕在线| 欧美日韩女优| 亚洲第一视频网站| 老司机深夜福利网站| 亚洲高清激情| 91精品久久久久久久久久入口| 殴美一级特黄aaaaaa| 国产精品久久一卡二卡| 男人操女人逼免费视频| 大胆国模一区二区三区| 亚洲毛片在线观看.| 1024手机在线视频| 奇米色一区二区| 久久99欧美| 午夜影院免费在线| 欧美日韩国产综合一区二区| 人体私拍套图hdxxxx| 久久精品免费一区二区三区| 国产精品96久久久久久又黄又硬| 风流老熟女一区二区三区| 中文字幕在线观看一区| 少妇激情一区二区三区| 欧美大片网址| 久久久久久久久久久91| 一本色道久久综合无码人妻| 久久无码av三级| av免费观看大全| 亚洲国产欧美国产第一区| 日韩中文字幕免费看| 成人h动漫精品一区二区下载| 成人免费毛片aaaaa**| 7777在线视频| crdy在线观看欧美| 欧美暴力喷水在线| 欧美激情日韩图片| a级片在线播放| 亚洲日本青草视频在线怡红院 | 国外成人免费视频| 国产在线xxx| 欧美一区二区三区免费大片| 国产探花在线视频| 激情综合网av| 艳母动漫在线免费观看| 久久免费影院| 久久精品国产亚洲7777| 91精品视频免费在线观看 | 亚洲一区二区四区| 国产日本久久| 中文字幕在线亚洲| 亚洲综合五月天婷婷丁香| 中文字幕不卡的av| gai在线观看免费高清| 久久亚洲专区| 91综合免费在线| 三级网站视频在在线播放| 欧美一区二区三区思思人| 538精品在线观看| 国产成人精品在线看| cao在线观看| 婷婷亚洲成人| 国产精品久久国产精品99gif| 国产午夜精品一区理论片| 欧美日韩一二三区| 日韩一级片大全| 成人午夜激情影院| 五十路熟女丰满大屁股| 一道本一区二区三区| 国产精品福利在线观看网址| 日韩三级影院| 精品国产乱码久久久久久免费| 日本三级黄色大片| 久久精品亚洲国产奇米99| av网站在线观看不卡| 精品国产99| 亚洲最大的成人网| 国产盗摄——sm在线视频| 亚洲天堂精品在线| 国产精品无码AV| 无吗不卡中文字幕| 久久久精品成人| 成人丝袜视频网| 亚洲人成无码www久久久| 日本丰满少妇做爰爽爽| 2020国产精品| 亚洲综合av在线播放| 亚洲国产精品第一区二区三区| 久草热久草热线频97精品| www.精品国产| 国语自产精品视频在免费| 高清美女视频一区| 日韩欧美国产一区在线观看| 国产字幕在线观看| 亚洲精品ww久久久久久p站| 三级黄色片网站| 久久国产精品无码网站| 免费国产黄色网址| 久久久久久久久久久久久久久久久久| 国产欧美丝袜| 四虎精品永久免费| 欧美亚洲国产成人精品| 黄色网址在线免费| 亚洲欧美日韩中文在线| 国产黄色大片网站| 欧美在线你懂的| 男人的天堂一区| 亚洲精品日韩综合观看成人91| 亚洲第一香蕉网| 成人污视频在线观看| 日本77777| 日韩中文欧美在线| 国产3p露脸普通话对白| 一区二区免费不卡在线| 色婷婷精品国产一区二区三区| 91成人精品在线| 92国产精品久久久久首页 | av在线收看| 亚洲第一精品夜夜躁人人躁| 国产精品无码专区av免费播放| 91久久精品国产91性色tv| 日韩免费在线视频观看| 亚洲乱码国产乱码精品精的特点| 老头老太做爰xxx视频| 久久综合九色欧美综合狠狠| 免费不卡的av| 国产精品自拍一区| www.污污视频| 精品中文字幕一区二区小辣椒| 久久久精品在线视频| 亚洲精品裸体| 成人在线播放网址| 亚洲综合婷婷| 中文字幕色呦呦| 91精品国产自产拍在线观看蜜 | 国产乱了高清露脸对白| 男人天堂网在线视频| 欧美在线影院一区二区| 无码人妻精品一区二区三区蜜桃91| 精品成人乱色一区二区| 国产在线观看免费av| 亚洲一区二区三区三| 久久一二三四区| 亚洲一区二区三区免费视频| 欧美xxxx黑人xyx性爽| 亚洲精品高清视频在线观看| 久久人妻无码aⅴ毛片a片app | 天天综合网天天| 欧美在线影院在线视频| 亚洲欧美小说色综合小说一区| 69久久夜色精品国产69乱青草| 91超碰在线| 欧美性做爰毛片| 免费观看成人性生生活片| 国产精品91免费在线| 深夜成人福利| 国产精品网红直播| 99久久99九九99九九九| 97人人澡人人爽| 日韩精选在线| 日本最新一区二区三区视频观看| 国产精品一线天粉嫩av| 亚洲不卡1区| 999国产精品| 毛片av在线播放| 99精品视频免费观看| 逼特逼视频在线| 日本亚洲最大的色成网站www| 亚洲欧美久久久久| 国产精品69毛片高清亚洲| 亚洲啪av永久无码精品放毛片 | 国产一区在线免费| 一本色道久久综合狠狠躁的番外| 先锋影音亚洲资源| 一个色综合网| 国产综合av在线| 久久国产综合精品| 国产精品果冻传媒| 国产无遮挡裸体视频在线观看| 亚洲男女自偷自拍图片另类| av在线电影观看| 欧美国产激情18| 欧美黑人粗大| 亚洲专区国产精品| 啪啪亚洲精品| 黄色一级片国产| 鲁大师成人一区二区三区| 日本不卡一区二区在线观看| av不卡一区二区三区| 国产91丝袜美女在线播放| 夜夜嗨av一区二区三区四季av| 国产精品免费精品一区| 欧美一区二区三区思思人| 三级在线视频| 九九精品视频在线| 三上悠亚激情av一区二区三区 | 欧美精品video| 福利视频一区| 国产伦精品一区二区三毛| 日韩激情在线| 欧美牲交a欧美牲交aⅴ免费真| 久草在线在线精品观看| 双性尿奴穿贞c带憋尿| 亚洲精品日韩一| 日本成人一级片| 亚洲成人1234| 国产一区久久精品| 国产成人一区二区三区| 国产成人aa在线观看网站站| 亚洲国产欧美日韩| 美女久久一区| 无码国产精品一区二区免费式直播 | 欧美日韩一区二区免费视频| 99在线观看免费| 中文字幕亚洲精品| 日韩性xxx| 精品亚洲欧美日韩| 红桃视频亚洲| 中文字幕视频三区| 欧美极品少妇xxxxⅹ高跟鞋| 日韩少妇裸体做爰视频| 日韩欧美国产麻豆| 麻豆传媒在线完整视频| 国产精品免费在线免费| 免费不卡中文字幕在线| 少妇人妻无码专区视频| 成人午夜碰碰视频| 免费一级全黄少妇性色生活片| 欧美挠脚心视频网站| av网站在线免费观看| 日韩美女写真福利在线观看| 国产一级成人av| 国产成人永久免费视频| 国产精品夜夜嗨| 人妻人人澡人人添人人爽| 欧美日韩国产美| 老司机免费在线视频| 国产在线观看精品| 国产精品久久久久久久| 污视频网站观看| 中文字幕精品在线不卡| 国产精品国产三级国产aⅴ9色| 成人在线免费| 亚洲午夜在线观看| 免费在线成人网| 国产精品suv一区二区88| 欧美亚洲免费在线一区| 成年人在线看| 国产欧美日韩中文字幕| 国产精品久久久久久| 91欧美一区二区三区| 亚洲色图一区二区三区| 99热这里只有精品在线观看| 欧美高跟鞋交xxxxhd| 哺乳挤奶一区二区三区免费看| 屁屁影院ccyy国产第一页| 丁香啪啪综合成人亚洲小说 | 国产在线不卡| 成熟妇人a片免费看网站| 亚洲国产精品一区二区久久| 天堂中文字幕av| 日韩免费观看网站| 日韩精品不卡一区二区| 国产欧美激情视频| 亚洲一区二区中文在线| 四虎精品在永久在线观看| 国产精品18久久久久久首页狼| re久久精品视频| 性生活一级大片| 精品成人av一区| av中文天堂在线| 1卡2卡3卡精品视频| 亚洲欧洲一区| 国产又黄又粗视频| 日韩一区二区在线观看视频| 8x8ⅹ拨牐拨牐拨牐在线观看| 蜜桃传媒一区二区| 国产自产高清不卡| 国产污污视频在线观看| 国产一区二区黑人欧美xxxx| vam成人资源在线观看| 俄罗斯av网站| 国产精品成人一区二区艾草| 亚洲av无码乱码在线观看性色| 88xx成人精品| 国产精品久久天天影视| 日本三级日本三级日本三级极| 欧美性大战久久久久久久蜜臀 | 色欲无码人妻久久精品| 欧美日韩国产在线| 麻豆网站视频在线观看| 黑人另类av| 精品一区二区免费看| 日本中文字幕在线免费观看| 中文字幕精品在线| 老司机凹凸av亚洲导航| 91国内在线播放|