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

從源碼看Spark讀取Hive表數據小文件和分塊的問題

大數據 Spark
本文涉及源碼基于Spark2.0.0和Hadoop2.6.0,不同版本代碼可能不一致,需自己對應。此外針對TextInputFormat格式的Hive表,其他格式的比如Parquet有Spark自己的高效實現,不在討論范圍之內

前言

有同事問到,Spark讀取一張Hive表的數據Task有一萬多個,看了Hive表分區下都是3MB~4MB的小文件,每個Task只處理這么小的文件,實在浪費資源浪費時間。而我們都知道Spark的Task數由partitions決定,所以他想通過repartition(num)的方式來改變分區數,結果發現讀取文件的時候Task數并沒有改變。遂問我有什么參數可以設置,從而改變讀取Hive表時的Task數,將小文件合并大文件讀上來

本文涉及源碼基于Spark2.0.0和Hadoop2.6.0,不同版本代碼可能不一致,需自己對應。此外針對TextInputFormat格式的Hive表,其他格式的比如Parquet有Spark自己的高效實現,不在討論范圍之內

分析

Spark讀取Hive表是通過HadoopRDD掃描上來的,具體可見 org.apache.spark.sql.hive.TableReader類,構建HadoopRDD的代碼如下 

  1. val rdd = new HadoopRDD( 
  2. sparkSession.sparkContext, 
  3. _broadcastedHadoopConf.asInstanceOf[Broadcast[SerializableConfiguration]], 
  4. Some(initializeJobConfFunc), 
  5. inputFormatClass, 
  6. classOf[Writable], 
  7. classOf[Writable], 
  8. _minSplitsPerRDD) 

這里inputFormatClass是Hive創建時指定的,默認不指定為 org.apache.hadoop.mapred.TextInputFormat,由它就涉及到了HDFS文件的FileSplit數,從而決定了上層Spark的partition數。在進入HadoopRDD類查看之前,還有一個參數需要我們注意,就是 _minSplitsPerRDD,它在后面SplitSize的計算中是起了作用的。

我們看一下它的定義 

  1. private val _minSplitsPerRDD = if (sparkSession.sparkContext.isLocal) { 
  2. 0 // will splitted based on block by default
  3. else { 
  4. math.max(hadoopConf.getInt("mapred.map.tasks", 1), 
  5. sparkSession.sparkContext.defaultMinPartitions) 

在我們指定以--master local模式跑的時候,它為0,而在其他模式下,則是求的一個***值。這里重點看 defaultMinPartitions,如下 

  1. def defaultMinPartitions: Int = math.min(defaultParallelism, 2) 
  2.  
  3. // defaultParallelism 在yarn和standalone模式下的計算 
  4. def defaultParallelism(): Int = { 
  5. conf.getInt("spark.default.parallelism", math.max(totalCoreCount.get(), 2)) 

從這里可以看到,defaultMinPartitions的值一般為2,而 mapred.map.tasks 或者 mapreduce.job.maps( 新版參數)是Hadoop的內建參數,其默認值也為2,一般很少去改變它。所以這里_minSplitsPerRDD的值基本就是2了。

下面我們跟到HadoopRDD類里,去看看它的partitions是如何來的 

  1. def getPartitions: Array[Partition] = { 
  2. val jobConf = getJobConf() 
  3. // add the credentials here as this can be called before SparkContext initialized 
  4. SparkHadoopUtil.get.addCredentials(jobConf) 
  5. // inputFormat就是上面參數inputFormatClass所配置的類的實例 
  6. val inputFormat = getInputFormat(jobConf) 
  7. // 此處獲取FileSplit數,minPartitions就是上面的_minSplitsPerRDD 
  8. val inputSplits = inputFormat.getSplits(jobConf, minPartitions) 
  9. val array = new Array[Partition](inputSplits.size
  10. // 從這里可以看出FileSplit數決定了Spark掃描Hive表的partition數 
  11. for (i <- 0 until inputSplits.size) { 
  12. array(i) = new HadoopPartition(id, i, inputSplits(i)) 
  13. array 

在 getPartitions 方法里我們可以看到 FileSplit數***決定了Spark讀取Hive表的Task數,下面我們再來看看 mapred.TextInputFormat 類里 getSplits 的實現

分兩步來看,首先是掃描文件,計算文件大小的部分 

  1. FileStatus[] files = listStatus(job); 
  2.  
  3. ..... 
  4.  
  5. long totalSize = 0; // compute total size 
  6. for (FileStatus file: files) { // check we have valid files 
  7. if (file.isDirectory()) { 
  8. throw new IOException("Not a file: "+ file.getPath()); 
  9. totalSize += file.getLen(); 
  10.  
  11. // numSplits就是上面傳入的minPartitions,為2 
  12. long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits); 
  13. long minSize = Math.max(job.getLong("mapreduce.input.fileinputformat.split.minsize", 1), minSplitSize); 
  14.  
  15. // minSplitSize 默認為1,唯一可通過 setMinSplitSize 方法設置 
  16. private long minSplitSize = 1; 

針對Hive表的分區,Spark對每個分區都構建了一個HadoopRDD,每個分區目錄下就是實際的數據文件,例如我們集群的某一張表按天分區,每天下面有200個數據文件,每個文件大概3MB~4MB之間,這些實際上是reduce設置不合理導致的小文件產生,如下圖 

HiveFile

此處 listStatus 方法就是掃描的分區目錄,它返回的就是圖中顯示的具體 part-*****文件的FileStatus對象,一共200個。從 totalSize 的計算可以看出,它是這200個文件的總大小,為838MB,因此 goalSize 就為419MB。

參數 mapreduce.input.fileinputformat.split.minsize 在Spark程序沒有配的情況下,獲取的值為0,而 minSplitSize在Spark獲取FileSplits的時候并沒有被設置,所以為默認值1,那么 minSize 就為1

其次,我們再來看從文件劃分Split,部分代碼如下(部分解釋見注釋) 

  1. ArrayList splits = new ArrayList(numSplits); 
  2. NetworkTopology clusterMap = new NetworkTopology(); 
  3.  
  4. // files是上面掃描的分區目錄下的part-*****文件 
  5. for (FileStatus file: files) { 
  6. Path path = file.getPath(); 
  7. long length = file.getLen(); 
  8. if (length != 0) { 
  9. FileSystem fs = path.getFileSystem(job); 
  10. BlockLocation[] blkLocations; 
  11. if (file instanceof LocatedFileStatus) { 
  12. blkLocations = ((LocatedFileStatus) file).getBlockLocations(); 
  13. else { 
  14. blkLocations = fs.getFileBlockLocations(file, 0, length); 
  15. // 判斷文件是否可切割 
  16. if (isSplitable(fs, path)) { 
  17. // 這里獲取的不是文件本身的大小,它的大小從上面的length就可以知道,這里獲取的是HDFS文件塊(跟文件本身沒有關系)的大小 
  18. // HDFS文件塊的大小由兩個參數決定,分別是 dfs.block.size 和 fs.local.block.size 
  19. // 在HDFS集群模式下,由 dfs.block.size 決定,對于Hadoop2.0來說,默認值是128MB 
  20. // 在HDFS的local模式下,由 fs.local.block.size 決定,默認值是32MB 
  21. long blockSize = file.getBlockSize(); // 128MB 
  22.  
  23. // 這里計算splitSize,根據前面計算的goalSize=419MB,minSize為1 
  24. long splitSize = computeSplitSize(goalSize, minSize, blockSize); 
  25.  
  26. long bytesRemaining = length; 
  27. // 如果文件大小大于splitSize,就按照splitSize對它進行分塊 
  28. // 由此可以看出,這里是為了并行化更好,所以按照splitSize會對文件分的更細,因而split會更多 
  29. while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { 
  30. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations, 
  31. length-bytesRemaining, splitSize, clusterMap); 
  32. splits.add(makeSplit(path, length-bytesRemaining, splitSize, 
  33. splitHosts[0], splitHosts[1])); 
  34. bytesRemaining -= splitSize; 
  35.  
  36. if (bytesRemaining != 0) { 
  37. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations, length 
  38. - bytesRemaining, bytesRemaining, clusterMap); 
  39. splits.add(makeSplit(path, length - bytesRemaining, bytesRemaining, 
  40. splitHosts[0], splitHosts[1])); 
  41. else { 
  42. String[][] splitHosts = getSplitHostsAndCachedHosts(blkLocations,0,length,clusterMap); 
  43. splits.add(makeSplit(path, 0, length, splitHosts[0], splitHosts[1])); 
  44. else { 
  45. //Create empty hosts array for zero length files 
  46. splits.add(makeSplit(path, 0, length, new String[0])); 

從上面可以看到,splitSize是從 computeSplitSize(goalSize, minSize, blockSize) 計算來的,這三個參數我們都知道大小,那么計算規則是怎么樣的呢

規則:Math.max(minSize, Math.min(goalSize, blockSize)),從而我們可以知道 splitSize = 128MB,對于3MB~4MB的小文件來說,就 決定了一個小文件就是一個split了,從而對應了一個Spark的partition,所以我們一個分區下就有200個partition,當取兩個月的數據時,就是 200 * 30 * 2 = 12000,從而是12000個Task,跟同事所說的吻合!

> 而從TextInputFormat里分Split的邏輯來看,它只會把一個文件分得越來越小,而不會對小文件采取合并,所以無論調整哪個參數,都沒法改變這種情況!而通過repartition強行分區,也是在拿到HDFS文件之后對這12000個partition進行重分區,改變不了小文件的問題,也無法改變讀取Hive表Task數多的情況

總結

1、Block是物理概念,而Split是邏輯概念,***數據的分片是根據Split來的。一個文件可能大于BlockSize也可能小于BlockSize,大于它就會被分成多個Block存儲到不同的機器上,SplitSize可能大于BlockSize也可能小于BlockSize,SplitSize如果大于BlockSize,那么一個Split就可能要跨多個Block。對于數據分隔符而言,不用擔心一個完整的句子分在兩個Block里,因為在Split構建RecordReader時,它會被補充完整

2、對于采用 org.apache.hadoop.mapred.TextInputFormat 作為InputFormat的Hive表,如果存在小文件,Spark在讀取的時候單憑調參數和repartition是改變不了分區數的!對于小文件的合并,目前除了Hadoop提供的Archive方式之外,也只能通過寫MR來手動合了,***的方式還是寫數據的時候自己控制reduce的個數,把握文件數

3、對于Spark直接通過SparkContext的 textFile(inputPath, numPartitions) 方法讀取HDFS文件的,它底層也是通過HadoopRDD構建的,它的參數numPartitions就是上面計算goalSize的numSplits參數,這篇 文章 對原理描述的非常詳細,非常值得一讀

4、對于小文件合并的InputFormat有 org.apache.hadoop.mapred.lib.CombineFileInputFormat,跟它相關的參數是 mapreduce.input.fileinputformat.split.maxsize,它用于設置一個Split的***值

5、跟mapred.TextInputFormat 里的Split劃分相關的參數

  • mapreduce.input.fileinputformat.split.minsize : 決定了計算Split劃分時的minSize
  • mapreduce.job.maps 或 mapred.map.tasks : 決定了getSplits(JobConf job, int numSplits)方法里的numSplits,從而可以影響goalSize的大小
  • dfs.block.size 或 fs.local.block.size : 決定了HDFS的BlockSize

6、MapReduce新版API里的 org.apache.hadoop.mapreduce.lib.input.TextInputFormat,它的SplitSize與上面說到的計算方式不一樣,getSplits方法的簽名為 getSplits(JobContext job),不再有numSplilts這個參數,splitSize的計算規則改為 Math.max(minSize, Math.min(maxSize, blockSize)),minSize和blockSize跟之前一樣,新的maxSize為conf.getLong("mapreduce.input.fileinputformat.split.maxsize", Long.MAX_VALUE)

7、在Spark2.0.0里,設置Hadoop相關的參數(比如mapreduce開頭的)要通過 spark.sparkContext.hadoopConfiguration 來設置

責任編輯:未麗燕 來源: 網絡大數據
相關推薦

2023-05-11 00:17:44

分區HiveReduce

2017-09-25 16:21:30

Spark on yacluster模式

2021-07-14 09:48:15

Linux源碼Epoll

2020-08-13 14:58:06

Spark小文件存儲

2021-07-15 14:27:47

LinuxSocketClose

2021-03-10 08:20:54

設計模式OkHttp

2020-10-10 07:00:16

LinuxSocketTCP

2021-06-10 09:52:33

LinuxTCPAccept

2017-04-05 20:00:32

ChromeObjectJS代碼

2019-10-10 16:20:23

spark內存管理

2019-04-17 14:44:42

Spark內存源碼

2017-06-26 15:00:17

2023-01-31 10:22:00

HiveMapReduce文件合并

2018-02-02 15:48:47

ChromeDNS解析

2010-12-10 08:51:13

Web 2.0Cache集群

2025-11-04 01:30:00

Paimon分布式文件系統

2021-04-12 06:08:16

HiveSpark大數據

2017-02-09 15:15:54

Chrome瀏覽器

2020-09-23 12:32:18

網絡IOMySQL

2023-03-30 09:06:20

HiveSpark大數據
點贊
收藏

51CTO技術棧公眾號

九九热精品视频国产| 狠狠做深爱婷婷久久综合一区| 国产精品美女久久久免费| 一级黄色片毛片| 国产色婷婷在线| 99在线热播精品免费| 91精品国产99| aa片在线观看视频在线播放| 625成人欧美午夜电影| 久久婷婷成人综合色| 国产精品91久久| 亚洲av无码国产精品久久| 另类专区亚洲| 国产日韩欧美一区二区三区乱码 | 国产视频一区二区三区在线观看| 欧美在线精品免播放器视频| 影音先锋制服丝袜| 不卡av播放| 不卡视频免费播放| 国产精品美女www爽爽爽视频| 欧美风情第一页| 福利在线一区| 在线视频综合导航| 台湾成人av| а√天堂资源在线| 在线亚洲自拍| 最近2019中文字幕mv免费看 | 国产欧美日韩在线观看视频| 欧美午夜在线一二页| 51精品在线观看| 少妇愉情理伦三级| 九九热hot精品视频在线播放| 欧美亚洲国产一区二区三区va| 国产在线无码精品| 日韩私人影院| 国产不卡高清在线观看视频| 国产不卡视频在线| 国产无遮挡裸体免费视频| 日本不卡高清| 亚洲欧美精品一区二区| 无码人妻一区二区三区精品视频| 91另类视频| 欧美日韩国产限制| 国产乱子伦精品视频| av网站无病毒在线| 久久蜜桃一区二区| 国产成人精品自拍| 在线观看中文字幕码| 国产欧美一级| 欧美国产乱视频| 99热99这里只有精品| 亚洲人成网www| 精品va天堂亚洲国产| 国产女同无遮挡互慰高潮91| 午夜无码国产理论在线| 欧美日韩色婷婷| 超碰成人免费在线| 黄视频在线免费看| 亚洲制服欧美中文字幕中文字幕| 中文字幕久久一区| 日韩成人影视| 中文字幕亚洲不卡| 亚洲永久激情精品| 超碰在线观看免费| 亚洲免费在线视频一区 二区| 亚洲欧洲免费无码| 三级外国片在线观看视频| 国产欧美日韩综合| 五月天丁香综合久久国产| а√天堂中文在线资源bt在线| 久久香蕉国产线看观看99| 鲁丝一区二区三区免费| 亚洲一区 在线播放| 久久av红桃一区二区禁漫| 欧美日韩在线播放视频| 亚洲四色影视在线观看| 亚洲成人av免费在线观看| 久久久久久毛片免费看| 亚洲激情在线观看| 国产精品1000部啪视频| 亚洲人成网亚洲欧洲无码| 亚洲精品天天看| 亚洲第一页av| 伊人精品一区| 亚洲欧洲中文天堂| 成人午夜福利一区二区| 亚洲精品无吗| 亚洲第一福利网| 亚洲精品女人久久久| 要久久爱电视剧全集完整观看| 日韩成人激情视频| 一女三黑人理论片在线| 亚洲va久久| 亚洲图片欧美日产| 1024在线看片| 99久久婷婷这里只有精品| 日韩黄色av网站| 国产综合精品久久久久成人av| 国产精品探花在线观看| 中文字幕亚洲欧美一区二区三区| 国产麻豆a毛片| 亚洲最新色图| 97香蕉超级碰碰久久免费软件| 欧美亚韩一区二区三区| 日韩不卡一区二区| 成人深夜直播免费观看| 日韩一级免费视频| ww久久中文字幕| 中文字幕不卡每日更新1区2区| 欧洲精品二区| 色欧美88888久久久久久影院| 九色porny91| 亚洲精品国产九九九| 日韩电视剧在线观看免费网站| 9.1成人看片免费版| 久久视频精品| 久久久久久国产精品三级玉女聊斋| 欧美亚洲天堂网| 久久精品国语| 国产91视觉| 欧洲毛片在线| 亚洲男同1069视频| 黄色影院一级片| 日韩欧美激情| 亚洲精品国产欧美| 91禁男男在线观看| 欧美午夜a级限制福利片| 国产精品91在线| 亚洲AV无码一区二区三区性| 久久网这里都是精品| 欧美aaa在线观看| 亚洲女同志freevdieo| 欧美另类久久久品| 中文字幕av观看| 图片区亚洲欧美小说区| 色综合久综合久久综合久鬼88 | 四虎884aa成人精品| 国产一区91| 91九色在线视频| 亚洲日本在线播放| 一区二区三区在线视频免费观看| 欧美日韩二三区| 国产日本亚洲| 揄拍成人国产精品视频| 中文字字幕在线中文| 国产精品一区二区久久精品爱涩| 欧美裸体网站| brazzers在线观看| 欧美一级日韩一级| 国产午夜精品福利视频| 美女日韩在线中文字幕| 国产v亚洲v天堂无码| 美女国产在线| 欧美日韩美女一区二区| xxxx日本免费| 一本色道久久综合一区| 国产成人亚洲欧美| av在线导航| 欧美精品色一区二区三区| 最近中文字幕免费视频| 亚洲一区二区网站| 精品国产一区二区三区免费| 青春草视频在线| 欧美一区二区三区四区视频| 摸摸摸bbb毛毛毛片| 美女国产精品| 欧美国产一二三区| 成人黄色免费短视频| 亚洲欧美成人精品| 7799精品视频天天看| 91首页免费视频| 国产黄色一级网站| 91亚洲精品视频在线观看| 久久久在线视频| 欧美一级一区二区三区| 亚洲国产精品精华液网站| 国产调教打屁股xxxx网站| 午夜精彩国产免费不卡不顿大片| 成人午夜在线观看| a级片国产精品自在拍在线播放| 欧美最新大片在线看| 五月婷婷六月香| 久久成人免费电影| 亚洲综合激情五月| 日韩精品中文字幕一区二区| 欧美日韩爱爱视频| 好吊色视频一区二区| 亚洲成av人片www| 国产伦理片在线观看| 日本不卡一区二区三区 | 最新不卡av| 精品中文字幕一区二区三区| 国内伊人久久久久久网站视频 | 久久亚洲欧美国产精品乐播 | 欧美aaaaaa午夜精品| 亚洲精品一区二区三区四区五区 | 一区二区三区免费在线| 亚洲女人的天堂| 亚洲色偷偷色噜噜狠狠99网| 亚洲综合国产| 亚洲精品人成| 久久伊人影院| 91黑丝高跟在线| 久久精品色图| 欧美一区二区视频网站| 动漫精品一区一码二码三码四码| 91浏览器在线视频| 黄色小视频免费网站| 欧美视频四区| 免费久久一级欧美特大黄| 欧美a一级片| 久久久亚洲影院| 成人亚洲综合天堂| 亚洲大胆人体在线| 中文字幕av免费观看| 亚洲欧美偷拍卡通变态| av网页在线观看| 蜜臀av国产精品久久久久| 国产精品三级一区二区| 国产精品嫩草影院在线看| 91精品美女在线| 不卡av影片| 色综合男人天堂| www.亚洲.com| 亚洲国产精品大全| 一级特黄aaa大片| 欧美日韩色婷婷| 日本特黄一级片| 国产精品白丝在线| 一区二区不卡免费视频| 国产乱国产乱300精品| 精品国产成人av在线免| 欧美精品偷拍| 亚洲精品一区二区毛豆| 精品免费视频| 久久久影院一区二区三区| 久久av网站| 国产精品日韩专区| 中文字幕色婷婷在线视频| 欧美高清电影在线看| 美女写真理伦片在线看| 亚洲天堂av电影| 午夜在线视频免费| 日韩亚洲欧美一区| 伊人网av在线| 日韩欧美在线播放| 日韩精品在线不卡| 亚洲福中文字幕伊人影院| 国产真实乱在线更新| 国产欧美一区二区精品性色超碰| 精品伦一区二区三区| 精品无码三级在线观看视频| 少妇性l交大片| 国产一区久久| 免费观看国产精品视频| 午夜精品久久99蜜桃的功能介绍| 亚洲精品免费在线看| 国产一区二区精品福利地址| 精品国产二区在线| 动漫视频在线一区| 国产美女精品在线观看| 亚洲视频国产精品| 亚洲综合精品一区二区| av在线成人| 成人性生交大片免费看小说 | 好吊妞无缓冲视频观看| 欧美成人69| 国产欧美自拍视频| 国产精品毛片一区二区在线看| 天天干天天操天天干天天操| 国产精品黑丝在线播放| 一区二区三区四区视频在线观看| 狠狠色丁香婷婷综合影院| 蜜桃av噜噜一区二区三| 天海翼精品一区二区三区| 国产a一区二区| 亚洲桃色综合影院| 欧洲在线视频一区| 精品视频97| 神马一区二区影院| 日韩在线不卡| 五月天综合婷婷| 911久久香蕉国产线看观看| 妞干网这里只有精品| 一区二区三区网站| 久久男人资源站| 狠狠爱成人网| 国产高清精品在线观看| 青青草原综合久久大伊人精品优势 | 男女av免费观看| 日韩av在线免费观看不卡| 亚洲欧美自拍另类日韩| 国产又黄又大久久| 一区二区视频观看| 欧美激情一区三区| 51精品免费网站| 亚洲亚洲人成综合网络| 天天综合网久久综合网| 欧美午夜精品久久久久久超碰| 国产毛片毛片毛片毛片毛片| 欧美r级电影在线观看| 五月婷婷丁香六月| 一本色道久久88综合日韩精品 | 视频一区视频二区视频三区视频四区国产| 加勒比久久综合| 亚洲美女自拍偷拍| 最新日韩在线| 色哟哟精品视频| 激情综合一区二区三区| 中文视频在线观看| 欧美国产精品久久| 免费视频一二三区| 91福利精品视频| 精品毛片在线观看| 中文字幕欧美国内| 91在线三级| 国产精品美女免费看| 亚洲福利合集| 日本一区二区在线| 91一区二区| 免费男同深夜夜行网站| 国产伦精品一区二区三区免费迷 | 免费av在线电影| 中文字幕在线观看日韩| 日韩av影片| 91久久久久久久久久| 杨幂一区二区三区免费看视频| 欧美三级午夜理伦三级老人| 亚洲欧美日韩国产一区二区| 一本一道久久a久久综合蜜桃| 久久精品在这里| 国产网友自拍视频| 在线不卡中文字幕播放| 欧洲一级在线观看| 久久久久久国产| 永久免费观看精品视频| 欧美xxxx黑人又粗又长密月 | 久草中文综合在线| japanese中文字幕| 精品国产精品自拍| av免费观看在线| 亚洲偷欧美偷国内偷| 日本蜜桃在线观看视频| 国产成人av一区二区三区| 久久精品久久久| 亚洲一区二区在线视频观看| 26uuu另类欧美亚洲曰本| 精品在线视频免费| 欧美一卡二卡在线观看| 久久综合网导航| 琪琪亚洲精品午夜在线| 日韩电影不卡一区| 男人天堂av片| 国产成都精品91一区二区三| 女同久久另类69精品国产| 色妹子一区二区| 电影av在线| 国产va免费精品高清在线观看| 国产精品极品国产中出| 男人天堂新网址| 国产成人精品亚洲777人妖| 欧美三级黄色大片| 欧美日韩成人一区二区| 99中文字幕一区| 国产精品久久久久久久久久久久久| 欧美一区自拍| 自慰无码一区二区三区| 久久午夜羞羞影院免费观看| 久久中文字幕免费| 亚洲乱码国产乱码精品精| 午夜不卡影院| 久久综合狠狠综合久久综青草| 亚洲日产国产精品| yy1111111| 日韩欧中文字幕| 黄色视屏网站在线免费观看| 日本精品久久中文字幕佐佐木 | 国产精品免费一区二区三区四区 | а√天堂中文资源在线bt| 精品国产综合| 亚洲男女自偷自拍| 色哟哟精品观看| 欧美亚洲精品一区| 日本高清中文字幕在线| 日韩av电影在线免费播放| 日韩在线理论| 婷婷中文字幕在线观看| 亚洲乱码中文字幕综合| 精品久久人妻av中文字幕| 国内外成人免费激情在线视频网站| 日韩免费电影在线观看| 少妇性l交大片| 国产精品乱码一区二区三区软件 | 丰满少妇被猛烈进入高清播放| 2020日本不卡一区二区视频| 精品人妻一区二区色欲产成人| 一个人www欧美| 国产亚洲观看| 欧美在线一区视频| www.日韩精品|