精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产91精品看黄网站在线观看| 中文字幕一二三区| 成年人免费在线视频| 精品亚洲aⅴ乱码一区二区三区| 久久精品色欧美aⅴ一区二区| 青娱乐精品在线| 综合日韩av| **性色生活片久久毛片| 精品综合久久久| 亚洲在线视频播放| 亚洲精品国产日韩| 自拍亚洲一区欧美另类| 成人啪啪18免费游戏链接| 一区二区电影免费观看| 《视频一区视频二区| 蜜桃视频在线观看成人| www.激情五月.com| 日本系列欧美系列| 97香蕉超级碰碰久久免费软件 | 99久久综合国产精品二区| 亚洲精品视频观看| 日本不卡一区二区三区在线观看| 性生活三级视频| 蜜臀久久99精品久久久久宅男| 欧美精品久久久久久久久| 精品人体无码一区二区三区| 卡通动漫国产精品| 日韩精品中文字幕在线不卡尤物| 波多野结衣天堂| 激情aⅴ欧美一区二区欲海潮 | 久久精品免费av| 欧美成人激情| 亚洲欧洲第一视频| 亚洲自拍偷拍精品| 精品一区二区三区视频在线播放 | 国产巨乳在线观看| 日本午夜一区二区| 国产ts人妖一区二区三区| 国产在线综合网| 亚洲色图欧美| 久久视频精品在线| 永久av免费网站| 色狮一区二区三区四区视频| 亚洲欧洲一区二区三区在线观看| 又黄又色的网站| 欧美另类中文字幕| 这里只有精品视频在线观看| 亚洲综合婷婷久久| 免费在线成人激情电影| 色综合色狠狠天天综合色| 成人网站免费观看入口| 欧美大片黄色| 亚洲一区二区三区四区五区黄| 一二三四中文字幕| 91精品久久| 一区二区三区高清在线| 日本a在线天堂| 黄页网站在线| 亚洲一区二区美女| 秋霞无码一区二区| a级片免费在线观看| 亚洲国产欧美在线人成| 免费在线观看视频a| bbw在线视频| 婷婷夜色潮精品综合在线| 国产伦精品一区二区三区四区视频_| 特级毛片在线| 亚洲国产欧美在线| 成年人午夜视频在线观看| 爱情岛亚洲播放路线| 性做久久久久久久久| 免费国产a级片| 欧美日韩大片| 欧美精品v国产精品v日韩精品| 一级黄色大片儿| 成人免费在线电影网| 日韩成人性视频| 瑟瑟视频在线观看| 99久久亚洲精品| 欧美大片大片在线播放| 精品成人免费视频| 美女国产精品| 成人日韩在线电影| 欧美 日韩 国产 成人 在线| 91色.com| 伊人久久大香线蕉综合75| av免费在线网站| 欧美日韩国产精品一区二区三区四区| 成人黄色片视频| 激情综合婷婷| 国产午夜精品麻豆| 日本激情视频一区二区三区| 欧美天天在线| 国产成人精品电影久久久| 国产在成人精品线拍偷自揄拍| 成人一区二区三区视频在线观看| 欧美精品一区二区视频| 久久精品视频免费看| 午夜在线成人av| 91制片厂毛片| 国产成人一二| 色婷婷综合成人| 日韩精品一区二区不卡| 蜜桃一区二区三区在线观看| 国产精品大全| 午夜在线视频| 一本大道久久精品懂色aⅴ| 天堂在线中文在线| 亚州av日韩av| 欧美成人免费全部| 99超碰在线观看| 国产激情精品久久久第一区二区| 欧美在线播放一区| 福利写真视频网站在线| 欧美高清精品3d| aaaaa一级片| 欧美三级在线| 成人免费在线网址| 国产视频第一区| 午夜精品福利久久久| 亚洲高清在线不卡| 日韩av片子| 清纯唯美日韩制服另类| 日本久久一级片| 亚洲猫色日本管| 久久人人爽av| 欧美精选一区二区三区| 7m精品福利视频导航| www精品国产| 亚洲欧美日韩电影| 福利片一区二区三区| 国产videos久久| 欧美在线性视频| 亚洲aaa在线观看| 亚洲国产日韩a在线播放性色| 在线视频日韩欧美| 久久久久久免费视频| 国产精品久久视频| 91在线视频免费看| 色狠狠桃花综合| 国产在线观看无码免费视频| 999在线观看精品免费不卡网站| 51国偷自产一区二区三区的来源| 午夜视频在线看| 欧美系列在线观看| gv天堂gv无码男同在线观看| 日日骚欧美日韩| 日本一区免费观看| 3d欧美精品动漫xxxx无尽| 亚洲女同精品视频| 99精品人妻国产毛片| 久久亚洲一区二区三区四区| 国产肥臀一区二区福利视频| 欧美绝顶高潮抽搐喷水合集| 97视频在线观看视频免费视频 | 国产91av在线播放| 欧美极品aⅴ影院| 中文字幕第38页| 外国成人免费视频| 91精品在线播放| 色噜噜狠狠狠综合欧洲色8| 欧美变态口味重另类| 久久亚洲AV无码| 99麻豆久久久国产精品免费| 乱妇乱女熟妇熟女网站| 久久成人av| 国产精品一区二区电影| 国内精品久久久久久野外| 日韩欧美一级片| 免费日韩一级片| 久久女同互慰一区二区三区| av污在线观看| 欧美日韩1080p| 久久99导航| 亚洲精品555| 久久国产精品视频| 天天干,夜夜操| 欧美三区在线视频| 精品午夜福利视频| 2023国产一二三区日本精品2022| 免费看污黄网站| 一区二区蜜桃| 久久精品一二三区| 亚洲一区二区小说| 高清一区二区三区四区五区 | 久久久精品国产| 亚洲av无码乱码国产精品久久| 偷拍一区二区三区| 999精品久久久| 成人激情免费电影网址| 国产精品无码av无码| 亚洲国产精品91| 欧美性xxxx69| 少妇精品在线| 国产精品草莓在线免费观看| 国产鲁鲁视频在线观看特色| 亚洲精品国产拍免费91在线| 在线观看中文字幕av| 亚洲国产欧美日韩另类综合| 天天操天天摸天天舔| a美女胸又www黄视频久久| 日本人69视频| 香蕉亚洲视频| 污污污污污污www网站免费| 日韩最新在线| 91久久极品少妇xxxxⅹ软件| 成人午夜视屏| 欧美激情精品久久久久久变态| 极品美乳网红视频免费在线观看| 欧美一级高清片| 中文字幕 国产精品| 亚洲成人一区二区| 一级黄色片日本| 久久精品在线免费观看| 最新版天堂资源在线| 精品一区二区影视| 成人免费毛片播放| 最新亚洲视频| 91网站在线观看免费| 日韩在线欧美| 日日骚一区二区网站| 欧美成人午夜77777| 亚洲free嫩bbb| 日韩三区四区| 国产精品入口福利| 性感美女一区二区在线观看| 久久久久五月天| 四虎亚洲成人| 欧美成人精品三级在线观看| 日本综合在线| 日韩在线观看免费高清| 国产精品一区在线看| 亚洲毛片在线免费观看| 午夜在线观看视频18| 亚洲高清久久网| 亚洲欧美激情另类| 日韩视频一区二区三区| 国产巨乳在线观看| 91麻豆精品国产91久久久久久久久| 69av视频在线观看| 日本乱人伦一区| 天天干天天色综合| 色哟哟欧美精品| 久久夜靖品2区| 亚洲福利国产精品| 国产成人愉拍精品久久| 午夜久久福利影院| 国产成人亚洲精品自产在线| 婷婷开心激情综合| 日本午夜视频在线观看| 亚洲成人www| 国产精品久久久久久久久久久久久久久久久 | 精品精品欲导航| 亚洲精品久久久蜜桃动漫| 欧美草草影院在线视频| 亚洲第一第二区| 亚洲国产高潮在线观看| 五月婷婷免费视频| 亚洲男人av电影| 国产永久免费高清在线观看| 国产亚洲欧洲高清一区| 五月天婷婷在线视频| 日韩中文字幕免费看| 国产美女av在线| 久久久久久国产精品美女| av资源一区| 国产99久久久欧美黑人 | 欧美日韩情趣电影| 国产精品无码在线播放| 欧美mv日韩mv国产网站app| 日本精品一二区| 国产亚洲a∨片在线观看| 9色在线观看| 欧美激情视频免费观看| 蜜桃视频www网站在线观看| 国产经典一区二区| 老司机亚洲精品一区二区| 国产精选在线观看91| 经典一区二区| 好色先生视频污| 国产欧美短视频| 最近中文字幕一区二区| 国产成人精品三级麻豆| 狠狠人妻久久久久久综合蜜桃| 国产精品丝袜黑色高跟| 欧美日韩免费一区二区| 狠狠色香婷婷久久亚洲精品| 怡红院成永久免费人全部视频| 欧美一二三四区在线| 玖玖综合伊人| 欧美激情高清视频| 成人激情视屏| 国产免费一区二区三区| 成人一区二区| 国产精彩视频一区二区| 免费看欧美美女黄的网站| 亚洲日本久久久| 国产精品成人网| 亚洲精品男人天堂| 欧美一区二区三区四区视频 | 色婷婷综合久久久久| 97蜜桃久久| 91精品视频在线免费观看| 日韩a级大片| japanese在线播放| 青青草精品视频| 国产精品久久无码| 亚洲精品国产a| 中文字幕在线观看你懂的| 亚洲福利在线播放| 久草资源在线| 国产精品久久久久久久久免费看| 激情小说一区| 国产美女视频免费| 爽好久久久欧美精品| 97人妻精品一区二区三区免费| 国产精品美女久久久久久久久久久| 国产极品美女高潮无套嗷嗷叫酒店| 在线亚洲一区观看| 四虎成人免费在线| 久久久久久久久久国产精品| 精品乱码一区二区三区四区| 蜜桃网站成人| 中日韩男男gay无套| 激情小说欧美色图| 日韩美女视频一区二区 | 欧美大片黄色| 114国产精品久久免费观看| 精品久久一区| 国产乱子夫妻xx黑人xyx真爽 | 国产精品一区二区三区精品| 亚洲成人二区| 第四色婷婷基地| 久久人人超碰精品| 中文字幕在线观看视频网站| 欧美精品一区二区三区一线天视频 | 91日韩一区二区三区| 亚洲精品午夜久久久久久久| 欧美一级高清片| 18网站在线观看| 92国产精品久久久久首页 | 国产精品午夜一区二区| 亚洲欧美日韩久久久久久| 精品极品在线| 久久精彩视频| 亚洲免费在线| 白白色免费视频| 欧美在线观看视频一区二区三区| 国产三级在线看| 国产精品视频免费在线观看| 欧洲杯半决赛直播| 国内外成人免费在线视频| 国产精品美女久久久久久久网站| 亚洲一区二区色| 日韩亚洲综合在线| 麻豆精品在线| 成人区一区二区| 不卡的av在线播放| 日韩黄色在线播放| 国产一区二区动漫| 色综合视频一区二区三区日韩| 一区一区视频| 国产不卡视频在线观看| 日本少妇毛茸茸高潮| 亚洲美女黄色片| 国产美女久久| 日本大胆人体视频| 不卡的av网站| 无码一区二区三区在线观看| 在线精品高清中文字幕| 伊人久久一区| 欧美国产日韩激情| 91麻豆swag| 中文字幕在线一| 欧美巨大黑人极品精男| 国产精品115| 国产一区视频免费观看| 国产精品白丝在线| 丁香花免费高清完整在线播放| 国产91精品高潮白浆喷水| av永久不卡| 蜜桃视频无码区在线观看| 欧美日韩国产在线| 在线观看av黄网站永久| 成人动漫视频在线观看免费| 久久国产88| 成人自拍小视频| 亚洲国产精品va在线观看黑人| 高清成人在线| 精品人妻大屁股白浆无码| 久久久久久99精品| 国产免费福利视频| 国产69精品久久久久久| 仙踪林久久久久久久999| 五月天激情小说| 欧美老女人在线| 亚洲十八**毛片| a级黄色片免费| 国产日韩欧美电影| 蜜桃视频久久一区免费观看入口|