日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析

發布時間:2024/1/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們曾經在《深入理解Spark 2.1 Core (一):RDD的原理與源碼分析 》講解過:

為了有效地實現容錯,RDD提供了一種高度受限的共享內存,即RDD是只讀的,并且只能通過其他RDD上的批量操作來創建(注:還可以由外部存儲系數據集創建,如HDFS)

可知,我們在第九,第十篇博文所講的是傳統hadoop MapReduce類似的,在最初從HDFS中讀取數據生成HadoopRDD的過程。而RDD可以通過其他RDD上的批量操作來創建,所以這里的HadoopRDD對于下一個生成的ShuffledRDD可以視為Map端,當然下一個生成的ShuffledRDD可以被下下個ShuffledRDD視為Map端。反過來說,下一個ShuffledRDD可以被`HadoopRDD視作Reduce端。

這篇博文,我們就來講下Shuffle的Reduce端。其實在RDD迭代部分和第九篇博文類似,不同的是,這里調用的是rdd.ShuffledRDD.compute:

override def compute(split: Partition, context: TaskContext): Iterator[(K, C)] = {// 得到依賴val dep = dependencies.head.asInstanceOf[ShuffleDependency[K, V, C]]// 調用getReader,傳入dep.shuffleHandle 分區 上下文 // 得到Reader,調用read()// 得到迭代器SparkEnv.get.shuffleManager.getReader(dep.shuffleHandle, split.index, split.index + 1, context).read().asInstanceOf[Iterator[(K, C)]]}
  • 1
  • 3

這里調用的是shuffle.sort.SortShuffleManager的getReader:

override def getReader[K, C](handle: ShuffleHandle,startPartition: Int,endPartition: Int,context: TaskContext): ShuffleReader[K, C] = {// 生成返回 BlockStoreShuffleReadernew BlockStoreShuffleReader(handle.asInstanceOf[BaseShuffleHandle[K, _, C]], startPartition, endPartition, context)}
  • 1

shuffle.BlockStoreShuffleReader.read:

override def read(): Iterator[Product2[K, C]] = {// 實例化ShuffleBlockFetcherIteratorval blockFetcherItr = new ShuffleBlockFetcherIterator(context,blockManager.shuffleClient,blockManager,// 通過消息發送獲取 ShuffleMapTask 存儲數據位置的元數據mapOutputTracker.getMapSizesByExecutorId(handle.shuffleId, startPartition, endPartition),// 設置每次傳輸的大小SparkEnv.get.conf.getSizeAsMb("spark.reducer.maxSizeInFlight", "48m") * 1024 * 1024,// // 設置Int的大小SparkEnv.get.conf.getInt("spark.reducer.maxReqsInFlight", Int.MaxValue))// 基于配置的壓縮和加密來包裝流val wrappedStreams = blockFetcherItr.map { case (blockId, inputStream) =>serializerManager.wrapStream(blockId, inputStream)}val serializerInstance = dep.serializer.newInstance()// 對每個流生成 k/v 迭代器val recordIter = wrappedStreams.flatMap { wrappedStream =>serializerInstance.deserializeStream(wrappedStream).asKeyValueIterator}// 每條記錄讀取后更新任務度量val readMetrics = context.taskMetrics.createTempShuffleReadMetrics()// 生成完整的迭代器val metricIter = CompletionIterator[(Any, Any), Iterator[(Any, Any)]](recordIter.map { record =>readMetrics.incRecordsRead(1)record},context.taskMetrics().mergeShuffleReadMetrics())// 傳入metricIter到可中斷的迭代器// 為了能取消迭代val interruptibleIter = new InterruptibleIterator[(Any, Any)](context, metricIter)val aggregatedIter: Iterator[Product2[K, C]] = if (dep.aggregator.isDefined) {// 若需要對數據進行聚合if (dep.mapSideCombine) {// 若需要進行Map端(對于下一個Shuffle來說)的合并val combinedKeyValuesIterator = interruptibleIter.asInstanceOf[Iterator[(K, C)]]dep.aggregator.get.combineCombinersByKey(combinedKeyValuesIterator, context)// 若只需要進行Reduce端(對于下一個Shuffle來說)的合并} else {val keyValuesIterator = interruptibleIter.asInstanceOf[Iterator[(K, Nothing)]]dep.aggregator.get.combineValuesByKey(keyValuesIterator, context)}} else {require(!dep.mapSideCombine, "Map-side combine without Aggregator specified!")interruptibleIter.asInstanceOf[Iterator[Product2[K, C]]]}dep.keyOrdering match {case Some(keyOrd: Ordering[K]) =>// 若需要排序// 若spark.shuffle.spill設置為否的話// 將不會spill到磁盤val sorter =new ExternalSorter[K, C, C](context, ordering = Some(keyOrd), serializer = dep.serializer)sorter.insertAll(aggregatedIter)context.taskMetrics().incMemoryBytesSpilled(sorter.memoryBytesSpilled)context.taskMetrics().incDiskBytesSpilled(sorter.diskBytesSpilled)context.taskMetrics().incPeakExecutionMemory(sorter.peakMemoryUsedBytes)CompletionIterator[Product2[K, C], Iterator[Product2[K, C]]](sorter.iterator, sorter.stop())case None =>aggregatedIter}}

類調用關系圖:

下面我們來深入講解下實例化ShuffleBlockFetcherIterator的過程:

// 實例化ShuffleBlockFetcherIteratorval blockFetcherItr = new ShuffleBlockFetcherIterator(context,blockManager.shuffleClient,blockManager,// 通過消息發送獲取 ShuffleMapTask 存儲數據位置的元數據mapOutputTracker.getMapSizesByExecutorId(handle.shuffleId, startPartition, endPartition),// 設置每次傳輸的大小SparkEnv.get.conf.getSizeAsMb("spark.reducer.maxSizeInFlight", "48m") * 1024 * 1024,// // 設置Int的大小SparkEnv.get.conf.getInt("spark.reducer.maxReqsInFlight", Int.MaxValue))
  • 1

獲取元數據

mapOutputTracker.getMapSizesByExecutorId

首先我們會調用mapOutputTracker.getMapSizesByExecutorId:

def getMapSizesByExecutorId(shuffleId: Int, startPartition: Int, endPartition: Int): Seq[(BlockManagerId, Seq[(BlockId, Long)])] = {logDebug(s"Fetching outputs for shuffle $shuffleId, partitions $startPartition-$endPartition")// 得到元數據val statuses = getStatuses(shuffleId)// 返回格式為:// Seq[BlockManagerId,Seq[(shuffle block id, shuffle block size)]]statuses.synchronized {return MapOutputTracker.convertMapStatuses(shuffleId, startPartition, endPartition, statuses)}}
  • 1

mapOutputTracker.getStatuses

private def getStatuses(shuffleId: Int): Array[MapStatus] = {// 嘗試從本地獲取數據val statuses = mapStatuses.get(shuffleId).orNullif (statuses == null) {// 若本地無數據logInfo("Don't have map outputs for shuffle " + shuffleId + ", fetching them")val startTime = System.currentTimeMillisvar fetchedStatuses: Array[MapStatus] = nullfetching.synchronized {// 若以及有其他人也準備遠程獲取這數據的話// 則等待while (fetching.contains(shuffleId)) {try {fetching.wait()} catch {case e: InterruptedException =>}}// 嘗試直接獲取數據fetchedStatuses = mapStatuses.get(shuffleId).orNullif (fetchedStatuses == null) {// 若還是不得不遠程獲取,// 則將shuffleId加入fetchingfetching += shuffleId}}if (fetchedStatuses == null) {logInfo("Doing the fetch; tracker endpoint = " + trackerEndpoint)try {// 遠程獲取val fetchedBytes = askTracker[Array[Byte]](GetMapOutputStatuses(shuffleId))// 反序列化fetchedStatuses = MapOutputTracker.deserializeMapStatuses(fetchedBytes)logInfo("Got the output locations")// 將數據加入mapStatusesmapStatuses.put(shuffleId, fetchedStatuses)} finally {fetching.synchronized {fetching -= shuffleIdfetching.notifyAll()}}}logDebug(s"Fetching map output statuses for shuffle $shuffleId took " +s"${System.currentTimeMillis - startTime} ms")if (fetchedStatuses != null) {// 若直接獲取,則直接返回return fetchedStatuses} else {logError("Missing all output locations for shuffle " + shuffleId)throw new MetadataFetchFailedException(shuffleId, -1, "Missing all output locations for shuffle " + shuffleId)}} else {// 若直接獲取,則直接返回return statuses}}
  • 1
  • 2

mapOutputTracker.askTracker

向trackerEndpoint發送消息GetMapOutputStatuses(shuffleId)

protected def askTracker[T: ClassTag](message: Any): T = {try {trackerEndpoint.askWithRetry[T](message)} catch {case e: Exception =>logError("Error communicating with MapOutputTracker", e)throw new SparkException("Error communicating with MapOutputTracker", e)}}
  • 1

MapOutputTrackerMasterEndpoint.receiveAndReply

case GetMapOutputStatuses(shuffleId: Int) =>val hostPort = context.senderAddress.hostPortlogInfo("Asked to send map output locations for shuffle " + shuffleId + " to " + hostPort)val mapOutputStatuses = tracker.post(new GetMapOutputMessage(shuffleId, context))

可以看到,這里并不是直接返回消息,而是調用tracker.post:

def post(message: GetMapOutputMessage): Unit = {mapOutputRequests.offer(message)}
  • 1
  • 2

向mapOutputRequests加入GetMapOutputMessage(shuffleId, context)消息。這里的mapOutputRequests是鏈式阻塞隊列。

private val mapOutputRequests = new LinkedBlockingQueue[GetMapOutputMessage]
  • 1

MapOutputTrackerMaster.MessageLoop.run

MessageLoop啟一個線程不斷的參數從mapOutputRequests讀取數據:

private class MessageLoop extends Runnable {override def run(): Unit = {try {while (true) {try {val data = mapOutputRequests.take()if (data == PoisonPill) {mapOutputRequests.offer(PoisonPill)return}val context = data.contextval shuffleId = data.shuffleIdval hostPort = context.senderAddress.hostPortlogDebug("Handling request to send map output locations for shuffle " + shuffleId +" to " + hostPort)// 若讀到數據// 則序列化val mapOutputStatuses = getSerializedMapOutputStatuses(shuffleId)// 返回數據context.reply(mapOutputStatuses)} catch {case NonFatal(e) => logError(e.getMessage, e)}}} catch {case ie: InterruptedException => // exit}}}
  • 1
  • 2

MapOutputTracker.convertMapStatuses

我們回到mapOutputTracker.getMapSizesByExecutorId中返回的MapOutputTracker.convertMapStatuses:

private def convertMapStatuses(shuffleId: Int,startPartition: Int,endPartition: Int,statuses: Array[MapStatus]): Seq[(BlockManagerId, Seq[(BlockId, Long)])] = {assert (statuses != null)val splitsByAddress = new HashMap[BlockManagerId, ArrayBuffer[(BlockId, Long)]]for ((status, mapId) <- statuses.zipWithIndex) {if (status == null) {val errorMessage = s"Missing an output location for shuffle $shuffleId"logError(errorMessage)throw new MetadataFetchFailedException(shuffleId, startPartition, errorMessage)} else {for (part <- startPartition until endPartition) {// 返回的Seq中的結構是status.location,Seq[ShuffleBlockId,SizeForBlock]splitsByAddress.getOrElseUpdate(status.location, ArrayBuffer()) +=((ShuffleBlockId(shuffleId, mapId, part), status.getSizeForBlock(part)))}}}// 對Seq根據status.location進行排序splitsByAddress.toSeq}
  • 1

劃分本地和遠程Block

讓我回到new ShuffleBlockFetcherIterator

storage.ShuffleBlockFetcherIterator.initialize

當我們實例化ShuffleBlockFetcherIterator時,會調用initialize:

private[this] def initialize(): Unit = {context.addTaskCompletionListener(_ => cleanup())// 劃分本地和遠程的blocksval remoteRequests = splitLocalRemoteBlocks()// 把遠程請求隨機的添加到隊列中fetchRequests ++= Utils.randomize(remoteRequests)assert ((0 == reqsInFlight) == (0 == bytesInFlight),"expected reqsInFlight = 0 but found reqsInFlight = " + reqsInFlight +", expected bytesInFlight = 0 but found bytesInFlight = " + bytesInFlight)// 發送遠程請求獲取blocksfetchUpToMaxBytes()val numFetches = remoteRequests.size - fetchRequests.sizelogInfo("Started " + numFetches + " remote fetches in" + Utils.getUsedTimeMs(startTime))// 獲取本地的BlocksfetchLocalBlocks()logDebug("Got local blocks in " + Utils.getUsedTimeMs(startTime))}
  • 1

storage.ShuffleBlockFetcherIterator.splitLocalRemoteBlocks

private[this] def splitLocalRemoteBlocks(): ArrayBuffer[FetchRequest] = {// 是的遠程請求最大長度為 maxBytesInFlight / 5// maxBytesInFlight: 為單次航班請求的最大字節數// 航班: 一批請求// 1/5 : 是為了提高請求批發度,允許5個請求分別從5個節點獲取數據val targetRequestSize = math.max(maxBytesInFlight / 5, 1L)logDebug("maxBytesInFlight: " + maxBytesInFlight + ", targetRequestSize: " + targetRequestSize)// 緩存需要遠程請求的FetchRequest對象val remoteRequests = new ArrayBuffer[FetchRequest]// 總共 blocks 的數量var totalBlocks = 0// 我們從上文可知blocksByAddress是根據status.location進行排序的for ((address, blockInfos) <- blocksByAddress) {totalBlocks += blockInfos.sizeif (address.executorId == blockManager.blockManagerId.executorId) {// 若 executorId 相同 與本 blockManagerId.executorId,// 則從本地獲取localBlocks ++= blockInfos.filter(_._2 != 0).map(_._1)numBlocksToFetch += localBlocks.size} else {// 否則 遠程請求// 得到迭代器val iterator = blockInfos.iterator// 當前累計塊的大小var curRequestSize = 0L// 當前累加塊// 累加: 若向一個節點頻繁的請求字節很少的Block,// 那么會造成網絡阻塞var curBlocks = new ArrayBuffer[(BlockId, Long)]// iterator 中的block 都是同一節點的while (iterator.hasNext) {val (blockId, size) = iterator.next()if (size > 0) {curBlocks += ((blockId, size))remoteBlocks += blockIdnumBlocksToFetch += 1curRequestSize += size} else if (size < 0) {throw new BlockException(blockId, "Negative block size " + size)}if (curRequestSize >= targetRequestSize) {// 若累加到大于遠程請求的尺寸// 往remoteRequests加入FetchRequestremoteRequests += new FetchRequest(address, curBlocks)curBlocks = new ArrayBuffer[(BlockId, Long)]logDebug(s"Creating fetch request of $curRequestSize at $address")curRequestSize = 0}}// 增加最后的請求if (curBlocks.nonEmpty) {remoteRequests += new FetchRequest(address, curBlocks)}}}logInfo(s"Getting $numBlocksToFetch non-empty blocks out of $totalBlocks blocks")remoteRequests}
  • 1
  • 8

獲取Block

storage.ShuffleBlockFetcherIterator.fetchUpToMaxBytes

我們回到storage.ShuffleBlockFetcherIterator.initialize的fetchUpToMaxBytes()來深入講解下如何獲取遠程的Block:

private def fetchUpToMaxBytes(): Unit = {// Send fetch requests up to maxBytesInFlight// 單次航班請求數要小于最大航班請求數// 單次航班字節數數要小于最大航班字節數while (fetchRequests.nonEmpty &&(bytesInFlight == 0 ||(reqsInFlight + 1 <= maxReqsInFlight &&bytesInFlight + fetchRequests.front.size <= maxBytesInFlight))) {sendRequest(fetchRequests.dequeue())}}
  • 1

storage.ShuffleBlockFetcherIterator.sendRequest

private[this] def sendRequest(req: FetchRequest) {logDebug("Sending request for %d blocks (%s) from %s".format(req.blocks.size, Utils.bytesToString(req.size), req.address.hostPort))bytesInFlight += req.sizereqsInFlight += 1// 可根據blockID查詢block大小val sizeMap = req.blocks.map { case (blockId, size) => (blockId.toString, size) }.toMapval remainingBlocks = new HashSet[String]() ++= sizeMap.keysval blockIds = req.blocks.map(_._1.toString)val address = req.address// 關于shuffleClient.fetchBlocks我們會在之后的博文講解shuffleClient.fetchBlocks(address.host, address.port, address.executorId, blockIds.toArray,new BlockFetchingListener {// 請求成功override def onBlockFetchSuccess(blockId: String, buf: ManagedBuffer): Unit = {ShuffleBlockFetcherIterator.this.synchronized {if (!isZombie) {buf.retain()remainingBlocks -= blockIdresults.put(new SuccessFetchResult(BlockId(blockId), address, sizeMap(blockId), buf,remainingBlocks.isEmpty))logDebug("remainingBlocks: " + remainingBlocks)}}logTrace("Got remote block " + blockId + " after " + Utils.getUsedTimeMs(startTime))}// 請求失敗override def onBlockFetchFailure(blockId: String, e: Throwable): Unit = {logError(s"Failed to get block(s) from ${req.address.host}:${req.address.port}", e)results.put(new FailureFetchResult(BlockId(blockId), address, e))}})}
  • 1

storage.ShuffleBlockFetcherIterator.fetchLocalBlocks

我們再回過頭來看獲取本地blocks:

private[this] def fetchLocalBlocks() {// 獲取迭代器val iter = localBlocks.iteratorwhile (iter.hasNext) {val blockId = iter.next()try {// 遍歷獲取數據// blockManager.getBlockData 會在后續博文講解val buf = blockManager.getBlockData(blockId)shuffleMetrics.incLocalBlocksFetched(1)shuffleMetrics.incLocalBytesRead(buf.size)buf.retain()results.put(new SuccessFetchResult(blockId, blockManager.blockManagerId, 0, buf, false))} catch {case e: Exception =>logError(s"Error occurred while fetching local blocks", e)results.put(new FailureFetchResult(blockId, blockManager.blockManagerId, e))return}}}

總結

以上是生活随笔為你收集整理的深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

美女黄频网站 | 国内久久 | 三级小视频在线观看 | 国产精品一区二区在线观看 | 天天综合网在线观看 | 99免在线观看免费视频高清 | 久久视频这里有久久精品视频11 | 欧美一区二区精美视频 | av中文字幕剧情 | 二区三区视频 | 国产黑丝一区二区三区 | 亚洲激情在线观看 | 精品国产aⅴ一区二区三区 在线直播av | 免费在线观看日韩视频 | 国产区 在线 | 成人小视频在线免费观看 | 日韩网站在线 | 久久久久久国产精品999 | 人人干狠狠操 | 夜夜爽www| 国产视频欧美视频 | 天天爱天天操天天爽 | 四虎国产免费 | 一级一片免费视频 | 91av蜜桃| 日韩中文免费视频 | www.激情五月.com | 国产福利资源 | 特级西西444www大精品视频免费看 | 色小说av| 色窝资源 | 9999精品 | 国产精品观看在线亚洲人成网 | 99热官网 | 免费在线激情电影 | 一区二区三区在线视频观看58 | 在线观看视频在线观看 | 国产美腿白丝袜足在线av | 在线观看91久久久久久 | 久久亚洲私人国产精品 | 超级碰碰碰碰 | 国产精品ⅴa有声小说 | 久久久伦理 | 国产偷国产偷亚洲清高 | 亚洲五月婷婷 | 99久久精品免费看国产四区 | 久久久久中文 | 色网站在线看 | 在线电影av | 色视频网站在线 | 国产色在线| 成人丁香花 | 麻豆视屏| 国产经典av| 人人盈棋牌 | 在线免费黄色av | 天天搞夜夜骑 | 精品视频在线播放 | 91精品久久久久久粉嫩 | 在线国产精品一区 | 久草在线视频首页 | 久久黄色片子 | 日韩天堂在线观看 | 天天综合导航 | 91精品国产成人 | 香蕉免费在线 | 一级片免费视频 | 久久不射网站 | 国产在线国偷精品产拍 | 西西444www| 一区二区三区四区在线免费观看 | 欧美亚洲专区 | 美女网站视频免费黄 | 免费在线观看a v | 国产高清专区 | 麻豆视频观看 | 国产亚洲91 | 日韩av中文字幕在线 | 国产高清视频在线播放一区 | a黄色片在线观看 | 91色网址| 久久国产经典视频 | 中文av网| a天堂中文在线 | 日韩欧美视频一区 | 亚洲伊人网在线观看 | 久久夜夜夜 | 亚洲欧美成人 | 深爱激情五月婷婷 | 久久久精品 | 奇米影视999 | 99久久夜色精品国产亚洲 | 亚洲综合国产精品 | 婷婷丁香激情 | 男女视频国产 | 日韩欧美综合在线视频 | 国产精品专区在线观看 | 最近免费观看的电影完整版 | 亚洲一级片在线看 | 久久国产成人午夜av影院宅 | 成人av资源| 三级黄色片在线观看 | 一区二区亚洲精品 | 久久观看免费视频 | 91传媒视频在线观看 | 久久免费久久 | 国产又粗又猛又黄视频 | www.97视频| 久久毛片高清国产 | 久热电影| 中文字幕在线观看免费高清完整版 | 蜜臀久久99静品久久久久久 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 欧美性做爰猛烈叫床潮 | 97精品在线 | 99久免费精品视频在线观看 | 97在线视频免费观看 | 激情欧美一区二区三区免费看 | 黄色av免费看 | 亚洲精品视频二区 | av一级二级 | 99久久www | 狠狠综合网 | 久久福利电影 | 久久天堂网站 | 韩日精品视频 | 亚洲精品视频在线观看免费 | 色婷婷免费视频 | 韩国一区二区三区在线观看 | 日韩午夜剧场 | 2019中文字幕第一页 | 91视视频在线直接观看在线看网页在线看 | 黄色avwww | 中文字幕色在线视频 | 97精品超碰一区二区三区 | 亚洲精品成人免费 | 99国产视频在线 | 国产视频精品久久 | 久久国语露脸国产精品电影 | av网址最新 | 91在线日韩| 国产精品成人久久久 | 欧美亚洲国产精品久久高清浪潮 | 天天av资源 | 亚洲综合在线一区二区三区 | 亚洲激精日韩激精欧美精品 | 国产一级二级三级视频 | 808电影| www黄在线| 精品国产aⅴ麻豆 | 亚洲日本va午夜在线影院 | 免费精品视频在线观看 | 亚洲视频久久久久 | 中文字幕日韩免费视频 | 射久久 | 天天爱天天 | 久久亚洲区| 日韩精品一区二区三区视频播放 | 中文永久字幕 | 亚洲午夜久久久久 | 伊人黄 | 欧美美女激情18p | 99久久99久久免费精品蜜臀 | 美女视频免费精品 | 天天操天天摸天天射 | 天天干天天操天天干 | 亚洲欧洲精品一区二区精品久久久 | 日本超碰在线 | 欧美久久久久久久久久 | 欧美性黄网官网 | 精品一区av | 精品国产一区二区三区不卡 | 免费99精品国产自在在线 | 999国内精品永久免费视频 | 久久久精品国产一区二区电影四季 | 91九色视频导航 | 丁香六月在线 | 91理论片午午伦夜理片久久 | 深夜免费福利视频 | 丁香婷婷基地 | 亚洲国产久| 日产中文字幕 | 久久露脸国产精品 | 丁香婷婷综合五月 | 免费的黄色av | 999久久久久久久久6666 | 国产精品18久久久久久久久 | 九九99 | 91大神精品视频在线观看 | 在线看中文字幕 | 国产美女视频免费观看的网站 | 久久在线观看视频 | 欧美午夜久久 | 女人高潮特级毛片 | 午夜精品一区二区三区可下载 | 99热在| 国产一级在线视频 | 91桃色在线播放 | 亚洲激情 在线 | 欧美色精品天天在线观看视频 | 日韩欧美一区二区三区免费观看 | 激情五月综合网 | 国产亚洲精品中文字幕 | 久久综合精品一区 | 久久福利综合 | 日本不卡一区二区三区在线观看 | 一区二区精品久久 | 国产精品久久久av久久久 | 91视频电影 | 久久久在线免费观看 | 男女激情网址 | www亚洲视频| 久久久精品网 | 99精品国产99久久久久久97 | 色婷婷在线观看视频 | 亚洲欧美精品一区二区 | 中文字幕在线观看第一区 | 午夜视频免费在线观看 | 91久久国产综合精品女同国语 | 91女人18片女毛片60分钟 | 91在线91 | 韩国av免费观看 | 激情五月婷婷激情 | 91刺激视频| 免费在线电影网址大全 | 色偷偷888欧美精品久久久 | 伊人网av | 欧美日韩在线观看一区二区 | 天天爽夜夜爽精品视频婷婷 | 亚洲蜜桃在线 | 毛片1000部免费看 | 人九九精品 | 一级久久精品 | 草久久久| 国产免费专区 | 国产无遮挡猛进猛出免费软件 | 亚洲视频在线观看免费 | 精品欧美一区二区精品久久 | 国产日韩精品一区二区 | 亚洲一区二区麻豆 | 日韩av免费在线看 | 国产伦精品一区二区三区高清 | 91av视频在线播放 | 97视频播放| 亚洲综合激情网 | 日本动漫做毛片一区二区 | www色网站| 国产.精品.日韩.另类.中文.在线.播放 | 91精品亚洲影视在线观看 | 精品视频中文字幕 | 中文在线 | 精品96久久久久久中文字幕无 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产亚洲欧洲 | 中文字幕免费观看全部电影 | 日韩 精品 一区 国产 麻豆 | 2021国产精品视频 | 综合激情久久 | 伊人官网| 亚州精品天堂中文字幕 | 欧美肥妇free | 亚洲黄色一级大片 | 久久精品成人欧美大片古装 | 麻花豆传媒mv在线观看网站 | 一级α片免费看 | 激情五月婷婷网 | 天天操夜夜曰 | 黄色软件在线观看视频 | 国产精品久久在线观看 | 国产麻豆精品一区 | 91在线成人 | 亚洲极色 | 亚洲一级片免费观看 | 97成人精品 | 国产精品久久久网站 | 精品久久91 | 欧美一级电影 | 欧美视频不卡 | 精品国自产在线观看 | a视频在线 | 国产精品视频永久免费播放 | 精品久久久久久国产91 | 久久久久久久久免费 | 日韩av中文字幕在线免费观看 | 在线免费观看一区二区三区 | 日韩欧美在线中文字幕 | 日本三级香港三级人妇99 | 久青草国产在线 | 激情亚洲综合在线 | 99色人| 99色网站| 亚洲精品综合一二三区在线观看 | 日本高清dvd | 91桃色在线免费观看 | 久久99久久99久久 | 日本黄色大片免费看 | 99色国产| 国产亚洲人成网站在线观看 | 福利区在线观看 | 欧美日韩国产网站 | 国产黄色在线 | 亚洲最大av在线播放 | 久久久噜噜噜久久久 | 五月天综合 | 91桃色国产在线播放 | 中文免费在线观看 | 美女久久视频 | 中文字幕日本在线观看 | 日韩色综合 | 天天干天天拍天天操天天拍 | 欧美日韩不卡一区二区三区 | 久久精品视频一 | 日韩欧美精品在线观看视频 | 免费h漫在线观看 | 五月婷婷一区二区三区 | 久插视频 | 五月婷在线 | 香蕉久久久久久av成人 | 久久国产午夜精品理论片最新版本 | 精品99免费 | 人人插人人费 | 国产精品一区二区三区在线播放 | 久99视频 | 色a资源在线| 天天天天干| 国产黄色片免费观看 | 一级电影免费在线观看 | 亚洲国产福利视频 | 九色免费视频 | 国产中文在线播放 | 亚洲精品字幕在线 | 国产精品久久久久一区二区三区共 | 欧美日韩免费视频 | 久久免费视频2 | 天天亚洲综合 | 日韩精品一区二区免费视频 | 少妇高潮冒白浆 | 91免费观看网站 | 一区二区三区四区精品 | 亚洲午夜久久久久久久久电影网 | 91精品一区二区三区久久久久久 | 国产经典 欧美精品 | 国产精品第7页 | 97国产精品 | 亚洲国产三级 | 日韩精品一区二区不卡 | 免费在线黄色av | 精品一区中文字幕 | 国产一级不卡视频 | 婷婷中文字幕 | 成人av日韩| av 一区 二区 久久 | 人人干人人超 | 国产亚洲精品美女 | 97精品国产 | www.xxx.性狂虐 | 四虎伊人 | 久久久久久97三级 | 精品美女在线观看 | 欧美国产不卡 | 视频在线观看一区 | 就要色综合 | 日本一区二区免费在线观看 | 色欧美88888久久久久久影院 | av高清在线| 一区二区三区影院 | 国产精品国产三级国产aⅴ无密码 | 免费黄色a网站 | 中文字幕亚洲欧美日韩 | 99视频久 | 中文字幕一区二区三区乱码不卡 | 97在线观视频免费观看 | 99久久99久久精品国产片 | 天天插天天干 | 国产三级国产精品国产专区50 | 日韩精品一区二区三区在线播放 | 久久久久久久国产精品视频 | 激情在线免费视频 | 日本 在线 视频 中文 有码 | 免费人做人爱www的视 | 99久久日韩精品视频免费在线观看 | 日日麻批40分钟视频免费观看 | 热久久电影| 免费激情在线电影 | 国产超碰在线观看 | 一区二区三区在线视频观看58 | 超碰97人 | 久久深夜 | 在线观看韩国av | 欧美精品免费在线观看 | 亚洲综合精品视频 | 97超碰中文字幕 | 国产看片免费 | 日韩乱码中文字幕 | www.色婷婷| 97在线观看免费观看高清 | 日本三级在线观看中文字 | 国产高清专区 | 国产在线不卡一区 | 韩国av在线播放 | 黄色成人av在线 | 日韩欧美高清在线观看 | 久久久久免费精品 | 亚洲精品美女 | 欧美极品少妇xbxb性爽爽视频 | 日本精品视频免费观看 | 久久综合九色综合网站 | 四虎影视国产精品免费久久 | 女女av在线| 欧美一级视频一区 | 免费看的黄色 | 久久人人射| 欧美怡红院视频 | 久久再线视频 | 色婷婷激情 | 亚洲专区欧美专区 | 久久免费资源 | 69久久夜色精品国产69 | 色综久久 | 91久久精品日日躁夜夜躁国产 | 中文字幕在线影院 | 国产理论片在线观看 | 久久婷婷色综合 | 免费福利片2019潦草影视午夜 | 久久国产美女视频 | 国产午夜一区 | 天天激情站 | 在线免费观看国产视频 | 96亚洲精品久久 | 欧美亚洲国产精品久久高清浪潮 | 国产精品久久久久久久久久久久久久 | av福利网址导航 | 欧美天天综合 | 一区二区成人国产精品 | 国产亚洲成人网 | 在线免费看片 | 丁香五月亚洲综合在线 | 偷拍视频一区 | 国产欧美精品一区二区三区 | 91热| 91久久久国产精品 | 91高清免费 | 五月天婷亚洲天综合网精品偷 | 国产特级毛片aaaaaa | 日韩欧美xxxx| 国产中文字幕在线免费观看 | av女优中文字幕在线观看 | 五月情婷婷 | 国产精品久久久久久久久久久久冷 | 欧美日韩亚洲精品在线 | av先锋影音少妇 | 欧美成人久久 | 欧美日韩视频免费 | 99久久久久久久久久 | 日日爱影视 | 91亚洲国产成人久久精品网站 | 久久国产精品免费观看 | www.狠狠色| 一级片视频在线 | www.五月婷 | 91中文字幕永久在线 | 色婷婷激情五月 | 玖玖玖影院 | 成人国产精品免费观看 | 超碰在线亚洲 | 插久久 | 久草在线费播放视频 | 狠狠亚洲 | 韩国精品一区二区三区六区色诱 | 国产欧美在线一区二区三区 | 五月天中文字幕mv在线 | 韩国av不卡 | 欧美日韩午夜爽爽 | 精品久久久久久一区二区里番 | www.综合网.com| 午夜电影一区 | 在线观看国产区 | 狠狠色丁香婷婷综合最新地址 | 又紧又大又爽精品一区二区 | 在线视频黄 | 91综合色| 国产成人精品日本亚洲999 | 日韩av不卡在线 | 久久综合九九 | 综合久久久久久久久 | 黄av免费| 久久99久久99精品免观看粉嫩 | 99亚洲精品 | 在线综合色 | 国产婷婷一区二区 | 久久污视频| 亚洲国产精品一区二区久久,亚洲午夜 | 91麻豆操 | 最新精品国产 | 日日夜夜91| 久久成人欧美 | 欧美大香线蕉线伊人久久 | 97视频播放 | 97av影院 | 国产精品va最新国产精品视频 | 在线观看亚洲专区 | 亚洲日本在线视频观看 | 伊人影院得得 | 一区二区三区在线免费播放 | 久久不卡国产精品一区二区 | 天天干.com| 欧美有色 | www.99久久.com | 欧美 日韩精品 | 国产成人av一区二区三区在线观看 | 18性欧美xxxⅹ性满足 | 日韩精品免费一区 | 夜添久久精品亚洲国产精品 | 99久久久国产精品免费99 | 久草国产在线观看 | 九九久久视频 | 免费在线精品视频 | 日韩在线免费高清视频 | 国产在线观看免费 | 免费av网址大全 | 久久网页 | 国产人在线成免费视频 | 成人在线免费看视频 | 亚洲国产人午在线一二区 | 亚洲婷婷伊人 | 久久婷婷视频 | 亚洲91av| 美女黄频免费 | 亚洲精品小视频在线观看 | 婷婷丁香色 | 亚洲电影黄色 | 国产高潮久久 | 亚洲三级在线免费观看 | 亚洲精品国产综合99久久夜夜嗨 | 国产精品99久久久久久大便 | 欧美日韩精品久久久 | 欧美在线free | 美女网站在线观看 | 91麻豆精品国产91久久久无限制版 | 西西4444www大胆艺术 | 日韩视频1区 | 国产精品九九九九九 | 日韩最新在线 | 亚洲mv大片欧洲mv大片免费 | 日韩中文字幕网站 | 成人黄色av免费在线观看 | 五月婷婷在线播放 | 久久免费a | 精品国产aⅴ麻豆 | 亚洲精品免费在线观看 | av怡红院 | 国产精品18videosex性欧美 | av在线亚洲天堂 | 99精品视频精品精品视频 | 成人一级免费电影 | 亚洲精品午夜久久久久久久 | 激情久久久久久久久久久久久久久久 | 狠狠色噜噜狠狠狠狠 | 精品99免费 | 国产精品毛片久久久 | 欧美成人亚洲 | 欧美一级黄色视屏 | 91九色网站| 中日韩三级视频 | 精品一区欧美 | 亚洲日韩欧美视频 | 日韩中文字幕第一页 | 国产一区播放 | 日韩免费三区 | 国产在线高清视频 | 一级黄色毛片 | 天天av天天 | 亚洲va在线va天堂va偷拍 | 日日麻批40分钟视频免费观看 | 国产精品一区二区三区视频免费 | 在线精品亚洲 | 国产亚洲视频在线 | 国产手机视频在线播放 | 久久久精品欧美一区二区免费 | 亚洲黄色免费在线看 | 激情丁香综合五月 | 在线观看免费中文字幕 | 国产999在线| 欧美高清视频不卡网 | 色婷婷综合视频在线观看 | 久草网首页| 精品亚洲免费 | 亚a在线 | 天天躁日日躁狠狠躁 | 日韩一区二区三区在线观看 | 国产精品精品久久久 | 五月天色丁香 | 在线观看播放av | 精品久久精品久久 | 国产精品白丝jk白祙 | 日本久久久久久久久久久 | 国产精品乱码一区二区视频 | 日韩超碰 | 00av视频 | 久久一本综合 | 欧美日韩中文视频 | 99热这里只有精品在线观看 | 深爱激情亚洲 | 国产字幕在线观看 | 九色自拍视频 | 美女视频黄的免费的 | 99久久日韩精品免费热麻豆美女 | 天天操天天操一操 | 午夜av免费观看 | 91精品婷婷国产综合久久蝌蚪 | 五月天婷婷综合 | 超碰久热 | 日韩一级精品 | 成人黄色影片在线 | 狠狠色噜噜狠狠狠狠2021天天 | 2022久久国产露脸精品国产 | 激情久久久 | 精品国产一区二区三区日日嗨 | 日一日操一操 | 久久 在线 | 啪啪动态视频 | 久久综合成人 | 亚洲视频在线观看免费 | 日韩精品专区在线影院重磅 | 麻豆传媒视频在线免费观看 | 国产亚洲在 | 国产日产精品一区二区三区四区 | 制服丝袜天堂 | 中文字幕乱偷在线 | 日韩欧美在线播放 | 天天干天天拍天天操 | 国产一区精品在线观看 | 国产亚洲精品久 | 九九免费观看全部免费视频 | 五月天中文在线 | 麻豆精品91| 97视频在线免费 | 九九视频精品免费 | 激情综合啪 | 在线99热| 国产精品久久久久久吹潮天美传媒 | 日韩电影在线观看一区 | 亚洲精品www| 日日夜夜免费精品视频 | 91av大全| 亚洲视频电影在线 | 天堂va欧美va亚洲va老司机 | 欧美成人性网 | 三级视频片 | 99麻豆视频 | 国产在线看一区 | 国产涩涩网站 | av成人免费在线 | 手机在线看永久av片免费 | 国产亚洲视频中文字幕视频 | 精品国产乱码久久久久久1区二区 | 久久草视频 | 国产91在线免费视频 | 天天干,天天插 | 久久精品一 | 国产最新视频在线 | av性在线| 成人免费在线观看电影 | 亚洲成人精品久久久 | 欧美精品久久久久久久久久丰满 | 人人插人人 | 夜色成人av| 国产一级二级在线 | 丁香五月网久久综合 | 日韩大片免费在线观看 | 日韩在线电影 | 日日夜夜天天久久 | 精品国产一区二区三区久久 | 丁香九月激情 | 伊人久久五月天 | 不卡国产在线 | 中字幕视频在线永久在线观看免费 | 人人爱天天操 | 中文字幕视频三区 | 麻豆免费在线视频 | 色综合天天天天做夜夜夜夜做 | 97电影网手机版 | 国产亚洲精品久久久久久无几年桃 | 一级黄色在线视频 | 黄免费在线观看 | 亚洲成av人影片在线观看 | 色六月婷婷 | 国产资源精品 | 这里只有精彩视频 | 国产精品一区二区吃奶在线观看 | 国产成人综合精品 | 国产成人精品一区二 | 久久五月婷婷综合 | 久久精品国产精品亚洲精品 | av免费看电影 | 丁香婷婷激情国产高清秒播 | 日韩大片在线看 | 国产精品99久久久久久有的能看 | 久久人人插 | 日韩免费区 | 免费在线中文字幕 | 国产手机在线播放 | 久久这里有精品 | 国产96av| 国产中年夫妇高潮精品视频 | 91最新在线观看 | 综合色站导航 | 99久久精品国产亚洲 | 91九色精品女同系列 | 亚洲精品网页 | 4438全国亚洲精品在线观看视频 | www.伊人网.com| 亚洲国产精彩中文乱码av | 亚洲国产日韩一区 | 免费大片黄在线 | 婷婷色社区 | av高清影院 | 91女人18片女毛片60分钟 | 久草电影免费在线观看 | 日韩一区二区三区视频在线 | av片在线看 | 国产91小视频 | 亚洲永久av | 久久国产成人午夜av影院宅 | 中文字幕综合在线 | 国产亚洲精品精品精品 | 国产成人av免费在线观看 | 日韩一区二区三区高清免费看看 | 国产在线观看99 | av先锋影音少妇 | 免费网站观看www在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 色综合久久88色综合天天人守婷 | 五月婷婷在线观看视频 | 日韩二区三区在线 | 成人免费观看视频大全 | 国产精品美女毛片真酒店 | 一本一道久久a久久精品蜜桃 | 久久精品—区二区三区 | 丝袜美女视频网站 | 精品在线视频播放 | 国产小视频免费在线网址 | 成人国产精品电影 | 96视频免费在线观看 | 日韩专区在线播放 | 婷婷中文在线 | 午夜精品久久久久久久99热影院 | 亚洲 欧洲 国产 精品 | 一区二区三区高清 | 成人黄色av网站 | 亚洲精品视频第一页 | 在线亚洲高清视频 | 毛片精品免费在线观看 | 免费a视频| 国产精品va最新国产精品视频 | 麻豆视频在线看 | 欧美在线a视频 | 在线观看视频你懂得 | 91精品视频免费看 | 激情黄色av| 国产超碰在线 | 狠狠色丁香久久婷婷综合五月 | 国产精品美女久久久久久2018 | 免费黄色看片 | 在线观看国产成人av片 | 欧美国产高清 | 日本中文字幕视频 | 美女网站在线观看 | 久久久久综合 | 99热最新在线 | 国产黄av | 亚洲精品乱码久久久久久蜜桃动漫 | 欧美日韩视频在线一区 | 97香蕉久久国产在线观看 | 五月天综合色激情 | 最近更新好看的中文字幕 | 国产正在播放 | 欧美日韩国产成人 | 五月开心网 | 97精品在线 | 国产在线观看午夜 | 欧美午夜a | 成人黄色大片在线免费观看 | 国产 精品 资源 | 午夜精品电影一区二区在线 | 免费观看mv大片高清 | 亚洲精区二区三区四区麻豆 | 亚洲少妇影院 | 久久优| 在线 国产 亚洲 欧美 | 久久免费视频播放 | 欧美先锋影音 | 国产网站在线免费观看 | 四虎海外影库www4hu | 91精品国产自产在线观看永久 | 天堂在线免费视频 | 国产一级视屏 | 欧美激情视频免费看 | 天天操天天操天天 | 国产亚洲精品中文字幕 | 亚洲日本精品视频 | 激情五月婷婷综合网 | 亚洲一级片在线看 | 天天插天天操天天干 | 麻豆传媒电影在线观看 | 天天干天天操人体 | 高清av免费看 | 91av视频免费观看 | 91亚洲精品久久久久图片蜜桃 | 久久久久久久久久久久亚洲 | 久久久人人爽 | 国产夫妻性生活自拍 | 久久色视频| 9在线观看免费高清完整版 玖玖爱免费视频 | 中文国产成人精品久久一 | 91视频在线国产 | 欧美va天堂在线电影 | 国产精品一区久久久久 | 人人爽人人澡人人添人人人人 | 人人玩人人添人人 | 精品国精品自拍自在线 | 啪啪肉肉污av国网站 | 欧美日韩久久久 | 国产精品中文久久久久久久 | 国产91在线观 | av一级片网站 | 国产免费久久精品 | 91视频最新网址 | 在线 视频 一区二区 | 精品中文字幕在线播放 | 久久精品99北条麻妃 | 久久久亚洲麻豆日韩精品一区三区 | 911国产在线观看 | 亚洲一级在线观看 | 91av视频导航 | 日韩免费视频一区二区 | 国产精品一区二区三区免费视频 | 亚洲精品福利视频 | 国产小视频在线看 | 亚洲专区中文字幕 | 在线亚洲天堂网 | 久草在线在线视频 | 夜夜躁狠狠燥 | 人人澡超碰碰97碰碰碰软件 | 亚洲国产网站 | 一级a性色生活片久久毛片波多野 | 日韩动漫免费观看高清完整版在线观看 | 久久高视频 | 久久精品亚洲一区二区三区观看模式 | 丁香九月婷婷 | 四虎永久国产精品 | 欧美一级裸体视频 | 国产91国语对白在线 | 成人午夜网 | 国产爽视频 | 国产精品区二区三区日本 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天堂麻豆| 91激情视频在线播放 | 中文字幕电影一区 | 中文字幕二区三区 | 激情五月婷婷 | 99精品电影 | 日韩av中文在线观看 | 亚洲欧洲精品一区二区 | 在线激情影院一区 | 免费国产一区二区 | 91热视频在线观看 | 国产99久久九九精品免费 | 日本精品一区二区 | 亚洲欧美视频 | 色国产精品一区在线观看 | 五月婷久 | 超碰国产在线播放 | 久久久精品高清 | 操久在线| 色多多视频在线观看 | 国产亚洲精品久久久久久 | 精精国产xxxx视频在线播放 | 人人射av | 亚一亚二国产专区 | 亚洲 欧美日韩 国产 中文 | 国产精品丝袜久久久久久久不卡 | 99在线精品视频观看 | 黄色福利网站 | 日韩小视频 | 欧美一级免费高清 | 中文字幕在 | 91精品欧美一区二区三区 | 综合久久久久久久 | 91c网站色版视频 | 精品在线观看免费 | 99精品视频免费在线观看 | 免费av福利 | 婷婷综合视频 | 五月天婷婷狠狠 | 97夜夜澡人人爽人人免费 | 亚洲午夜精品久久久久久久久久久久 | 三级av免费看 | 天天曰天天干 | www中文在线| 日韩黄色影院 | 美女一区网站 | 日韩欧美国产精品 | 97高清视频 | 午夜av色 | 91视频三区 | 久久观看最新视频 | 91成人免费看 | 国产黄色片一级三级 | 国产精品美女久久久 | 中文字幕制服丝袜av久久 | 果冻av在线 | 成人一区二区在线 | 国产一区二区高清 | 91天天操 | 果冻av在线 | 精品视频在线看 | 99亚洲国产 | 国产又粗又猛又爽又黄的视频先 | 精品久久久久久久久久久院品网 | 91完整版| 五月婷婷六月丁香激情 | 国产精品正在播放 | 国产午夜精品理论片在线 | 欧美日韩首页 | 一本一本久久a久久精品综合 | 天天操天天干天天爱 | 日韩视频三区 | 中文电影网 | 国产精品淫片 | 外国av网| 中文字幕免费高清在线观看 | 高清一区二区三区av | 亚洲欧美日韩国产 | a黄在线观看 | 欧美日韩性 | 探花在线观看 | 日韩69av| 超碰在线最新网址 | 亚洲成人影音 | 日韩综合一区二区 | 伊人影院av | 91精品久久久久久久久久入口 | 久久涩视频 | 99 视频 高清 | 久久午夜影视 | 99爱精品在线 | 91麻豆文化传媒在线观看 | 国产成人av一区二区三区在线观看 | 在线看av的网址 | 中日韩三级视频 | 久久露脸国产精品 | 国产免费看| 欧美狠狠色| 99视频+国产日韩欧美 | 日韩国产高清在线 | 人人看人人 | 一区二区三区动漫 | 五月综合网站 | 免费观看版| 99视频这里只有 | 国产精品美女网站 | 欧美一二三视频 | 中国成人一区 | 久久99精品国产99久久 | 久草视频在线看 | 日韩a在线播放 | 国产三级香港三韩国三级 | 成人av免费看 | 久久99精品久久久久久清纯直播 | 久久99热国产 | 久久久资源| 激情丁香5月 | 好看的国产精品视频 | 久久视频精品在线 | 欧美性色综合 | 97激情影院| 欧美伦理电影一区二区 | 国产精品日韩高清 | 成人在线视频在线观看 | 久久久久欠精品国产毛片国产毛生 | 你操综合| 久久久久久久久久久电影 | 免费看污在线观看 | 国产在线精品一区二区不卡了 | 狠狠伊人 | 日女人免费视频 | 欧美一区免费观看 | 欧美性极品xxxx做受 | 中文字幕免费在线看 | 成人av在线影视 | 91精品老司机久久一区啪 | 久久tv视频 | 成人久久影院 | 伊人精品影院 | 97视频免费看 | av中文字幕av |