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

上萬字詳解Spark Core

大數據 Spark
Spark 產生之前,已經有MapReduce這類非常成熟的計算系統存在了,并提供了高層次的API(map/reduce),把計算運行在集群中并提供容錯能力,從而實現分布式計算。

[[387811]]

本文轉載自微信公眾號「五分鐘學大數據」,作者園陌。轉載本文請聯系五分鐘學大數據公眾號。

先來一個問題,也是面試中常問的:

Spark為什么會流行?

原因1:優秀的數據模型和豐富計算抽象

Spark 產生之前,已經有MapReduce這類非常成熟的計算系統存在了,并提供了高層次的API(map/reduce),把計算運行在集群中并提供容錯能力,從而實現分布式計算。

雖然MapReduce提供了對數據訪問和計算的抽象,但是對于數據的復用就是簡單的將中間數據寫到一個穩定的文件系統中(例如HDFS),所以會產生數據的復制備份,磁盤的I/O以及數據的序列化,所以在遇到需要在多個計算之間復用中間結果的操作時效率就會非常的低。而這類操作是非常常見的,例如迭代式計算,交互式數據挖掘,圖計算等。

認識到這個問題后,學術界的 AMPLab 提出了一個新的模型,叫做 RDD。RDD 是一個可以容錯且并行的數據結構(其實可以理解成分布式的集合,操作起來和操作本地集合一樣簡單),它可以讓用戶顯式的將中間結果數據集保存在內存中,并且通過控制數據集的分區來達到數據存放處理最優化。同時 RDD也提供了豐富的 API (map、reduce、filter、foreach、redeceByKey...)來操作數據集。后來RDD被 AMPLab 在一個叫做 Spark 的框架中提供并開源。

簡而言之,Spark 借鑒了 MapReduce 思想發展而來,保留了其分布式并行計算的優點并改進了其明顯的缺陷。讓中間數據存儲在內存中提高了運行速度、并提供豐富的操作數據的API提高了開發速度。

原因2:完善的生態圈-fullstack

目前,Spark已經發展成為一個包含多個子項目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子項目。

Spark Core:實現了 Spark 的基本功能,包含RDD、任務調度、內存管理、錯誤恢復、與存儲系統交互等模塊。

Spark SQL:Spark 用來操作結構化數據的程序包。通過 Spark SQL,我們可以使用 SQL操作數據。

Spark Streaming:Spark 提供的對實時數據進行流式計算的組件。提供了用來操作數據流的 API。

Spark MLlib:提供常見的機器學習(ML)功能的程序庫。包括分類、回歸、聚類、協同過濾等,還提供了模型評估、數據導入等額外的支持功能。

GraphX(圖計算):Spark中用于圖計算的API,性能良好,擁有豐富的功能和運算符,能在海量數據上自如地運行復雜的圖算法。

集群管理器:Spark 設計為可以高效地在一個計算節點到數千個計算節點之間伸縮計算。

StructuredStreaming:處理結構化流,統一了離線和實時的API。

Spark VS Hadoop

 

 

  Hadoop Spark
類型 基礎平臺, 包含計算, 存儲, 調度 分布式計算工具
場景 大規模數據集上的批處理 迭代計算, 交互式計算, 流計算
價格 對機器要求低, 便宜 對內存有要求, 相對較貴
編程范式 Map+Reduce, API 較為底層, 算法適應性差 RDD組成DAG有向無環圖, API 較為頂層, 方便使用
數據存儲結構 MapReduce中間計算結果存在HDFS磁盤上, 延遲大 RDD中間運算結果存在內存中 , 延遲小
運行方式 Task以進程方式維護, 任務啟動慢 Task以線程方式維護, 任務啟動快

 

 

注意:

盡管Spark相對于Hadoop而言具有較大優勢,但Spark并不能完全替代Hadoop,Spark主要用于替代Hadoop中的MapReduce計算模型。存儲依然可以使用HDFS,但是中間結果可以存放在內存中;調度可以使用Spark內置的,也可以使用更成熟的調度系統YARN等。

實際上,Spark已經很好地融入了Hadoop生態圈,并成為其中的重要一員,它可以借助于YARN實現資源調度管理,借助于HDFS實現分布式存儲。

此外,Hadoop可以使用廉價的、異構的機器來做分布式存儲與計算,但是,Spark對硬件的要求稍高一些,對內存與CPU有一定的要求。

Spark Core

一、RDD詳解

1. 為什么要有RDD?

在許多迭代式算法(比如機器學習、圖算法等)和交互式數據挖掘中,不同計算階段之間會重用中間結果,即一個階段的輸出結果會作為下一個階段的輸入。但是,之前的MapReduce框架采用非循環式的數據流模型,把中間結果寫入到HDFS中,帶來了大量的數據復制、磁盤IO和序列化開銷。且這些框架只能支持一些特定的計算模式(map/reduce),并沒有提供一種通用的數據抽象。

AMP實驗室發表的一篇關于RDD的論文:《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》就是為了解決這些問題的。

RDD提供了一個抽象的數據模型,讓我們不必擔心底層數據的分布式特性,只需將具體的應用邏輯表達為一系列轉換操作(函數),不同RDD之間的轉換操作之間還可以形成依賴關系,進而實現管道化,從而避免了中間結果的存儲,大大降低了數據復制、磁盤IO和序列化開銷,并且還提供了更多的API(map/reduec/filter/groupBy...)。

2. RDD是什么?

RDD(Resilient Distributed Dataset)叫做彈性分布式數據集,是Spark中最基本的數據抽象,代表一個不可變、可分區、里面的元素可并行計算的集合。單詞拆解:

Resilient :它是彈性的,RDD里面的中的數據可以保存在內存中或者磁盤里面

Distributed :它里面的元素是分布式存儲的,可以用于分布式計算

Dataset: 它是一個集合,可以存放很多元素

3. RDD主要屬性

進入RDD的源碼中看下:

RDD源碼

在源碼中可以看到有對RDD介紹的注釋,我們來翻譯下:

A list of partitions :一組分片(Partition)/一個分區(Partition)列表,即數據集的基本組成單位。對于RDD來說,每個分片都會被一個計算任務處理,分片數決定并行度。用戶可以在創建RDD時指定RDD的分片個數,如果沒有指定,那么就會采用默認值。

A function for computing each split :一個函數會被作用在每一個分區。Spark中RDD的計算是以分片為單位的,compute函數會被作用到每個分區上。

A list of dependencies on other RDDs :一個RDD會依賴于其他多個RDD。RDD的每次轉換都會生成一個新的RDD,所以RDD之間就會形成類似于流水線一樣的前后依賴關系。在部分分區數據丟失時,Spark可以通過這個依賴關系重新計算丟失的分區數據,而不是對RDD的所有分區進行重新計算。(Spark的容錯機制)

Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):可選項,對于KV類型的RDD會有一個Partitioner,即RDD的分區函數,默認為HashPartitioner。

Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file):可選項,一個列表,存儲存取每個Partition的優先位置(preferred location)。對于一個HDFS文件來說,這個列表保存的就是每個Partition所在的塊的位置。按照"移動數據不如移動計算"的理念,Spark在進行任務調度的時候,會盡可能選擇那些存有數據的worker節點來進行任務計算。

總結

RDD 是一個數據集的表示,不僅表示了數據集,還表示了這個數據集從哪來,如何計算,主要屬性包括:

  1. 分區列表
  2. 計算函數
  3. 依賴關系
  4. 分區函數(默認是hash)
  5. 最佳位置

分區列表、分區函數、最佳位置,這三個屬性其實說的就是數據集在哪,在哪計算更合適,如何分區;

計算函數、依賴關系,這兩個屬性其實說的是數據集怎么來的。

二、RDD-API

1. RDD的創建方式

由外部存儲系統的數據集創建,包括本地的文件系統,還有所有Hadoop支持的數據集,比如HDFS、Cassandra、HBase等:

  1. val rdd1 = sc.textFile("hdfs://node1:8020/wordcount/input/words.txt"

通過已有的RDD經過算子轉換生成新的RDD:

  1. val rdd2=rdd1.flatMap(_.split(" ")) 

由一個已經存在的Scala集合創建:

  1. val rdd3 = sc.parallelize(Array(1,2,3,4,5,6,7,8))或 
  2. val rdd4 = sc.makeRDD(List(1,2,3,4,5,6,7,8)) 

makeRDD方法底層調用了parallelize方法:

RDD源碼

2. RDD的算子分類

RDD的算子分為兩類:

Transformation轉換操作:返回一個新的RDD

Action動作操作:返回值不是RDD(無返回值或返回其他的)

注意:

1、RDD不實際存儲真正要計算的數據,而是記錄了數據的位置在哪里,數據的轉換關系(調用了什么方法,傳入什么函數)。

2、RDD中的所有轉換都是惰性求值/延遲執行的,也就是說并不會直接計算。只有當發生一個要求返回結果給Driver的Action動作時,這些轉換才會真正運行。

3、之所以使用惰性求值/延遲執行,是因為這樣可以在Action時對RDD操作形成DAG有向無環圖進行Stage的劃分和并行優化,這種設計讓Spark更加有效率地運行。

3. Transformation轉換算子

轉換算子 含義
map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函數轉換后組成
filter(func) 返回一個新的RDD,該RDD由經過func函數計算后返回值為true的輸入元素組成
flatMap(func) 類似于map,但是每一個輸入元素可以被映射為0或多個輸出元素(所以func應該返回一個序列,而不是單一元素)
mapPartitions(func) 類似于map,但獨立地在RDD的每一個分片上運行,因此在類型為T的RDD上運行時,func的函數類型必須是Iterator[T] => Iterator[U]
mapPartitionsWithIndex(func) 類似于mapPartitions,但func帶有一個整數參數表示分片的索引值,因此在類型為T的RDD上運行時,func的函數類型必須是(Int, Interator[T]) => Iterator[U]
sample(withReplacement, fraction, seed) 根據fraction指定的比例對數據進行采樣,可以選擇是否使用隨機數進行替換,seed用于指定隨機數生成器種子
union(otherDataset) 對源RDD和參數RDD求并集后返回一個新的RDD
intersection(otherDataset) 對源RDD和參數RDD求交集后返回一個新的RDD
distinct([numTasks])) 對源RDD進行去重后返回一個新的RDD
groupByKey([numTasks]) 在一個(K,V)的RDD上調用,返回一個(K, Iterator[V])的RDD
reduceByKey(func, [numTasks]) 在一個(K,V)的RDD上調用,返回一個(K,V)的RDD,使用指定的reduce函數,將相同key的值聚合到一起,與groupByKey類似,reduce任務的個數可以通過第二個可選的參數來設置
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 對PairRDD中相同的Key值進行聚合操作,在聚合過程中同樣使用了一個中立的初始值。和aggregate函數類似,aggregateByKey返回值的類型不需要和RDD中value的類型一致
sortByKey([ascending], [numTasks]) 在一個(K,V)的RDD上調用,K必須實現Ordered接口,返回一個按照key進行排序的(K,V)的RDD
sortBy(func,[ascending], [numTasks]) 與sortByKey類似,但是更靈活
join(otherDataset, [numTasks]) 在類型為(K,V)和(K,W)的RDD上調用,返回一個相同key對應的所有元素對在一起的(K,(V,W))的RDD
cogroup(otherDataset, [numTasks]) 在類型為(K,V)和(K,W)的RDD上調用,返回一個(K,(Iterable,Iterable))類型的RDD
cartesian(otherDataset) 笛卡爾積
pipe(command, [envVars]) 對rdd進行管道操作
coalesce(numPartitions) 減少 RDD 的分區數到指定值。在過濾大量數據之后,可以執行此操作
repartition(numPartitions) 重新給 RDD 分區

4. Action動作算子

 

動作算子 含義
reduce(func) 通過func函數聚集RDD中的所有元素,這個功能必須是可交換且可并聯的
collect() 在驅動程序中,以數組的形式返回數據集的所有元素
count() 返回RDD的元素個數
first() 返回RDD的第一個元素(類似于take(1))
take(n) 返回一個由數據集的前n個元素組成的數組
takeSample(withReplacement,num, [seed]) 返回一個數組,該數組由從數據集中隨機采樣的num個元素組成,可以選擇是否用隨機數替換不足的部分,seed用于指定隨機數生成器種子
takeOrdered(n, [ordering]) 返回自然順序或者自定義順序的前 n 個元素
saveAsTextFile(path) 將數據集的元素以textfile的形式保存到HDFS文件系統或者其他支持的文件系統,對于每個元素,Spark將會調用toString方法,將它裝換為文件中的文本
saveAsSequenceFile(path) 將數據集中的元素以Hadoop sequencefile的格式保存到指定的目錄下,可以使HDFS或者其他Hadoop支持的文件系統
saveAsObjectFile(path) 將數據集的元素,以 Java 序列化的方式保存到指定的目錄下
countByKey() 針對(K,V)類型的RDD,返回一個(K,Int)的map,表示每一個key對應的元素個數
foreach(func) 在數據集的每一個元素上,運行函數func進行更新
foreachPartition(func) 在數據集的每一個分區上,運行函數func

統計操作:

算子 含義
count 個數
mean 均值
sum 求和
max 最大值
min 最小值
variance 方差
sampleVariance 從采樣中計算方差
stdev 標準差:衡量數據的離散程度
sampleStdev 采樣的標準差
stats 查看統計結果

三、RDD的持久化/緩存

在實際開發中某些RDD的計算或轉換可能會比較耗費時間,如果這些RDD后續還會頻繁的被使用到,那么可以將這些RDD進行持久化/緩存,這樣下次再使用到的時候就不用再重新計算了,提高了程序運行的效率。

  1. val rdd1 = sc.textFile("hdfs://node01:8020/words.txt"
  2. val rdd2 = rdd1.flatMap(x=>x.split(" ")).map((_,1)).reduceByKey(_+_) 
  3. rdd2.cache //緩存/持久化 
  4. rdd2.sortBy(_._2,false).collect//觸發action,會去讀取HDFS的文件,rdd2會真正執行持久化 
  5. rdd2.sortBy(_._2,false).collect//觸發action,會去讀緩存中的數據,執行速度會比之前快,因為rdd2已經持久化到內存中了 

持久化/緩存API詳解

ersist方法和cache方法

RDD通過persist或cache方法可以將前面的計算結果緩存,但是并不是這兩個方法被調用時立即緩存,而是觸發后面的action時,該RDD將會被緩存在計算節點的內存中,并供后面重用。

通過查看RDD的源碼發現cache最終也是調用了persist無參方法(默認存儲只存在內存中):

RDD源碼

存儲級別

默認的存儲級別都是僅在內存存儲一份,Spark的存儲級別還有好多種,存儲級別在object StorageLevel中定義的。

持久化級別 說明
MORY_ONLY(默認) 將RDD以非序列化的Java對象存儲在JVM中。如果沒有足夠的內存存儲RDD,則某些分區將不會被緩存,每次需要時都會重新計算。這是默認級別
MORY_AND_DISK(開發中可以使用這個) 將RDD以非序列化的Java對象存儲在JVM中。如果數據在內存中放不下,則溢寫到磁盤上.需要時則會從磁盤上讀取
MEMORY_ONLY_SER (Java and Scala) 將RDD以序列化的Java對象(每個分區一個字節數組)的方式存儲.這通常比非序列化對象(deserialized objects)更具空間效率,特別是在使用快速序列化的情況下,但是這種方式讀取數據會消耗更多的CPU
MEMORY_AND_DISK_SER (Java and Scala) 與MEMORY_ONLY_SER類似,但如果數據在內存中放不下,則溢寫到磁盤上,而不是每次需要重新計算它們
DISK_ONLY 將RDD分區存儲在磁盤上
MEMORY_ONLY_2, MEMORY_AND_DISK_2等 與上面的儲存級別相同,只不過將持久化數據存為兩份,備份每個分區存儲在兩個集群節點上
OFF_HEAP(實驗中) 與MEMORY_ONLY_SER類似,但將數據存儲在堆外內存中。(即不是直接存儲在JVM內存中)

總結:

RDD持久化/緩存的目的是為了提高后續操作的速度

緩存的級別有很多,默認只存在內存中,開發中使用memory_and_disk

只有執行action操作的時候才會真正將RDD數據進行持久化/緩存

實際開發中如果某一個RDD后續會被頻繁的使用,可以將該RDD進行持久化/緩存

四、RDD容錯機制Checkpoint

持久化的局限:

持久化/緩存可以把數據放在內存中,雖然是快速的,但是也是最不可靠的;也可以把數據放在磁盤上,也不是完全可靠的!例如磁盤會損壞等。

問題解決:

Checkpoint的產生就是為了更加可靠的數據持久化,在Checkpoint的時候一般把數據放在在HDFS上,這就天然的借助了HDFS天生的高容錯、高可靠來實現數據最大程度上的安全,實現了RDD的容錯和高可用。

用法:

  1. SparkContext.setCheckpointDir("目錄") //HDFS的目錄 
  2.  
  3. RDD.checkpoint 

總結:

開發中如何保證數據的安全性性及讀取效率:可以對頻繁使用且重要的數據,先做緩存/持久化,再做checkpint操作。

持久化和Checkpoint的區別:

  1. 位置:Persist 和 Cache 只能保存在本地的磁盤和內存中(或者堆外內存--實驗中) Checkpoint 可以保存數據到 HDFS 這類可靠的存儲上。
  2. 生命周期:Cache和Persist的RDD會在程序結束后會被清除或者手動調用unpersist方法 Checkpoint的RDD在程序結束后依然存在,不會被刪除。

五、RDD依賴關系

1. 寬窄依賴

兩種依賴關系類型:RDD和它依賴的父RDD的關系有兩種不同的類型,即寬依賴(wide dependency/shuffle dependency)窄依賴(narrow dependency)

圖解:

寬窄依賴

如何區分寬窄依賴:

窄依賴:父RDD的一個分區只會被子RDD的一個分區依賴;

寬依賴:父RDD的一個分區會被子RDD的多個分區依賴(涉及到shuffle)。

2. 為什么要設計寬窄依賴

對于窄依賴:

窄依賴的多個分區可以并行計算;

窄依賴的一個分區的數據如果丟失只需要重新計算對應的分區的數據就可以了。

對于寬依賴:

劃分Stage(階段)的依據:對于寬依賴,必須等到上一階段計算完成才能計算下一階段。

六、DAG的生成和劃分Stage

1. DAG介紹

DAG是什么:

DAG(Directed Acyclic Graph有向無環圖)指的是數據轉換執行的過程,有方向,無閉環(其實就是RDD執行的流程);

原始的RDD通過一系列的轉換操作就形成了DAG有向無環圖,任務執行時,可以按照DAG的描述,執行真正的計算(數據被操作的一個過程)。

DAG的邊界

開始:通過SparkContext創建的RDD;

結束:觸發Action,一旦觸發Action就形成了一個完整的DAG。

2.DAG劃分Stage

DAG劃分Stage

一個Spark程序可以有多個DAG(有幾個Action,就有幾個DAG,上圖最后只有一個Action(圖中未表現),那么就是一個DAG)。

一個DAG可以有多個Stage(根據寬依賴/shuffle進行劃分)。

同一個Stage可以有多個Task并行執行(task數=分區數,如上圖,Stage1 中有三個分區P1、P2、P3,對應的也有三個 Task)。

可以看到這個DAG中只reduceByKey操作是一個寬依賴,Spark內核會以此為邊界將其前后劃分成不同的Stage。

同時我們可以注意到,在圖中Stage1中,從textFile到flatMap到map都是窄依賴,這幾步操作可以形成一個流水線操作,通過flatMap操作生成的partition可以不用等待整個RDD計算結束,而是繼續進行map操作,這樣大大提高了計算的效率。

  • 為什么要劃分Stage? --并行計算

一個復雜的業務邏輯如果有shuffle,那么就意味著前面階段產生結果后,才能執行下一個階段,即下一個階段的計算要依賴上一個階段的數據。那么我們按照shuffle進行劃分(也就是按照寬依賴就行劃分),就可以將一個DAG劃分成多個Stage/階段,在同一個Stage中,會有多個算子操作,可以形成一個pipeline流水線,流水線內的多個平行的分區可以并行執行。

  • 如何劃分DAG的stage?

對于窄依賴,partition的轉換處理在stage中完成計算,不劃分(將窄依賴盡量放在在同一個stage中,可以實現流水線計算)。

對于寬依賴,由于有shuffle的存在,只能在父RDD處理完成后,才能開始接下來的計算,也就是說需要要劃分stage。

總結:

Spark會根據shuffle/寬依賴使用回溯算法來對DAG進行Stage劃分,從后往前,遇到寬依賴就斷開,遇到窄依賴就把當前的RDD加入到當前的stage/階段中

具體的劃分算法請參見AMP實驗室發表的論文:《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》

 

http://xueshu.baidu.com/usercenter/paper/show?paperid=b33564e60f0a7e7a1889a9da10963461&site=xueshu_se

 

責任編輯:武曉燕 來源: 五分鐘學大數據
相關推薦

2023-10-31 12:58:00

TypeScriptJavaScript

2023-04-10 08:11:23

@Lazy懶漢模式餓漢模式

2024-08-13 15:07:20

2022-09-06 08:02:40

死鎖順序鎖輪詢鎖

2024-09-26 13:33:12

2024-12-31 00:00:01

驅動設計應用場景業務邏輯

2024-08-30 10:29:21

2021-03-18 10:04:46

數據倉庫體系

2022-07-11 10:08:34

大數據平臺機房

2023-10-26 00:37:40

滴滴彈性云公有云

2023-02-16 18:22:44

ChatGPTWolfram語言

2020-11-05 08:14:17

鏈表

2021-11-11 09:27:02

技術RedisMySQL

2024-07-19 08:34:18

2023-01-06 08:15:58

StreamAPI接口

2021-10-18 11:58:56

負載均衡虛擬機

2020-04-16 14:40:02

MySQL數據庫架構

2023-03-30 08:28:57

explain關鍵字MySQL

2024-03-07 12:31:29

AI技術

2025-09-05 07:23:12

點贊
收藏

51CTO技術棧公眾號

色中色在线视频| 国产一级视频在线观看| 久久精品国产精品亚洲毛片| 国产精品天美传媒沈樵| 91精品免费视频| 久艹视频在线观看| 窝窝社区一区二区| 欧美麻豆精品久久久久久| 毛片av在线播放| 欧洲毛片在线| 国产一区二区三区在线观看免费视频 | 亚洲激情自拍偷拍| 美乳视频一区二区| a网站在线观看| 狂野欧美一区| 久久理论片午夜琪琪电影网| 1024手机在线观看你懂的| 18国产精品| 欧美日韩国产免费| 日韩欧美精品在线观看视频| 超碰免费在线播放| 久久日韩精品一区二区五区| 91亚洲精品视频| 无码人妻精品一区二| 黄色精品免费| 精品国内产的精品视频在线观看| 香蕉网在线播放| 视频二区欧美| 欧美浪妇xxxx高跟鞋交| 777米奇影视第四色| 中文在线免费| 中文字幕在线播放不卡一区| 你懂的视频在线一区二区| www.激情五月| 精东粉嫩av免费一区二区三区 | 日韩三级成人| 色噜噜狠狠成人网p站| 天堂8在线天堂资源bt| 精品国产丝袜高跟鞋| 国产欧美一区二区在线| 久久精品ww人人做人人爽| 亚洲精选一区二区三区| 久草热8精品视频在线观看| 国产成人一区二区三区小说| 久久久久久国产精品免费播放| 99久久激情| 色综合影院在线| 亚洲不卡的av| 日韩大片在线| 中文字幕亚洲二区| 先锋影音av在线| 欧美日韩第一| 中文字幕一区电影| 成年人视频软件| 色999日韩| 久久精品国产91精品亚洲 | 天堂影院在线| 91在线观看视频| 免费久久99精品国产自| 免费一级毛片在线观看| 久久精品人人爽人人爽| 日本成人三级电影网站| 浮生影视网在线观看免费| 久久精品无码一区二区三区| 日韩av图片| 大片免费播放在线视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 91在线观看免费网站| 99久久精品国产一区色| 国产91在线观看丝袜| 国产三区精品| 日本视频在线观看一区二区三区| 国产亚洲精品bt天堂精选| 四虎影院一区二区三区| 麻豆免费在线观看| 亚洲一区二区在线免费看| 老太脱裤子让老头玩xxxxx| 免费看男女www网站入口在线| 色综合色综合色综合| 在线观看的毛片| 玖玖玖电影综合影院| 亚洲国产精品成人av| 爱爱免费小视频| 日韩中文在线电影| 久久全球大尺度高清视频| 一二三区免费视频| 激情深爱一区二区| 国内精品国语自产拍在线观看| 欧美色视频免费| 国产精品福利一区二区| 僵尸世界大战2 在线播放| 日韩电影网站| 欧美一区二区三区系列电影| 粉嫩av懂色av蜜臀av分享| 欧美影院三区| 久久99精品久久久久久琪琪| 中文字幕亚洲乱码熟女1区2区| 麻豆精品新av中文字幕| 国产精品播放| 免费在线看a| 午夜天堂影视香蕉久久| 欧美成人黄色网址| 精品网站aaa| 久久伊人精品视频| 日日夜夜狠狠操| 国产黑丝在线一区二区三区| 日韩av电影免费观看| 日本在线视频www鲁啊鲁| 色视频一区二区| 麻豆短视频在线观看| 成人女性视频| 91国内精品久久| av一区二区三| 亚洲国产精品二十页| 国产手机免费视频| 中文成人激情娱乐网| 亚洲精品永久免费精品| 欧美日韩一级在线观看| 蜜桃av一区二区三区| 狠狠综合久久av| а√天堂8资源在线官网| 色成人在线视频| 800av在线播放| 欧美日本一区二区高清播放视频| 国产精品美女久久久久av超清| 日韩一区免费视频| 一区二区三区精品视频在线| 中文久久久久久| 自拍自偷一区二区三区| 久久欧美在线电影| 丁香六月色婷婷| 亚洲三级在线免费观看| 欧美精品aaaa| 久久综合色占| 热门国产精品亚洲第一区在线| 国精产品一品二品国精品69xx| 亚洲婷婷综合久久一本伊一区| www.亚洲天堂网| 亚洲婷婷伊人| 日本一区二区三区在线播放 | 成人免费观看视频| 中文字幕色呦呦| 国产日韩欧美中文在线| 日韩专区在线观看| 国产精品久久久久久69| 中文字幕五月欧美| 九九久久久久久| 日韩成人影院| 91久久久在线| 中文字幕有码在线视频| 精品日韩一区二区三区免费视频| 日本精品人妻无码77777| 国产精品99久久久久久久vr| 欧洲精品视频在线| 99a精品视频在线观看| 久久99国产精品自在自在app| 丰满人妻一区二区三区四区53| 亚洲专区一二三| 国产精品扒开腿做爽爽爽a片唱戏| 黄色成人精品网站| 久久久久久久久久久一区| 神马电影网我不卡| 中文字幕亚洲字幕| 国产jzjzjz丝袜老师水多| 亚洲综合色自拍一区| av电影在线播放| 一级成人国产| 亚洲成色最大综合在线| 日本午夜免费一区二区| 欧美日本黄视频| 蜜臀久久99精品久久久| 欧美午夜丰满在线18影院| 欧美偷拍一区二区三区| 国产资源在线一区| 日韩伦理在线免费观看| 香蕉视频一区二区三区| 国产精品偷伦免费视频观看的| 日本天堂在线观看| 精品国产a毛片| 欧美超碰在线观看| 综合激情成人伊人| 性久久久久久久久久久| 日本不卡免费在线视频| 青青草综合视频| 欧美女优在线视频| 91成人伦理在线电影| 青青青免费在线视频| 最好看的2019年中文视频| www.亚洲黄色| 色呦呦日韩精品| 极品久久久久久| 久久久三级国产网站| 欧美xxxxxbbbbb| 久久激情中文| 亚洲一区 在线播放| 你微笑时很美电视剧整集高清不卡| 国产伦精品一区二区三区精品视频| 久久不射影院| 伊人久久五月天| 欧美熟妇另类久久久久久不卡| 在线精品视频免费播放| 黄色一级片在线| 中文在线一区二区| 久久久高清视频| 精品在线免费观看| 欧美三级午夜理伦三级| 欧美日本中文| 亚洲一区二区高清视频| 欧美电影完整版在线观看| 国产在线999| 日韩成人高清| 97碰在线观看| 综合久久2019| 伊人伊人伊人久久| 青青草在线播放| 精品久久久久久久人人人人传媒| 亚洲最大成人在线视频| 色域天天综合网| 中日韩精品视频在线观看| 亚洲欧美日本韩国| a级黄色免费视频| 久久精品无码一区二区三区| 变态另类丨国产精品| 福利91精品一区二区三区| 狠狠干狠狠操视频| 日韩国产一区二| 国产精品wwwww| 一本综合久久| 2022亚洲天堂| 亚洲一区二区动漫| 日韩网站在线免费观看| 欧美三级黄美女| 国产女人18毛片| 91精品综合| 热这里只有精品| 羞羞答答成人影院www| 婷婷亚洲婷婷综合色香五月| 国产午夜一区| 视频一区二区三| 精品无人区麻豆乱码久久久| 日本高清不卡一区二区三| 亚洲精品小区久久久久久| 久久99精品久久久久久水蜜桃| 高清欧美性猛交xxxx黑人猛| 国产精品18毛片一区二区| 91精品导航| 国产一区二区免费电影| 女人抽搐喷水高潮国产精品| 久久综合毛片| 红桃成人av在线播放| 视频一区视频二区视频三区高| 精品美女久久| 最新欧美日韩亚洲| 亚洲国产精品日韩专区av有中文| 亚洲欧美一二三| 欧美日韩蜜桃| 国产欧美日韩网站| 亚洲一区久久| 日本一极黄色片| 美女网站在线免费欧美精品| 色婷婷激情视频| 国产suv一区二区三区88区| 精品无码人妻少妇久久久久久| 99精品视频一区| 日韩精品卡通动漫网站| 国产日产欧美一区二区三区| 国产精品18在线| 亚洲综合视频网| 国产精品va无码一区二区三区| 在线免费av一区| av网站在线免费看| 日韩av一区在线| av二区在线| 九九热99久久久国产盗摄| 男人久久天堂| 国产欧美 在线欧美| 北条麻妃一区二区三区在线观看 | 99热手机在线| 美日韩一二三区 | 日韩av片在线| 亚洲欧美一区二区三区久本道91| 青娱乐国产盛宴| 欧美午夜xxx| 国产精品久久无码一三区| 精品福利在线导航| 99re热久久这里只有精品34| 欧美区二区三区| 国产韩日精品| 成人自拍网站| 久久裸体网站| av高清在线免费观看| 美国三级日本三级久久99| 人妖粗暴刺激videos呻吟| 国产精品乱人伦一区二区| 国产一级中文字幕| 欧美日韩你懂得| 人妻与黑人一区二区三区| 亚洲欧美日韩精品久久亚洲区 | 91av国产在线| 国产精品99久久免费| 欧美日韩视频在线一区二区观看视频| 久久久久国产| 老头吃奶性行交视频| 波多野结衣一区二区三区| 乱老熟女一区二区三区| 疯狂做受xxxx欧美肥白少妇| 国产农村妇女毛片精品久久| 亚洲日韩中文字幕在线播放| 黄色影院在线看| 国产欧美日韩视频| 九九热爱视频精品视频| 久久精品xxx| 麻豆国产欧美日韩综合精品二区| 国产偷人妻精品一区| 夜夜嗨av一区二区三区中文字幕| 中文在线最新版天堂| 国产视频精品在线| 成人免费一区二区三区牛牛| 国产综合香蕉五月婷在线| 综合亚洲色图| 丁香花在线影院观看在线播放| 国产精品白丝jk黑袜喷水| 老司机精品免费视频| 色猫猫国产区一区二在线视频| 亚洲aⅴ在线观看| 欧美劲爆第一页| 亚洲码欧美码一区二区三区| 路边理发店露脸熟妇泻火| 麻豆精品一区二区三区| 91l九色lporny| 色偷偷成人一区二区三区91 | 久久gogo国模啪啪裸体| 亚洲一区二区三区色| 人人狠狠综合久久亚洲| 欧洲av一区二区三区| 色婷婷国产精品| 欧美18xxxxx| 日韩av手机在线观看| 性欧美lx╳lx╳| 欧美日韩国产精品激情在线播放| 成人av综合一区| 日韩 国产 在线| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 日韩美女在线| 中文字幕超清在线免费观看| 精品一区二区三区影院在线午夜| 99久久久无码国产精品不卡| 欧美日韩亚洲高清一区二区| 日本三级在线视频| 成人久久精品视频| 欧美精品国产| 国产精九九网站漫画| 亚洲福利一区二区三区| 天天色综合久久| 奇米四色中文综合久久| 国产欧美亚洲精品a| wwwwwxxxx日本| 怡红院av一区二区三区| 神马午夜在线观看| 欧美一级大片在线观看| 成人在线亚洲| 亚洲天堂av一区二区三区| 亚洲精品日韩一| 日本人妻丰满熟妇久久久久久| 欧美最猛性xxxxx亚洲精品| 国产精品一在线观看| 高清一区二区视频| 亚洲精品国产第一综合99久久| 欧美特级特黄aaaaaa在线看| 国产成人精品999| 天天天综合网| 性色av蜜臀av浪潮av老女人| 色一情一乱一乱一91av| 久草资源在线观看| 国产一区福利视频| 日本aⅴ亚洲精品中文乱码| 一区二区在线观看免费视频| 亚洲国产精品字幕| 精品国产黄a∨片高清在线| 日本大胆人体视频| 久久精品在这里| 99久久亚洲精品日本无码| 亚洲2020天天堂在线观看| 精品一区二区三区的国产在线观看| 欧美成人乱码一二三四区免费| 亚洲一二三四区| 国产黄在线观看| 国产伦精品一区二区三区| 蜜臀av一区二区| 国产无套在线观看| 中文字幕日韩欧美在线| 巨人精品**| 三区视频在线观看| 色综合久久久久综合体桃花网| 高清免费电影在线观看| 欧美精品v日韩精品v国产精品| 国产一区二区三区黄视频| 黄色在线视频网址| 欧美激情在线观看视频| 久久影院一区|