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

MapReduce連接:重分區(qū)連接

數(shù)據(jù)庫(kù)
連接是關(guān)系運(yùn)算,可以用于合并關(guān)系(relation)。對(duì)于數(shù)據(jù)庫(kù)中的表連接操作,可能已經(jīng)廣為人知了。在MapReduce中,連接可以用于合并兩個(gè)或多個(gè)數(shù)據(jù)集。例如,用戶基本信息和用戶活動(dòng)詳情信息。用戶基本信息來(lái)自于OLTP數(shù)據(jù)庫(kù)。用戶活動(dòng)詳情信息來(lái)自于日志文件。

 MapReduce的連接操作可以用于以下場(chǎng)景:

  • 用戶的人口統(tǒng)計(jì)信息的聚合操作(例如:青少年和中年人的習(xí)慣差異)。

  • 當(dāng)用戶超過(guò)一定時(shí)間沒(méi)有使用網(wǎng)站后,發(fā)郵件提醒他們。(這個(gè)一定時(shí)間的閾值是用戶自己預(yù)定義的)

  • 分析用戶的瀏覽習(xí)慣。讓系統(tǒng)可以基于這個(gè)分析提示用戶有哪些網(wǎng)站特性還沒(méi)有使用到。進(jìn)而形成一個(gè)反饋循環(huán)。

所有這些場(chǎng)景都要求將多個(gè)數(shù)據(jù)集連接起來(lái)。

最常用的兩個(gè)連接類型是內(nèi)連接(inner join)和外連接(outer join)。如下圖所示,內(nèi)連接比較兩個(gè)關(guān)系中所有的元組,判斷是否滿足連接條件,然后生成一個(gè)滿足連接條件的結(jié)果集。與內(nèi)連接相反的是,外連接并不需要兩個(gè)關(guān)系的元組都滿足連接條件。在連接條件不滿足的時(shí)候,外連接可以將其中一方的數(shù)據(jù)保留在結(jié)果集中。

為了實(shí)現(xiàn)內(nèi)連接和外連接,MapReduce中有三種連接策略,如下所示。這三種連接策略有的在map階段,有的在reduce階段。它們都針對(duì)MapReduce的排序-合并(sort-merge)的架構(gòu)進(jìn)行了優(yōu)化。

  1. 重分區(qū)連接(Repartition join)—— reduce端連接。使用場(chǎng)景:連接兩個(gè)或多個(gè)大型數(shù)據(jù)集。

  2. 復(fù)制連接(Replication join)—— map端連接。使用場(chǎng)景:待連接的數(shù)據(jù)集中有一個(gè)數(shù)據(jù)集足夠小到可以完全放在緩存中。

  3. 半連接(Semi-join)—— 另一個(gè)map端連接。使用場(chǎng)景:待連接的數(shù)據(jù)集中有一個(gè)數(shù)據(jù)集非常大,但同時(shí)這個(gè)數(shù)據(jù)集可以被過(guò)濾成小到可以放在緩存中。

在介紹完這些連接策略之后,還會(huì)介紹另一個(gè)策略:決策樹??梢愿鶕?jù)實(shí)際情況選擇最優(yōu)策略。

4.1.1 重分區(qū)連接(Repartition join)

重分區(qū)連接是reduce端連接。它利用MapReduce的排序-合并機(jī)制來(lái)分組數(shù)據(jù)。它只使用一個(gè)單獨(dú)的MapReduce任務(wù),并支持多路連接(N-way join)。多路指的是多個(gè)數(shù)據(jù)集。

Map階段負(fù)責(zé)從多個(gè)數(shù)據(jù)集中讀取數(shù)據(jù),決定每個(gè)數(shù)據(jù)的連接值,將連接值作為輸出鍵(output key)。輸出值(output value)則包含將在reduce階段被合并的值。

Reduce階段,一個(gè)reduce接收map函數(shù)傳來(lái)的每一個(gè)輸出鍵的所有輸出值,并將數(shù)據(jù)分為多個(gè)分區(qū)。在此之后,reduce對(duì)所有的分區(qū)進(jìn)行笛卡爾積(Cartersian product)連接運(yùn)算,并生成全部的結(jié)果集。

以上MapReduce過(guò)程如圖4.2所示:

注:過(guò)濾(filtering)和投影(projection)

在MapReduce重分區(qū)連接中,最好能夠減少map階段傳輸?shù)絩educe階段的數(shù)據(jù)量。因?yàn)橥ㄟ^(guò)網(wǎng)絡(luò)在這兩個(gè)階段中排序和傳輸數(shù)據(jù)會(huì)產(chǎn)生很高的成本。如果不能避免reduce端的工作,那么一個(gè)最佳實(shí)踐就是盡可能在map階段多過(guò)濾數(shù)據(jù)和投影。過(guò)濾指的是將map極端的輸入數(shù)據(jù)中不需要的部分丟棄。投影是關(guān)系代數(shù)的概念。投影用于減少發(fā)送給reduce的字段。例如:在分析用戶數(shù)據(jù)的時(shí)候,如果只關(guān)注用戶的年齡,那么在map任務(wù)中應(yīng)該只投影(或輸出)年齡字段,不考慮用戶的其他的字段。

技術(shù)19:優(yōu)化重分區(qū)連接

《Hadoop in Action》給出了一個(gè)例子,說(shuō)明如何使用Hadoop的社區(qū)包(contrib package)org.apache.hadoop.contrib.utils.join實(shí)現(xiàn)重分區(qū)連接。這個(gè)貢獻(xiàn)包打包了所有的處理細(xì)節(jié),僅僅需要實(shí)現(xiàn)一個(gè)非常簡(jiǎn)單的方法。

然而,這個(gè)社區(qū)包對(duì)重分區(qū)的實(shí)現(xiàn)方法的空間效率低下。它需要將待連接的所有輸出值都讀取到內(nèi)存中,然后進(jìn)行多路連接(multiway join)。實(shí)際上,如果僅僅將小數(shù)據(jù)集讀取到內(nèi)存中,然后用小數(shù)據(jù)集遍歷大數(shù)據(jù)集來(lái)進(jìn)行連接,這樣將更加高效。

問(wèn)題

需要在MapReduce中進(jìn)行重分區(qū)連接,但是不希望在reduce階段將所有的數(shù)據(jù)都放到緩存中。

解決方案

這個(gè)技術(shù)運(yùn)用了優(yōu)化后的重分區(qū)框架。它僅僅將一個(gè)待連接的數(shù)據(jù)集放在緩存中,減少了reduce需要放在緩存中的數(shù)據(jù)。

討論

附錄D中介紹了優(yōu)化后的重分區(qū)框架的實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)是根據(jù)org.apache.hadoop.contrib.utils.join社區(qū)包進(jìn)行建模。這個(gè)優(yōu)化后的框架僅僅緩存兩個(gè)數(shù)據(jù)集中比較小的那一個(gè),以減少內(nèi)存消耗。圖4.3是優(yōu)化后的重分區(qū)連接的流程圖:

圖4.4是實(shí)現(xiàn)的類圖。類圖中包含兩個(gè)部分,一個(gè)通用框架和一些類的實(shí)現(xiàn)樣例。

使用這個(gè)連接框架需要實(shí)現(xiàn)抽象類OptimizedDataJoinMapperBase和OptimizedDataJoinReducerBase。

例如,需要連接用戶詳情數(shù)據(jù)和用戶活動(dòng)日志。第一步,判斷兩個(gè)數(shù)據(jù)集中那一個(gè)比較小。對(duì)于一般的網(wǎng)站來(lái)說(shuō),用戶詳情數(shù)據(jù)會(huì)比較小,用戶活動(dòng)日志會(huì)比較大。

在如下示例中,用戶數(shù)據(jù)中有用戶姓名,年齡和所在州

  1. $ cat test-data/ch4/users.txt 
  2. anne 22 NY 
  3. joe 39 CO 
  4. alison 35 NY 
  5. mike 69 VA 
  6. marie 27 OR 
  7. jim 21 OR 
  8. bob 71 CA 
  9. mary 53 NY 
  10. dave 36 VA 
  11. dude 50 CA 

用戶活動(dòng)日志中有用戶姓名,進(jìn)行的動(dòng)作,來(lái)源IP。這個(gè)文件一般都要比用戶數(shù)據(jù)要大得多。

  1. $ cat test-data/ch4/user-logs.txt 
  2. jim logout 93.24.237.12 
  3. mike new_tweet 87.124.79.252 
  4. bob new_tweet 58.133.120.100 
  5. mike logout 55.237.104.36 
  6. jim new_tweet 93.24.237.12 
  7. marie view_user 122.158.130.90 

首先,必須實(shí)現(xiàn)抽象類OptimizedDataJoinMapperBase。這個(gè)將在map端被調(diào)用。這個(gè)類將創(chuàng)建map的輸出鍵和輸出值。同時(shí),它還將提示整個(gè)框架,當(dāng)前處理的文件是不是比較小的那個(gè)。

  1. public class SampleMap extends OptimizedDataJoinMapperBase { 
  2.  
  3.   private boolean smaller; 
  4.  
  5.   @Override 
  6.   protected Text generateInputTag(String inputFile) { 
  7.     // tag the row with input file name (data source) 
  8.     smaller = inputFile.contains("users.txt"); 
  9.     return new Text(inputFile); 
  10.   } 
  11.  
  12.   @Override 
  13.   protected String genGroupKey(Object key, OutputValue output) { 
  14.     return key.toString(); 
  15.   } 
  16.  
  17.   @Override 
  18.   protected boolean isInputSmaller(String inputFile) { 
  19.     return smaller; 
  20.   } 
  21.  
  22.   @Override 
  23.   protected OutputValue genMapOutputValue(Object o) { 
  24.     return new TextTaggedOutputValue((Text) o); 
  25.   } 

下一步,你需要實(shí)現(xiàn)抽象類 OptimizedDataJoinReducerBase。它將在reduce端被調(diào)用。在這個(gè)類中,將從map端傳入不同數(shù)據(jù)集的輸出鍵和輸出值,然后返回reduce端的輸出數(shù)組。

  1. public class SampleReduce extends OptimizedDataJoinReducerBase { 
  2.  
  3.   private TextTaggedOutputValue output = new TextTaggedOutputValue(); 
  4.   private Text textOutput = new Text(); 
  5.  
  6.   @Override 
  7.   protected OutputValue combine(String key, 
  8.                                 OutputValue smallValue, 
  9.                                 OutputValue largeValue) { 
  10.     if(smallValue == null || largeValue == null) { 
  11.       return null; 
  12.     } 
  13.     Object[] values = { 
  14.         smallValue.getData(), largeValue.getData() 
  15.     }; 
  16.     textOutput.set(StringUtils.join(values, "\t")); 
  17.     output.setData(textOutput); 
  18.     return output; 
  19.   } 

最后,任務(wù)的主代碼(driver code)需要指明InputFormat類,并設(shè)置次排序(Secondary sort)。

  1. job.setInputFormat(KeyValueTextInputFormat.class); 
  2.  
  3.     job.setMapOutputKeyClass(CompositeKey.class); 
  4.     job.setMapOutputValueClass(TextTaggedOutputValue.class); 
  5.     job.setOutputKeyClass(Text.class); 
  6.     job.setOutputValueClass(Text.class); 
  7.  
  8.     job.setPartitionerClass(CompositeKeyPartitioner.class); 
  9.     job.setOutputKeyComparatorClass(CompositeKeyComparator.class); 
  10.     job.setOutputValueGroupingComparator(CompositeKeyOnlyComparator.class); 

現(xiàn)在連接的準(zhǔn)備工作就做完了,可以開始運(yùn)行連接:

  1. $ hadoop fs -put test-data/ch4/users.txt users.txt 
  2. $ hadoop fs -put test-data/ch4/user-logs.txt user-logs.txt 
  3. $ bin/run.sh com.manning.hip.ch4.joins.improved.SampleMain users.txt,user-logs.txt output 
  4. $ hadoop fs -cat output/part* 
  5. bob 71 CA new_tweet 58.133.120.100 
  6. jim 21 OR logout 93.24.237.12 
  7. jim 21 OR new_tweet 93.24.237.12 
  8. jim 21 OR login 198.184.237.49 
  9. marie 27 OR login 58.133.120.100 
  10. marie 27 OR view_user 122.158.130.90 
  11. mike 69 VA new_tweet 87.124.79.252 
  12. mike 69 VA logout 55.237.104.36 

如果和連接的源文件相對(duì)比,可以看到因?yàn)閷?shí)現(xiàn)了一個(gè)內(nèi)連接,輸出中不包括用戶anne,alison等不存在于日志文件中的記錄。

小結(jié):

這個(gè)連接的實(shí)現(xiàn)通過(guò)只緩存比較小的數(shù)據(jù)集來(lái)提高來(lái)Hadoop社區(qū)包的效率。但是,當(dāng)數(shù)據(jù)從map階段傳輸?shù)絩educe階段的時(shí)候,仍然產(chǎn)生了很高的網(wǎng)絡(luò)成本。

此外,Hadoop社區(qū)包支持多路連接,這里的實(shí)現(xiàn)只支持二路連接。

如果要更多地減少reduce端連接的內(nèi)存足跡(memory footprint),一個(gè)簡(jiǎn)單的機(jī)制是在map函數(shù)中更多地進(jìn)行投影操作。投影減少了map階段的輸出中的字段。例如:在分析用戶數(shù)據(jù)的時(shí)候,如果只關(guān)注用戶的年齡,那么在map任務(wù)中應(yīng)該只投影(或輸出)年齡字段,不考慮用戶的其他的字段。這樣就減少了map和reduce之間的網(wǎng)絡(luò)負(fù)擔(dān),也減少了reduce在連接時(shí)的內(nèi)存消耗。

和原始的社區(qū)包一樣,這里的重分區(qū)的實(shí)現(xiàn)也支持過(guò)濾和投影。通過(guò)允許genMapOutputValue方法返回空值,就可以支持過(guò)濾。通過(guò)在genMapOutputValue方法中定義輸出值的內(nèi)容,就可以支持投影。

如果你既想輸出所有的數(shù)據(jù)到reduce,又想避免排序的損耗,就需要考慮另外兩種連接策略,復(fù)制連接和半連接。

附錄D 優(yōu)化后的MapReduce連接框架

在這個(gè)附錄,我們將討論在第4張中使用的兩個(gè)連接框架。第一個(gè)是重連接框架。它減少了org.apache.hadoop.contrib.utils.join包的實(shí)現(xiàn)的Hadoop連接的內(nèi)存足跡。第二個(gè)是復(fù)制連接框架。它可以將較小的數(shù)據(jù)集放在緩存中。

D.1 優(yōu)化后的重分區(qū)框架

Hadoop社區(qū)連接包需要將每個(gè)鍵的所有值都讀取到內(nèi)存中。如何才能在reduce端的連接減少內(nèi)存開銷呢?本文提供的優(yōu)化中,只需要緩存較小的數(shù)據(jù)集,然后在連接中遍歷較大數(shù)據(jù)集中的數(shù)據(jù)。這個(gè)方法中還包括針對(duì)map的輸出數(shù)據(jù)的次排序,那么reducer先接收到較小的數(shù)據(jù)集,然后接收到較大的數(shù)據(jù)集。圖D.1是這個(gè)過(guò)程的流程圖。

圖D.2是實(shí)現(xiàn)的類圖。類圖中包含兩個(gè)部分,一個(gè)通用框架和一些類的實(shí)現(xiàn)樣例。

連接框架

我們以和Hadoop社區(qū)連接包的近似的風(fēng)格編寫連接的代碼。目標(biāo)是創(chuàng)建可以處理任意數(shù)據(jù)集的通用重分區(qū)機(jī)制。為簡(jiǎn)潔起見,我們重點(diǎn)說(shuō)明主要部分。

首先是OptimizedDataJoinMapperBase類。這個(gè)類的作用是辨認(rèn)出較小的數(shù)據(jù)集,并生成輸出鍵和輸出值。Configure方法在mapper創(chuàng)建時(shí)被調(diào)用。Configure方法的作用之一是標(biāo)識(shí)每一個(gè)數(shù)據(jù)集,讓reducer可以區(qū)分?jǐn)?shù)據(jù)的源數(shù)據(jù)集。另一個(gè)作用是辨認(rèn)當(dāng)前的輸入數(shù)據(jù)是否是較小的數(shù)據(jù)集。

  1. protected abstract Text generateInputTag(String inputFile); 
  2.  
  3. protected abstract boolean isInputSmaller(String inputFile); 
  4.  
  5. public void configure(JobConf job) { 
  6.  
  7.     this.inputFile = job.get("map.input.file"); 
  8.     this.inputTag = generateInputTag(this.inputFile); 
  9.      
  10.     if(isInputSmaller(this.inputFile)) { 
  11.         smaller = new BooleanWritable(true); 
  12.         outputKey.setOrder(0); 
  13.     } else { 
  14.         smaller = new BooleanWritable(false); 
  15.         outputKey.setOrder(1); 
  16.     } 

Map方法首先調(diào)用自定義的方法 (generateTaggedMapOutput) 來(lái)生成OutputValue對(duì)象。這個(gè)對(duì)象包含了在連接中需要使用的值(也可能包含了最終輸出的值),和一個(gè)標(biāo)識(shí)較大或較小數(shù)據(jù)集的布爾值。如果map方法可以調(diào)用自定義的方法 (generateGroupKey) 來(lái)得到可以在連接中使用的鍵,那么這個(gè)鍵就作為map的輸出鍵。

  1. protected abstract OptimizedTaggedMapOutput generateTaggedMapOutput(Object value); 
  2.  
  3. protected abstract String generateGroupKey(Object key, OptimizedTaggedMapOutput aRecord); 
  4.  
  5. public void map(Object key, Object value, OutputCollector output, Reporter reporter) 
  6.     throws IOException { 
  7.      
  8.     OptimizedTaggedMapOutput aRecord = generateTaggedMapOutput(value); 
  9.      
  10.     if (aRecord == null) { 
  11.         return
  12.     } 
  13.      
  14.     aRecord.setSmaller(smaller); 
  15.     String groupKey = generateGroupKey(aRecord); 
  16.      
  17.     if (groupKey == null) { 
  18.         return
  19.     } 
  20.      
  21.     outputKey.setKey(groupKey); 
  22.     output.collect(outputKey, aRecord); 

圖D.3 說(shuō)明了map輸出的組合鍵(composite 可以)和組合值。次排序?qū)?huì)根據(jù)連接鍵(join key)進(jìn)行分區(qū),并用整個(gè)組合鍵來(lái)進(jìn)行排序。組合鍵包括一個(gè)標(biāo)識(shí)源數(shù)據(jù)集(較大或較?。┑恼沃?,因此可以根據(jù)這個(gè)整形值來(lái)保證較小源數(shù)據(jù)集的值先于較大源數(shù)據(jù)的值被reduce接收。

下一步是深入reduce。此前已經(jīng)可以保證較小源數(shù)據(jù)集的值將會(huì)先于較大源數(shù)據(jù)集的值被接收。這里就可以將所有的較小源數(shù)據(jù)集的值放到緩存中。在開始接收較大源數(shù)據(jù)集的值的時(shí)候,就開始和緩存中的值做連接操作。

  1. public void reduce(Object key, Iterator values, OutputCollector output, Reporter reporter) 
  2.     throws IOException {  
  3.  
  4.     CompositeKey k = (CompositeKey) key; 
  5.     List<OptimizedTaggedMapOutput> smaller = new ArrayList<OptimizedTaggedMapOutput>(); 
  6.      
  7.     while (values.hasNext()) { 
  8.         Object value = values.next(); 
  9.         OptimizedTaggedMapOutput cloned =((OptimizedTaggedMapOutput) value).clone(job); 
  10.          
  11.         if (cloned.isSmaller().get()) { 
  12.             smaller.add(cloned); 
  13.         } else { 
  14.             joinAndCollect(k, smaller, cloned, output, reporter); 
  15.         } 
  16.     } 

方法joinAndCollect包含了兩個(gè)數(shù)據(jù)集的值,并輸出它們。

 

  1. protected abstract OptimizedTaggedMapOutput combine( 
  2.                         String key, 
  3.                         OptimizedTaggedMapOutput value1, 
  4.                         OptimizedTaggedMapOutput value2); 
  5.                          
  6. private void joinAndCollect(CompositeKey key, 
  7.                             List<OptimizedTaggedMapOutput> smaller, 
  8.                             OptimizedTaggedMapOutput value, 
  9.                             OutputCollector output, 
  10.                             Reporter reporter) 
  11.     throws IOException { 
  12.      
  13.     if (smaller.size() < 1) { 
  14.         OptimizedTaggedMapOutput combined = combine(key.getKey(), null, value); 
  15.         collect(key, combined, output, reporter); 
  16.     } else { 
  17.         for (OptimizedTaggedMapOutput small : smaller) { 
  18.             OptimizedTaggedMapOutput combined = combine(key.getKey(), small, value); 
  19.             collect(key, combined, output, reporter); 
  20.         } 
  21.     } 

這些就是這個(gè)框架的主要內(nèi)容。

原文鏈接:http://www.cnblogs.com/datacloud/p/3578509.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2014-03-20 09:49:51

MapReduce

2015-08-21 13:50:49

Oracle連接

2009-07-22 10:53:42

MySQL左連接

2010-05-10 15:48:37

Unix連接

2021-03-24 09:06:01

MySQL長(zhǎng)連接短連接

2011-03-28 14:04:10

SQL左連接右連接

2018-06-06 11:01:25

HTTP長(zhǎng)連接短連接

2011-06-01 13:54:10

MySQL

2022-01-11 08:46:56

Oracle 在線重定義數(shù)據(jù)庫(kù)

2015-04-23 18:46:38

TCPTCP協(xié)議

2010-11-11 13:51:36

SQL Server內(nèi)

2010-01-04 09:51:52

ADO連接對(duì)象

2010-11-08 15:47:01

SQL Server外

2014-01-02 14:04:39

PostgreSQLPerl

2014-01-02 15:41:24

PostgreSQLPHP

2014-01-02 13:22:01

PythonPostgreSQL

2019-09-16 09:29:01

TCP全連接隊(duì)列半連接隊(duì)列

2010-06-07 15:24:34

Java連接MYSQL

2023-01-31 18:09:12

物聯(lián)網(wǎng)移動(dòng)物聯(lián)網(wǎng)

2010-08-24 09:29:37

內(nèi)連接全連接
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人黄色777网| 欧美在线播放| 欧美高清精品3d| 99久久99久久精品| 亚洲人午夜射精精品日韩| 日韩精品一级中文字幕精品视频免费观看| 在线视频欧美性高潮| xxxx视频在线观看| 蜜桃成人精品| 亚洲午夜av在线| 亚洲 日韩 国产第一区| 亚洲精品福利网站| 麻豆精品一区二区三区| 午夜精品久久久久久久99黑人| 日本一道本视频| 国产三级精品三级在线观看国产| 欧美色倩网站大全免费| 福利视频一区二区三区四区| 91社区在线| 成人精品gif动图一区| 91精品啪aⅴ在线观看国产| 日韩毛片在线播放| 一区二区三区四区电影| 一区二区在线视频| av网站有哪些| 亚洲图色一区二区三区| 欧美日韩精品福利| 可以在线看的黄色网址| 成人福利电影| 亚洲免费av观看| 亚洲精品一品区二品区三品区 | 日韩在线视频免费看| 欧美黄色网视频| 日韩免费看网站| 日韩在线一区视频| 久久久国产精品网站| 色狠狠综合天天综合综合| 国产无限制自拍| 日本高清在线观看视频| 亚洲人成网站色在线观看| 性欧美videosex高清少妇| 免费一级在线观看播放网址| 成人app下载| 国产精品久久7| 亚洲春色一区二区三区| 国内不卡的二区三区中文字幕| 国产精品吹潮在线观看| 欧美一区二区三区网站| 香蕉久久夜色精品国产| 成人久久久久| 亚洲成人动漫精品| 久久久无码中文字幕久...| 日本最新在线视频| 国产精品美女一区二区三区| 亚洲日本无吗高清不卡| av在线1区2区| 国产精品网站一区| 亚洲高清123| 91porn在线观看| 国产精品高潮呻吟久久| 影音欧美亚洲| 黄色在线免费看| 亚洲伦理在线精品| 今天免费高清在线观看国语| 成人片在线看| 亚洲一区二区三区四区五区中文 | 国产欧美久久一区二区| 亚洲性生活大片| 国产自产高清不卡| av一区二区三区四区电影| 蜜臀av午夜精品| 久久这里只精品最新地址| 日韩av不卡在线播放| √新版天堂资源在线资源| 一区二区中文视频| www.男人天堂网| 日产福利视频在线观看| 在线欧美日韩国产| www.超碰97.com| 亚洲性视频在线| 亚洲男人天堂古典| 国产馆在线观看| 欧美久久一区| 日本精品久久中文字幕佐佐木| 成人黄色三级视频| 国产在线精品一区二区| 好看的日韩精品视频在线| 国产人成在线视频| 亚洲女同ⅹxx女同tv| 中文字幕无码精品亚洲35| 伊人久久视频| 91精品在线免费| 最近日本中文字幕| 欧美3p在线观看| 97久久精品国产| 在线观看免费高清视频| 成人精品小蝌蚪| 午夜一区二区三视频在线观看| 国产网站在线免费观看| 欧美日韩精品在线观看| 天天操天天干天天做| 99久热这里只有精品视频免费观看| 日韩国产高清视频在线| 婷婷社区五月天| 性8sex亚洲区入口| 69堂成人精品视频免费| 国产女人在线观看| 台湾佬中文娱乐网欧美电影| 国产精品污www在线观看| 国产中文字幕乱人伦在线观看| gogo亚洲高清大胆美女人体| 日韩一级大片在线观看| 国产jk精品白丝av在线观看| 午夜精品影院| 国产区精品在线观看| 日韩一区二区三区在线观看视频| 国产精品三级av| 日本www在线播放| 日韩免费成人| 日韩在线视频免费观看高清中文| 中文字幕在线观看视频网站| 国产福利一区在线| 在线视频福利一区| abab456成人免费网址| 日韩国产高清视频在线| 精品在线视频免费观看| 国产综合色视频| 亚洲啪啪av| 欧美日韩国产v| 亚洲精品wwww| 日本少妇做爰全过程毛片| 国产一区二三区好的| 亚洲午夜在线观看| 高清一区二区| 久久精品动漫| 成人欧美一区二区三区视频xxx | 欧美r级在线观看| 大胸美女被爆操| 亚洲专区一区| 国产乱码一区| 欧美xxx黑人xxx水蜜桃| 91精品国产综合久久久久久| 久久久久久久久福利| 老妇喷水一区二区三区| 久久久久久欧美精品色一二三四 | 欧洲亚洲免费在线| 天天摸天天干天天操| 亚洲第一精品在线| 黄色av电影网站| 狠狠入ady亚洲精品经典电影| 91人人爽人人爽人人精88v| 在线观看av黄网站永久| 欧美日韩亚洲国产综合| 波多野结衣欲乱| 久久精品国产第一区二区三区| 日韩资源av在线| 怡红院成人在线| 一区二区av在线| 中文字幕91爱爱| 国产精品看片你懂得| www.超碰97.com| 综合激情一区| 国产精品二区三区四区| aa国产成人| 亚洲日韩欧美视频一区| 久久久久亚洲视频| 国产精品国产自产拍高清av王其| 日韩av加勒比| 欧美午夜视频| 国产精品久久久久久久久久久久冷 | 成人av免费在线| 国产婷婷一区二区三区| 老牛精品亚洲成av人片| 日本三级韩国三级久久| a中文在线播放| 日韩一区二区三区观看| 国产精品第108页| 久久久一区二区三区捆绑**| 亚洲 欧美 日韩系列| 在线免费观看日本欧美爱情大片| caoporn国产精品免费公开| 韩国日本一区| 国产亚洲精品美女久久久| 又污又黄的网站| 艳妇臀荡乳欲伦亚洲一区| 久久久久久久久免费看无码| 久久一二三区| 亚洲免费视频播放| 秋霞蜜臀av久久电影网免费| 国产精品嫩草影院久久久| caoporn免费在线| 亚洲精选中文字幕| 一级黄色短视频| 亚洲成人7777| 91av手机在线| 9i在线看片成人免费| 欧美特级aaa| 99国产精品久久久久久久成人热| 色噜噜一区二区| 亚洲精品18| 国产精品视频免费在线| missav|免费高清av在线看| 正在播放亚洲1区| 人妻夜夜爽天天爽| 欧美喷潮久久久xxxxx| 日韩av在线播放观看| 1024成人网| 色婷婷av777| 高清国产一区二区| 一本大道av一区二区在线播放| 天天色天天综合网| 亚洲在线网站| 日韩欧美一级在线| 波多野结衣的一区二区三区 | 国产精品久久久久久久久图文区 | 国产精品理论在线观看| 男人的天堂影院| 久久99精品国产| 成年人在线看片| 亚洲精品激情| 午夜探花在线观看| 国产亚洲第一伦理第一区| 成人黄色片视频网站| 日韩一区二区三区四区五区| 国产成一区二区| 国产中文在线播放| 欧美激情a∨在线视频播放| 日韩黄色影院| 伊人久久免费视频| 日本韩国精品一区二区| 亚洲白拍色综合图区| 国产免费久久久| 欧美精选午夜久久久乱码6080| www.国产高清| 亚洲国产婷婷综合在线精品| 欧美色视频一区二区三区在线观看| 久久嫩草精品久久久精品一| 88av在线播放| 不卡电影免费在线播放一区| 国产乱国产乱老熟300部视频| 国内精品视频一区二区三区八戒| 三上悠亚av一区二区三区| 免费日韩精品中文字幕视频在线| av之家在线观看| 国户精品久久久久久久久久久不卡| 法国空姐在线观看免费| 天天射综合网视频| 欧美日韩一区二区三区电影| 亚洲精品国产偷自在线观看| 大桥未久一区二区三区| 欧美xxx在线观看| 黄色一级片国产| 国产精品大片| 日韩国产成人无码av毛片| 欧美1区2区| 野外做受又硬又粗又大视频√| 亚洲天堂成人| 国产一区二区视频播放| 国产欧美在线| 国产性xxxx18免费观看视频| 亚洲永久免费| 日本男人操女人| 蜜桃91丨九色丨蝌蚪91桃色| 91热视频在线观看| 国产风韵犹存在线视精品| 大尺度在线观看| 97久久精品人人澡人人爽| 波多野结衣av在线免费观看| 国产视频视频一区| 三级黄色录像视频| 一区二区三区四区国产精品| 国产大片中文字幕| 色哟哟精品一区| 一级全黄少妇性色生活片| 欧美一区二区免费观在线| 欧美一级淫片aaaaaa| 亚洲欧美国内爽妇网| 自拍视频在线| 欧美激情伊人电影| 黄色亚洲网站| 成人免费视频a| 国产伦精品一区二区三区在线播放| 欧美高清性xxxxhd| 综合视频在线| 99999精品视频| 国产一区视频在线看| 亚洲av无码一区二区三区网址 | xxxxxx国产| 欧美影院一区二区| 亚洲av无码乱码国产精品久久| 精品中文字幕久久久久久| 欧美精品电影| 91成人在线观看国产| 亚洲欧美一级| 精品视频第一区| 亚洲欧美综合久久久| 干日本少妇首页| 国产成人亚洲综合色影视| 最近中文字幕在线mv视频在线| 亚洲码国产岛国毛片在线| 人妻丰满熟妇av无码区| 日韩午夜在线观看视频| 国产美女视频一区二区三区| 欧美激情视频一区| 亚洲一区有码| 免费在线观看91| 国产一区亚洲| 57pao国产成永久免费视频| 久久午夜电影网| 国产成人精品av久久| 欧美日韩不卡一区二区| 你懂的在线视频| 久久久噜久噜久久综合| 亚洲免费资源| 亚洲激情电影在线| 韩国主播福利视频一区二区三区| 精品久久久久久中文字幕| 在线观看色网站| 日韩电影中文字幕av| 色噜噜狠狠狠综合欧洲色8| 国产精品专区一| 久草成人资源| 国产黄视频在线| 成人污视频在线观看| 欧美日韩午夜视频| 欧美日韩一级黄| 国产69精品久久app免费版| 97人人做人人爱| 精品久久ai电影| 精品人妻少妇一区二区| 国产成人精品综合在线观看| 国产美女网站视频| 欧美天天综合网| 精品福利视频导航大全| 91成人性视频| 蜜桃成人av| 成人在线免费在线观看| 99久久久久免费精品国产| 久久久久噜噜噜亚洲熟女综合| 这里是久久伊人| 国产日产一区二区| 91久久久国产精品| 亚洲五月综合| 三级av免费看| 亚洲欧美区自拍先锋| 国产美女免费视频| 久久在线视频在线| 午夜视频在线观看精品中文| 性做爰过程免费播放| 国产精品99久| 国产一二三四在线| 日韩av在线直播| www.成人爱| 日本在线观看不卡| 精品在线观看免费| 亚洲色婷婷一区二区三区| 日韩欧美一级片| free性护士videos欧美| 精品视频一区二区三区四区| 免费看亚洲片| 99国产精品无码| 欧美一区二区三区视频| 国产偷倩在线播放| 久久亚洲综合网| 日韩va亚洲va欧美va久久| 四虎影视1304t| 日韩欧美一区在线| 小视频免费在线观看| 日韩av电影免费在线观看| 久久成人久久爱| 国产在线视频卡一卡二| 日韩精品视频在线播放| 成人久久网站| 国产精品一二三在线观看| 99久久99久久综合| 亚洲成人av网址| 欧美激情精品久久久久久变态 | 免费成人性网站| 久草视频免费在线| 亚洲全黄一级网站| 亚洲日韩中文字幕一区| 国产无限制自拍| 国产精品色婷婷| 神马一区二区三区| 国产精品对白刺激| 午夜精品偷拍| 青娱乐国产视频| 日韩视频免费观看高清完整版| 日韩av一卡| 黄色污污在线观看| 久久嫩草精品久久久久| www.成人免费视频| 国产成人一区二区三区电影| 欧美成人国产| 美女爆乳18禁www久久久久久| 91精品国产一区二区三区香蕉| 麻豆免费版在线观看| 久久精品国产精品亚洲精品色| 99精品在线观看视频| 国产裸体无遮挡|