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

騰訊面試:什么是 Spark 寬依賴、窄依賴,如何進行性能調優?

大數據
本文將從RDD依賴關系的本質出發,深入剖析窄依賴與寬依賴的區別,詳解Spark如何基于依賴關系進行DAG劃分和Stage優化,并結合Spark 3.x的最新特性,提供一套完整的依賴關系調整與性能調優實踐方案。

Apache Spark作為分布式計算框架的標桿,其性能優勢很大程度上源于對計算流程的精細化控制。RDD(彈性分布式數據集) 作為Spark的核心抽象,不僅提供了分布式數據存儲能力,更通過依賴關系(Dependency) 描述了數據轉換的血緣關系(Lineage)。而DAG(有向無環圖) 作為任務執行的邏輯表示,其劃分與優化直接決定了Spark作業的并行效率。在實際生產中,開發者常面臨任務延遲、資源利用率低、Shuffle開銷過大等問題,其根源往往在于對依賴關系的理解不足或DAG優化策略的缺失。

本文將從RDD依賴關系的本質出發,深入剖析窄依賴與寬依賴的區別,詳解Spark如何基于依賴關系進行DAG劃分和Stage優化,并結合Spark 3.x的最新特性(如自適應查詢執行AQE、動態分區裁剪DPP),提供一套完整的依賴關系調整與性能調優實踐方案。

一、RDD依賴關系:從數據血緣到計算效率的關鍵

1. 依賴關系的本質與分類

RDD的依賴關系描述了子RDD如何從父RDD轉換而來,是Spark實現容錯和并行計算的基礎。根據父RDD分區被子RDD分區引用的方式,依賴關系分為窄依賴(Narrow Dependency) 和寬依賴(Wide Dependency),二者的核心區別在于是否觸發Shuffle操作。

(1) 窄依賴:無Shuffle的高效并行

窄依賴指父RDD的每個分區最多被子RDD的一個分區引用,數據無需跨節點傳輸,可在單個Executor內完成轉換。Spark將窄依賴操作合并為流水線(Pipeline) 執行,顯著提升效率。窄依賴主要包括以下三種形式:

  • 一對一依賴(OneToOneDependency):子RDD分區與父RDD分區一一對應,如map、filter算子。例如,對RDD執行map(x => x*2)時,子RDD的每個分區僅依賴父RDD相同索引的分區。
  • 范圍依賴(RangeDependency):父RDD的連續分區被子RDD的一個分區引用,典型場景為Union操作。例如,兩個RDD通過union合并時,子RDD的分區0依賴第一個父RDD的分區0,分區1依賴第一個父RDD的分區1,以此類推。
  • 協同分區Join(Co-partitioned Join):若兩個RDD具有相同的分區器(Partitioner)和分區數,其Join操作可通過窄依賴實現。例如,RDD A和RDD B均按user_id分區,且分區數均為100,則Join時子RDD的分區i僅需關聯A和B的分區i,無需Shuffle。

代碼示例:窄依賴轉換

// 一對一依賴:map操作
val rdd1 = sc.parallelize(Array(1,2,3,4),2)// 2個分區
val rdd2 = rdd1.map(_ *2)// rdd2的每個分區依賴rdd1的對應分區(窄依賴)

// 范圍依賴:union操作
val rdd3 = sc.parallelize(Array(5,6),1)
val rdd4 = rdd2.union(rdd3)// rdd4的前2個分區依賴rdd2,第3個分區依賴rdd3(窄依賴)

// 協同分區Join
val rddA = sc.parallelize(Seq(("a",1),("b",2))).partitionBy(new HashPartitioner(2))
val rddB = sc.parallelize(Seq(("a",3),("b",4))).partitionBy(new HashPartitioner(2))
val joinedRDD = rddA.join(rddB)// 分區器相同,為窄依賴Join

(2) 寬依賴:Shuffle的性能瓶頸

寬依賴指父RDD的一個分區被多個子RDD分區引用,此時需通過Shuffle將數據跨節點重新分區。Shuffle過程涉及磁盤I/O、網絡傳輸和序列化/反序列化,是Spark作業的主要性能瓶頸。常見觸發寬依賴的算子包括groupByKey、reduceByKey(需Shuffle)、join(非協同分區時)等。

寬依賴的底層機制:以groupByKey為例,父RDD的每個分區數據會按Key哈希分配到不同子分區,過程中需將中間結果寫入本地磁盤(Shuffle Write),再由子RDD的對應分區通過網絡拉取(Shuffle Read)。此過程中,數據傾斜(某Key對應數據量過大)會導致部分Task耗時激增,進一步加劇性能問題。

代碼示例:寬依賴轉換

// groupByKey觸發寬依賴
val rdd = sc.parallelize(Seq(("a",1),("a",2),("b",3)),2)
val groupedRDD = rdd.groupByKey()// 寬依賴:父RDD分區數據按Key重新分布

// 非協同分區Join觸發寬依賴
val rddA = sc.parallelize(Seq(("a",1))).partitionBy(new HashPartitioner(2))
val rddB = sc.parallelize(Seq(("a",2))).partitionBy(new HashPartitioner(3))// 分區數不同
val shuffledJoinRDD = rddA.join(rddB)// 寬依賴:需Shuffle對齊分區

2. 依賴關系對Spark執行的影響

依賴關系直接決定了Spark的容錯機制和任務并行度:

  • 容錯效率:窄依賴下,單個分區丟失僅需重算對應父分區;寬依賴則需重算所有父分區,恢復成本高。因此,Spark優先對寬依賴結果進行Checkpoint。
  • 并行度:窄依賴支持流水線執行(如map -> filter -> map可在單個Task內完成),而寬依賴會阻斷流水線,需等待所有父分區完成才能開始子分區計算。
  • 資源利用率:寬依賴的Shuffle過程會導致大量網絡傳輸和磁盤I/O,若配置不當(如分區數過少),易造成Executor資源空閑或過載。

二、DAG生成與Stage劃分:從邏輯計劃到物理執行

Spark將用戶代碼轉換為DAG后,需通過Stage劃分將邏輯計劃轉換為可執行的物理計劃。Stage是Task的集合,每個Stage包含一組可并行執行的Task,其劃分的核心依據是寬依賴。

1. DAG的構建過程

DAG的構建始于RDD轉換鏈,終于Action算子(如collect、count)。當觸發Action時,SparkContext會將RDD依賴鏈提交給DAGScheduler,由其構建DAG并劃分Stage。例如,以下代碼對應的DAG包含3個RDD轉換:

val result = sc.textFile("data.txt")// RDD1:HadoopRDD
.flatMap(_.split(" "))// RDD2:MapPartitionsRDD(窄依賴)
.map((_,1))// RDD3:MapPartitionsRDD(窄依賴)
.reduceByKey(_ + _)// RDD4:ShuffledRDD(寬依賴)
.collect()// Action算子,觸發DAG構建

2. Stage劃分的核心算法:回溯與寬依賴檢測

DAGScheduler采用從后往前回溯的算法劃分Stage:

  • 起點:以Action算子對應的ResultStage(最終輸出Stage)為起點。
  • 回溯依賴:遍歷當前RDD的依賴關系,若為窄依賴,則將其父RDD合并到當前Stage;若為寬依賴,則以寬依賴為邊界拆分Stage,父RDD作為新的ShuffleMapStage(需輸出Shuffle結果)。
  • 遞歸處理:對新拆分的ShuffleMapStage重復上述過程,直至所有RDD均被劃分到Stage中。

示例:上述WordCount代碼的Stage劃分如下:

  • Stage 1(ResultStage):包含reduceByKey操作,依賴寬依賴,需等待Shuffle完成。
  • Stage 0(ShuffleMapStage):包含textFile -> flatMap -> map操作,均為窄依賴,輸出結果用于Shuffle。

源碼邏輯簡化:

// DAGScheduler核心劃分邏輯(簡化版)
privatedef getParentStages(rdd: RDD[_]): List[Stage]={
val parents = mutable.HashSet[Stage]()
val visited = mutable.HashSet[RDD[_]]()
val stack = mutable.Stack[RDD[_]](rdd)

while(stack.nonEmpty){
val currentRDD = stack.pop()
if(!visited(currentRDD)){
      visited.add(currentRDD)
      currentRDD.dependencies.foreach {
case narrowDep: NarrowDependency[_]=>
          stack.push(narrowDep.rdd)// 窄依賴:合并到當前Stage
case shuffleDep: ShuffleDependency[_, _, _]=>
// 寬依賴:創建新的ShuffleMapStage
val stage = getOrCreateShuffleMapStage(shuffleDep)
          parents.add(stage)
}
}
}
  parents.toList
}

3. Stage的任務類型與執行順序

劃分后的Stage分為兩類:

  • ShuffleMapStage:輸出結果用于Shuffle,對應ShuffleMapTask,任務數等于RDD分區數。
  • ResultStage:生成最終結果,對應ResultTask,任務數由Action算子決定(如collect對應1個任務)。

Stage的執行順序遵循依賴關系:若Stage B依賴Stage A的Shuffle結果,則需等待Stage A完成后才能執行Stage B。Spark通過廣度優先調度提交Stage,以最大化并行度。

三、Spark Stage優化策略:從靜態配置到動態自適應

Stage優化是Spark性能調優的核心,涵蓋Shuffle優化、內存管理、數據本地化等多個維度。Spark 3.x引入的自適應查詢執行(AQE) 進一步實現了運行時動態優化,顯著降低了人工調參成本。

1. 基于依賴關系的靜態優化

(1) 減少寬依賴:算子選擇與邏輯調整

寬依賴是性能瓶頸的主要來源,優化的核心是避免不必要的Shuffle或減少Shuffle數據量:

  • 用reduceByKey替代groupByKey:reduceByKey支持Map端預聚合(Combiner),減少Shuffle數據量。例如,對(key, value)按Key求和時,reduceByKey(_ + _)會先在每個分區內局部聚合,再Shuffle全局聚合;而groupByKey().mapValues(_.sum)需將所有Value傳輸到目標節點后聚合,數據量更大。代碼對比:
// 低效:groupByKey無預聚合
val groupResult = rdd.groupByKey().mapValues(_.sum)

// 高效:reduceByKey預聚合
val reduceResult = rdd.reduceByKey(_ + _)// 減少Shuffle數據量約80%
  • 廣播小表優化Join:當Join的一個表較小時(如<100MB),使用broadcast將其廣播到所有Executor,轉為Map端Join,避免Shuffle。Spark 3.x可通過spark.sql.autoBroadcastJoinThreshold自動觸發,也可手動指定:代碼示例:
importorg.apache.spark.sql.functions.broadcast

val smallDF = spark.read.parquet("small_table")
val largeDF = spark.read.parquet("large_table")
val joinedDF = largeDF.join(broadcast(smallDF),"id")// 廣播小表,避免Shuffle

(2) 分區策略優化:并行度與數據均衡

合理的分區數是提升并行度的關鍵。Spark推薦每個Task處理128MB~256MB數據,分區數設置為Executor數量 × 核心數 × 2~3。例如,50個Executor、每個4核的集群,推薦分區數為50×4×2=400。

  • repartition與coalesce:repartition會觸發Shuffle,用于增加分區或徹底重分區;coalesce不觸發Shuffle,僅合并分區(適用于減少小文件)。代碼示例:
// 增加分區(觸發Shuffle)
val repartitionedRDD = rdd.repartition(400)

// 合并分區(不觸發Shuffle)
val coalescedRDD = rdd.coalesce(50)// 將100個小分區合并為50個
  • 動態分區裁剪(DPP):Spark 3.0引入的DPP可在Join時基于運行時條件過濾無關分區。例如,fact_table按date分區,與dim_table Join時,若dim_table過濾出date='2023-01-01',DPP會僅掃描fact_table的對應分區,減少I/O。

2. Spark 3.x自適應查詢執行(AQE):動態優化的革命

AQE(Adaptive Query Execution)是Spark 3.x的核心優化特性,通過運行時統計信息動態調整執行計劃,解決靜態優化的局限性。其三大核心功能如下:

(1) 動態合并Shuffle分區

傳統Shuffle分區數固定(默認200),易導致小分區過多(調度開銷大)或大分區(數據傾斜)。AQE在Shuffle后根據實際數據量合并小分區,目標分區大小由spark.sql.adaptive.advisoryPartitionSizeInBytes控制(默認64MB)。

案例:某電商日志分析任務初始設置spark.sql.shuffle.partitions=2000,AQE根據實際數據量合并為420個分區,Shuffle耗時從58分鐘降至12分鐘(提升79%)。

(2) 動態調整Join策略

AQE在運行時根據表大小動態選擇Join策略:

  • 若小表大小<廣播閾值(spark.sql.autoBroadcastJoinThreshold),自動轉為Broadcast Join。
  • 若表大小適中,轉為Shuffled Hash Join。
  • 若表極大,保持Sort Merge Join。

案例:某金融Join任務中,靜態優化誤判小表大小選擇Sort Merge Join(耗時2.1小時),AQE檢測到小表實際僅1GB,動態轉為Broadcast Join,耗時降至18分鐘(提升7倍)。

(3) 動態優化傾斜Join

AQE自動檢測傾斜Key(默認分區大小>中位數5倍且>256MB),將傾斜分區分拆為多個子分區,并行處理。例如,某支付數據中“熱門商品”Key占比80%,AQE將其拆分為20個子分區,總耗時從6小時降至1.5小時(提升75%)。

AQE啟用配置:

spark.conf.set("spark.sql.adaptive.enabled","true")
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled","true")// 合并小分區
spark.conf.set("spark.sql.adaptive.skewJoin.enabled","true")// 傾斜Join優化

3. Tungsten引擎:內存與CPU的極致優化

Tungsten是Spark的底層優化引擎,通過內存管理和代碼生成提升性能,尤其對寬依賴Shuffle場景效果顯著:

  • 堆外內存(Off-Heap):通過sun.misc.Unsafe API直接操作內存,避免JVM對象開銷和GC。例如,Java字符串“abcd”在JVM中占48字節(含對象頭),Tungsten二進制存儲僅需4字節。
  • 向量化執行:以Batch為單位處理數據(而非單行),利用CPU SIMD指令提升計算效率,TPC-DS基準測試性能提升40%。
  • 代碼生成(Whole-Stage CodeGen):將多個算子邏輯合并為單一Java方法,消除虛函數調用和中間對象,Shuffle聚合吞吐量提升10倍以上。

Tungsten啟用配置:

spark.conf.set("spark.memory.offHeap.enabled","true")
spark.conf.set("spark.memory.offHeap.size","4g")// 堆外內存大小
spark.conf.set("spark.sql.codegen.wholeStage","true")// 啟用全階段代碼生成

四、實際應用中的依賴關系調整與性能調優案例

1. 案例一:電商用戶畫像計算優化(寬依賴→窄依賴)

背景:某電商平臺用戶畫像任務需關聯用戶行為表(100億行)與用戶標簽表(1億行),原始代碼使用join算子(寬依賴),Shuffle耗時4.2小時。

問題分析:用戶標簽表雖大但可全量加載到內存,且用戶行為表按user_id分區,可通過廣播+協同分區轉為窄依賴。

優化步驟:

  • 廣播標簽表:broadcast(userTagsDF)避免Shuffle。
  • 預分區行為表:按user_id重分區,確保與標簽表協同。

優化后代碼:

val userTagsDF = spark.read.parquet("user_tags").repartition("user_id")// 預分區
val userBehaviorDF = spark.read.parquet("user_behavior").repartition("user_id")// 協同分區
val profileDF = userBehaviorDF.join(broadcast(userTagsDF),"user_id")// 窄依賴Join

效果:任務耗時從4.2小時降至23分鐘(提升11倍),Shuffle數據量減少98%。

2. 案例二:金融支付數據傾斜處理(寬依賴傾斜→拆分優化)

背景:某銀行支付數據聚合任務中,5%的商戶占85%交易數據,groupByKey(merchant_id)導致單個Task處理20GB數據,耗時6小時。

問題分析:數據傾斜導致寬依賴Shuffle中個別Task過載。

優化步驟:

  • 檢測傾斜Key:通過df.groupBy("merchant_id").count().orderBy(desc("count"))定位傾斜Key。
  • 拆分傾斜數據:將傾斜Key單獨處理,添加隨機前綴打散分區。
  • 二次聚合:先按“Key+隨機前綴”聚合,再去掉前綴全局聚合。

優化后代碼:

val skewedKeys = List("merchant_001","merchant_002")// 傾斜Key列表
val saltedDF = df.withColumn("salt", when(col("merchant_id").isin(skewedKeys: _*),
  concat(col("merchant_id"), lit("_"),(rand *10).cast("int"))// 加鹽打散
).otherwise(col("merchant_id")))

// 二次聚合
val resultDF = saltedDF.groupBy("salt").agg(sum("amount").alias("sum_amount"))
.withColumn("merchant_id", split(col("salt"),"_").getItem(0))
.groupBy("merchant_id").agg(sum("sum_amount").alias("total_amount"))

效果:單個Task數據量從20GB降至2GB,總耗時從6小時降至1.5小時(提升75%)。

3. 案例三:機器學習特征工程優化(窄依賴流水線)

背景:某推薦系統特征工程需對1億用戶樣本執行“清洗→特征提取→歸一化”三步轉換,原始代碼分三次觸發Action,導致重復計算。

問題分析:未充分利用窄依賴的流水線特性,多次Action觸發多次DAG執行。

優化步驟:

  • 合并轉換算子:將窄依賴操作串聯,形成流水線。
  • 持久化中間結果:對復用的RDD使用persist緩存至內存。

優化后代碼:

val featureRDD = rawDataRDD
.filter(_.isValid)// 清洗(窄依賴)
.map(extractFeatures)// 特征提取(窄依賴)
.map(normalize)// 歸一化(窄依賴)
.persist(StorageLevel.MEMORY_AND_DISK)// 緩存中間結果

// 單次Action觸發所有轉換
val trainData = featureRDD.filter(_.label.isDefined)
val testData = featureRDD.filter(_.label.isEmpty)

效果:計算次數從3次降至1次,總耗時從90分鐘降至25分鐘(提升72%)。

RDD依賴關系與DAG優化是Spark性能調優的核心,其本質是通過減少數據移動和提升并行效率實現計算加速。窄依賴的流水線執行和寬依賴的Shuffle優化構成了Spark任務調度的基礎,而Spark 3.x的AQE和Tungsten引擎進一步降低了調優門檻,實現了“靜態配置+動態自適應”的雙重優化。

附錄:關鍵配置參數參考

配置項

作用

推薦值

spark.default.parallelism

RDD默認并行度

Executor數 × 核心數 × 2

spark.sql.shuffle.partitions

SQL Shuffle分區數

400~1000(根據數據量調整)

spark.sql.adaptive.enabled

啟用AQE

true

spark.sql.autoBroadcastJoinThreshold

廣播Join閾值

100MB(大內存集群可設200MB)

spark.memory.offHeap.enabled

啟用堆外內存

true

spark.shuffle.file.buffer

Shuffle寫緩沖區

64KB→256KB(減少磁盤I/O)

spark.reducer.maxSizeInFlight

Shuffle讀緩沖區

48MB→96MB(減少網絡請求)

通過合理配置這些參數,并結合依賴關系調整策略,可顯著提升Spark作業性能,充分發揮分布式計算的威力。

責任編輯:趙寧寧 來源: 大數據技能圈
相關推薦

2024-05-21 09:08:57

JVM調優面試

2020-08-06 00:14:16

Spring IoC依賴注入開發

2012-03-26 10:55:03

JavaJava EE

2021-03-04 08:39:21

SparkRDD調優

2018-07-18 12:12:20

Spark大數據代碼

2023-04-24 14:54:09

JVM性能調優

2017-10-20 13:41:11

Spark集群代碼

2017-07-07 11:01:04

Spark性能調優

2019-07-29 17:15:35

MySQL操作系統數據庫

2021-12-06 11:03:57

JVM性能調優

2021-12-26 00:03:25

Spark性能調優

2017-07-21 08:55:13

TomcatJVM容器

2020-07-14 14:59:00

控制反轉依賴注入容器

2012-06-20 11:05:47

性能調優攻略

2010-04-20 15:41:38

Oracle sql

2025-06-23 10:25:00

Trino開源大數據

2023-10-04 18:29:24

NFS小文件業務

2024-04-22 00:00:00

幽靈依賴前端

2013-09-24 13:06:56

AngularJS性能優化

2011-03-10 14:40:54

LAMPMysql
點贊
收藏

51CTO技術棧公眾號

法国伦理少妇愉情| 真人抽搐一进一出视频| 亚洲最大成人在线视频| 综合激情网站| 亚洲精品国产免费| 99视频在线免费| 麻豆视频网站在线观看| 国产精品一区二区在线播放| 51久久精品夜色国产麻豆| 一区二区三区伦理片| 亚洲精品伊人| 午夜影院在线观看欧美| 日韩久久不卡| 亚洲av无码国产精品永久一区| 国产日韩1区| 精品久久国产精品| 成人免费av片| 无人区乱码一区二区三区| 黑人巨大精品欧美一区二区| 亚欧洲精品在线视频免费观看| 中文字幕在线播放日韩| 亚洲高清电影| 久久久av亚洲男天堂| 黄色正能量网站| 免费观看亚洲视频大全| 在线这里只有精品| 黄色一级片在线看| 成人video亚洲精品| 久久综合九色综合久久久精品综合| 国产日韩精品视频| 国产一区二区视频免费| 亚洲国产电影| 欧美成人精品xxx| 高清国产在线观看| 欧美激情极品| 精品日本一线二线三线不卡| 深夜黄色小视频| 在线天堂新版最新版在线8| 一区二区三区在线免费播放 | 桥本有菜av在线| 日本一级在线观看| www.欧美色图| 91视频最新| 国产精品久久久国产盗摄| 日韩综合一区二区| 91精品国产91久久久久久| 九九视频免费在线观看| 你懂的国产精品永久在线| 社区色欧美激情 | 国产视频不卡在线| 欧美日一区二区| 亚洲日韩中文字幕| 无码h肉动漫在线观看| 奇米影视777在线欧美电影观看 | 日本亚洲欧洲色| 日本网站在线播放| 亚洲国产精品一区| 韩国v欧美v日本v亚洲| 国产一级久久久| 国产精品啊啊啊| 欧美大片在线看免费观看| 日韩成人毛片视频| 午夜精品剧场| 久久久久久成人精品| 欧美丰满艳妇bbwbbw| 亚洲欧美文学| 国模吧一区二区三区| 日本三级片在线观看| 亚洲二区精品| 欧美在线观看网址综合| 美女又爽又黄免费视频| 蜜桃av综合| 国产精品久久婷婷六月丁香| 久久人人爽人人爽人人片av免费| 葵司免费一区二区三区四区五区| 国产精品91一区| 一本到在线视频| 国产毛片精品国产一区二区三区| 国产精品初高中精品久久| 色噜噜一区二区三区| 久久久久九九视频| 亚洲一卡二卡区| av在线播放国产| 亚洲va国产天堂va久久en| 日批视频在线免费看| 成人国产激情| 日韩欧美国产小视频| 美女又爽又黄免费| av一区二区高清| 欧美巨猛xxxx猛交黑人97人| 国产一级视频在线| 日韩电影免费在线看| 亚洲精品欧美一区二区三区| 日本加勒比一区| 国产欧美一区二区精品性色超碰 | 日韩av手机在线播放| 精品国产1区| 国产无套精品一区二区三区| 女厕盗摄一区二区三区| 色噜噜狠狠成人网p站| 中文字幕22页| 风间由美中文字幕在线看视频国产欧美| 亚洲精品按摩视频| www.xx日本| 日韩午夜激情| 成人欧美一区二区三区在线 | 日韩精品专区在线影院观看| 99久久国产精| 日韩欧美视频在线播放| 欧美精品www| 一二三区中文字幕| bt7086福利一区国产| 一区二区三区久久网| 国产高潮在线| 欧美一级视频精品观看| 欧美黄色一级生活片| 亚洲视频日本| 国产主播欧美精品| 九九热视频在线观看| 一区二区三区蜜桃| 人人干人人干人人| 亚洲婷婷丁香| 国内精品久久久久久久久| 一区二区精品视频在线观看| 久久一夜天堂av一区二区三区| 欧美美女黄色网| 麻豆久久久久| 亚洲网站在线观看| 亚洲精品1区2区3区| 人人爽香蕉精品| 久久精品国产精品青草色艺| 羞羞的网站在线观看| 欧美色图免费看| 永久免费成人代码| 亚洲一区中文| 国产在线欧美日韩| 国模雨婷捆绑高清在线| 3d动漫精品啪啪1区2区免费| eeuss中文字幕| 日韩制服丝袜先锋影音| 麻豆久久久av免费| 亚洲日本天堂| 精品亚洲永久免费精品 | 色综合色综合色综合色综合色综合| 黄色a级三级三级三级| 97精品国产福利一区二区三区| 日本视频久久久| 日韩av成人| 天天操天天干天天综合网| 人妻av一区二区三区| 欧美在线免费| 999精品视频一区二区三区| 日本免费中文字幕在线| 欧美久久久久久蜜桃| 亚洲精品自拍视频在线观看| 久久er99精品| 日本xxx免费| 久久亚洲精精品中文字幕| 久久网福利资源网站| 国产精品一区二区黑人巨大 | 色一情一乱一伦一区二区三区 | 91精品视频在线免费观看| 日韩在线资源| 日韩一区二区三区在线| 免费中文字幕视频| 成人自拍视频在线| 人妻无码久久一区二区三区免费| 久久视频在线观看| 日本国产一区二区三区| 精品久久av| 欧美日韩久久久一区| 小泽玛利亚一区| 国产精品一二一区| 国产毛片视频网站| 免费av一区二区三区四区| 国产成人久久久精品一区| 高h视频在线| 欧美情侣在线播放| 久久久无码一区二区三区| 不卡一区二区在线| 国产精品69页| 香港欧美日韩三级黄色一级电影网站| 亚洲伊人久久综合| 松下纱荣子在线观看| 国产午夜精品一区理论片飘花| 中文字幕丰满人伦在线| 亚洲日本欧美天堂| 在线观看国产免费视频| 日韩精品久久理论片| 蜜臀在线免费观看| 日韩美女毛片| 国产在线不卡精品| 19禁羞羞电影院在线观看| 亚洲色图第三页| 国产精品视频在线观看免费| 午夜激情一区二区三区| 国产精品久久久久久成人| 岛国精品在线播放| 亚洲国产精品毛片av不卡在线| 仙踪林久久久久久久999| 国产亚洲一区在线播放| 成人1区2区| 91国在线精品国内播放 | 久久久视频在线| 高清av在线| 日韩福利视频在线观看| 涩涩视频在线观看| 五月综合激情婷婷六月色窝| 一级片黄色录像| 99综合电影在线视频| 911福利视频| 视频在线在亚洲| 成年人看的毛片| 欧美残忍xxxx极端| 欧美日韩在线不卡一区| 伊人精品综合| 成人黄色免费网站在线观看| 三级在线看中文字幕完整版| 超碰91人人草人人干| 国产黄色在线| 日韩精品免费在线| 亚洲国产精品18久久久久久| 欧美性大战久久久| 狠狠人妻久久久久久综合| 一区二区三区四区中文字幕| 午夜黄色福利视频| 久久久777精品电影网影网| 国产艳妇疯狂做爰视频| 国产一区二区女| www.精品在线| 日韩精品一二三区| 啊啊啊一区二区| 最新亚洲激情| 国产精品自拍合集| 欧美在线三区| 一道本在线观看视频| 日本一区二区在线看| 日本在线免费观看一区| 欧美人妖在线观看| 国产一区二区三区四区五区在线 | 久久国产欧美精品| 凹凸av导航大全精品| 91在线免费看片| 国产999精品在线观看| 国产欧美一区二区三区在线| 日韩制服诱惑| 国产精品wwwwww| 欧美性xxx| 国产成人一区二区三区小说| 亚洲性色av| 日本三级韩国三级久久| 欧美性suv| 国产精品爽爽爽| 视频欧美精品| 91在线视频成人| 午夜视频在线观看精品中文| 91在线无精精品一区二区| 成人在线视频区| 99re资源| 欧亚精品一区| 日本成人三级| 久久中文字幕av| 一级全黄肉体裸体全过程| 亚洲精品成人影院| 996这里只有精品| 最新成人av网站| 不卡影院一区二区| 免费成人在线观看视频| 天堂av2020| 国产成人免费网站| 最近中文字幕无免费| 91网上在线视频| 一级黄色片网址| 亚洲欧洲一区二区三区| 唐朝av高清盛宴| 性感美女极品91精品| 日韩精品成人免费观看视频| 欧美在线一区二区| 国产精品一区二区人人爽| 精品欧美乱码久久久久久1区2区| 图片区 小说区 区 亚洲五月| 亚洲欧美日韩国产成人| 欧美被日视频| 韩剧1988在线观看免费完整版| 精品国产第一福利网站| 国产欧美一区二区三区久久人妖 | 久久伊人一区| 欧美gayvideo| 免费看毛片的网址| 日本最新不卡在线| 日本成人在线免费| 久久久久久久久蜜桃| 黄色一级片中国| 一本色道久久综合精品竹菊| 一级黄色大片网站| 久久99精品国产麻豆不卡| 天堂av.com| av在线不卡观看免费观看| 91资源在线播放| 亚洲精品国产精华液| 五月天婷婷久久| 欧美久久久久免费| 日韩av视屏| 欧美日韩国产va另类| 欧美电影免费观看高清完整| 亚洲a一级视频| 久久最新网址| 老子影院午夜伦不卡大全| 三级在线观看一区二区| wwwww在线观看| 亚洲国产精华液网站w| 欧美日韩中文视频| 欧美精品久久久久久久多人混战| 亚州精品国产精品乱码不99按摩| 久久久999国产精品| 最新日韩三级| 国产精品视频免费一区| 97精品在线| 玩弄japan白嫩少妇hd| 国产a区久久久| 在线观看黄网址| 韩国亚洲精品| 国产69精品久久久久9| 草民电影神马电影一区二区| 久久久久久九九九九| 最新欧美人z0oozo0| 天天综合网日韩| 久久综合狠狠综合久久激情 | 韩国v欧美v日本v亚洲| 国产成人免费视频网站视频社区 | 天堂va欧美va亚洲va老司机| 中文在线一区二区| 日本精品入口免费视频| 日韩精品福利网站| www视频在线观看| 国产精品一区视频网站| 亚洲欧美文学| 肉丝美足丝袜一区二区三区四| 亚洲天堂精品在线观看| 中文 欧美 日韩| 在线观看国产精品91| 国产精品专区免费| 久久精品日产第一区二区三区乱码 | 奇米亚洲午夜久久精品| 中文字幕一区二区人妻在线不卡| 亚洲大片在线观看| 欧美熟妇另类久久久久久不卡 | 日韩欧美精品久久| 久久在线精品| 精品国产成人亚洲午夜福利| 色综合网站在线| 精品视频一二三| 国产精品成人观看视频国产奇米| 国产在线观看91一区二区三区 | 青青草原免费观看| 日韩女优视频免费观看| 青青在线视频| 好吊色欧美一区二区三区 | 日本久久精品一区二区| 国产视频在线观看一区二区三区| 人人妻人人爽人人澡人人精品| 亚洲图片在线综合| 日韩成人一区| 三级在线免费观看| 成人三级伦理片| 九九热精品视频在线| 一区二区三区亚洲| 亚洲在线资源| youjizz.com在线观看| 成人动漫中文字幕| 国产精品久久久久久久久夜色| 一区二区欧美日韩视频| 亚州精品国产| 国产 欧美 日韩 一区| xf在线a精品一区二区视频网站| 无码人妻黑人中文字幕| 一色桃子一区二区| 玖玖精品一区| 欧美国产亚洲一区| 国产精品乱码久久久久久| 国产999久久久| 97热在线精品视频在线观看| 视频精品在线观看| 国产欧美精品一二三| 精品magnet| 欧美18hd| 久精品国产欧美| 久久精品国产在热久久| 久久久久久久久99| 亚洲午夜女主播在线直播| 粉嫩一区二区三区在线观看| 久久国产精品网| 中文av一区特黄| 乱色精品无码一区二区国产盗| 日本精品性网站在线观看| 91精品国产91久久久久久密臀| 老熟妇精品一区二区三区| 欧美丝袜自拍制服另类| 国内在线免费视频| 中文精品一区二区三区|