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

Storm入門教程 第二章 構建Topology

開發 前端
Storm集群和Hadoop集群表面上看很類似。但是Hadoop上運行的是MapReduce jobs,而在Storm上運行的是拓撲(topology),這兩者之間是非常不一樣的。一個關鍵的區別是: 一個MapReduce job最終會結束, 而一個topology永遠會運行(除非你手動kill掉)。

2.1 Storm基本概念

在運行一個Storm任務之前,需要了解一些概念:

  1. Topologies
  2. Streams
  3. Spouts
  4. Bolts
  5. Stream groupings
  6. Reliability
  7. Tasks
  8. Workers

torm集群和Hadoop集群表面上看很類似。但是Hadoop上運行的是 MapReduce jobs,而在Storm上運行的是拓撲(topology),這兩者之間是非常不一樣的。一個關鍵的區別是: 一個MapReduce job最終會結束, 而一個topology永遠會運行(除非你手動kill掉)。

在Storm的集群里面有兩種節點: 控制節點(master node)和工作節點(worker node)??刂乒濣c上面運行一個叫Nimbus后臺程序,它的作用類似Hadoop里面的JobTracker。Nimbus負責在集群里面分發代碼, 分配計算任務給機器, 并且監控狀態。

每一個工作節點上面運行一個叫做Supervisor的節點。Supervisor會監聽分配給它那臺機器的工作,根據需要啟動/關閉工作進程。每一個工作進程執行一個topology的一個子集;一個運行的topology由運行在很多機器上的很多工作進程組成。


[[107823]]

Nimbus和Supervisor之間的所有協調工作都是通過Zookeeper集 群完成。另外,Nimbus進程和Supervisor進程都是快速失敗(fail-fast)和無狀態的。所有的狀態要么在zookeeper里面, 要么在本地磁盤上。這也就意味著你可以用kill -9來殺死Nimbus和Supervisor進程, 然后再重啟它們,就好像什么都沒有發生過。這個設計使得Storm異常的穩定。

2.1.1 Topologies

一個topology是spouts和bolts組成的圖, 通過stream groupings將圖中的spouts和bolts連接起來,如下圖:

[[107825]]

一個topology會一直運行直到你手動kill掉,Storm自動重新分配執行失敗的任務, 并且Storm可以保證你不會有數據丟失(如果開啟了高可靠性的話)。如果一些機器意外停機它上面的所有任務會被轉移到其他機器上。

運行一個topology很簡單。首先,把你所有的代碼以及所依賴的jar打進一個jar包。然后運行類似下面的這個命令:

 storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2

這個命令會運行主類: backtype.strom.MyTopology, 參數是arg1, arg2。這個類的main函數定義這個topology并且把它提交給Nimbus。storm jar負責連接到Nimbus并且上傳jar包。

Topology的定義是一個Thrift結構,并且Nimbus就是一個Thrift服務, 你可以提交由任何語言創建的topology。上面的方面是用JVM-based語言提交的最簡單的方法。

2.1.2 Streams

消息流stream是storm里的關鍵抽象。一個消息流是一個沒有邊界的tuple 序列, 而這些tuple序列會以一種分布式的方式并行地創建和處理。通過對stream中tuple序列中每個字段命名來定義stream。在默認的情況 下,tuple的字段類型可以是:integer,long,short, byte,string,double,float,boolean和byte array。你也可以自定義類型(只要實現相應的序列化器)。

每個消息流在定義的時候會被分配給一個id,因為單向消息流使用的相當普遍, OutputFieldsDeclarer定義了一些方法讓你可以定義一個stream而不用指定這個id。在這種情況下這個stream會分配個值為‘default’默認的id 。

Storm提供的最基本的處理stream的原語是spout和bolt。你可以實現spout和bolt提供的接口來處理你的業務邏輯。

#p#

2.1.3  Spouts

消息源spout是Storm里面一個topology里面的消息生產者。一般來說消 息源會從一個外部源讀取數據并且向topology里面發出消息:tuple。Spout可以是可靠的也可以是不可靠的。如果這個tuple沒有被 storm成功處理,可靠的消息源spouts可以重新發射一個tuple, 但是不可靠的消息源spouts一旦發出一個tuple就不能重發了。

消息源可以發射多條消息流stream。使用OutputFieldsDeclarer.declareStream來定義多個stream,然后使用SpoutOutputCollector來發射指定的stream。

Spout類里面最重要的方法是nextTuple。要么發射一個新的tuple到topology里面或者簡單的返回如果已經沒有新的tuple。要注意的是nextTuple方法不能阻塞,因為storm在同一個線程上面調用所有消息源spout的方法。

另外兩個比較重要的spout方法是ack和fail。storm在檢測到一個tuple被整個topology成功處理的時候調用ack,否則調用fail。storm只對可靠的spout調用ack和fail。

2.1.4  Bolts

所有的消息處理邏輯被封裝在bolts里面。Bolts可以做很多事情:過濾,聚合,查詢數據庫等等。

Bolts可以簡單的做消息流的傳遞。復雜的消息流處理往往需要很多步驟,從而也就需 要經過很多bolts。比如算出一堆圖片里面被轉發最多的圖片就至少需要兩步:***步算出每個圖片的轉發數量。第二步找出轉發最多的前10個圖片。(如果 要把這個過程做得更具有擴展性那么可能需要更多的步驟)。

Bolts可以發射多條消息流, 使用OutputFieldsDeclarer.declareStream定義stream,使用OutputCollector.emit來選擇要發射的stream。

Bolts的主要方法是execute, 它以一個tuple作為輸入,bolts使用OutputCollector來發射tuple,bolts必須要為它處理的每一個tuple調用 OutputCollector的ack方法,以通知Storm這個tuple被處理完成了,從而通知這個tuple的發射者spouts。 一般的流程是: bolts處理一個輸入tuple,  發射0個或者多個tuple, 然后調用ack通知storm自己已經處理過這個tuple了。storm提供了一個IBasicBolt會自動調用ack。

2.1.5  Stream groupings

定義一個topology的其中一步是定義每個bolt接收什么樣的流作為輸入。stream grouping就是用來定義一個stream應該如果分配數據給bolts上面的多個tasks。

Storm里面有7種類型的stream grouping

  1. Shuffle Grouping: 隨機分組, 隨機派發stream里面的tuple,保證每個bolt接收到的tuple數目大致相同。
  2. Fields Grouping:按字段分組, 比如按userid來分組, 具有同樣userid的tuple會被分到相同的Bolts里的一個task, 而不同的userid則會被分配到不同的bolts里的task。
  3. All Grouping:廣播發送,對于每一個tuple,所有的bolts都會收到。
  4.  Global Grouping:全局分組, 這個tuple被分配到storm中的一個bolt的其中一個task。再具體一點就是分配給id值***的那個task。
  5. Non Grouping:不分組,這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和Shuffle grouping是一樣的效果, 有一點不同的是storm會把這個bolt放到這個bolt的訂閱者同一個線程里面去執行。
  6. Direct Grouping: 直接分組, 這是一種比較特別的分組方法,用這種分組意味著消息的發送者指定由消息接收者的哪個task處理這個消息。 只有被聲明為Direct Stream的消息流可以聲明這種分組方法。而且這種消息tuple必須使用emitDirect方法來發射。消息處理者可以通過 TopologyContext來獲取處理它的消息的task的id (OutputCollector.emit方法也會返回task的id)。
  7. Local or shuffle grouping:如果目標bolt有一個或者多個task在同一個工作進程中,tuple將會被隨機發生給這些tasks。否則,和普通的Shuffle Grouping行為一致。

2.1.6  Reliability

Storm保證每個tuple會被topology完整的執行。Storm會追蹤由每 個spout tuple所產生的tuple樹(一個bolt處理一個tuple之后可能會發射別的tuple從而形成樹狀結構),并且跟蹤這棵tuple樹什么時候成 功處理完。每個topology都有一個消息超時的設置,如果storm在這個超時的時間內檢測不到某個tuple樹到底有沒有執行成功, 那么topology會把這個tuple標記為執行失敗,并且過一會兒重新發射這個tuple。

為了利用Storm的可靠性特性,在你發出一個新的tuple以及你完成處理一個 tuple的時候你必須要通知storm。這一切是由OutputCollector來完成的。通過emit方法來通知一個新的tuple產生了,通過 ack方法通知一個tuple處理完成了。

Storm的可靠性我們在第四章會深入介紹。

2.1.7  Tasks

每一個spout和bolt會被當作很多task在整個集群里執行。每一個 executor對應到一個線程,在這個線程上運行多個task,而stream grouping則是定義怎么從一堆task發射tuple到另外一堆task。你可以調用TopologyBuilder類的setSpout和 setBolt來設置并行度(也就是有多少個task)。

2.1.8  Workers

一個topology可能會在一個或者多個worker(工作進程)里面執行,每個 worker是一個物理JVM并且執行整個topology的一部分。比如,對于并行度是300的topology來說,如果我們使用50個工作進程來執 行,那么每個工作進程會處理其中的6個tasks。Storm會盡量均勻的工作分配給所有的worker。

2.1.9 Configuration

Storm里面有一堆參數可以配置來調整Nimbus, Supervisor以及正在運行的topology的行為,一些配置是系統級別的,一些配置是topology級別的。default.yaml里面有 所有的默認配置。你可以通過定義個storm.yaml在你的classpath里來覆蓋這些默認配置。并且你也可以在代碼里面設置一些topology 相關的配置信息(使用StormSubmitter)。

#p#

2.2  構建Topology

1. 實現的目標:

我們將設計一個topology,來實現對一個句子里面的單詞出現的頻率進行統計。這是一個簡單的例子,目的是讓大家對于topology快速上手,有一個初步的理解。

2. 設計Topology結構:

在開始開發Storm項目的***步,就是要設計topology。確定好你的數據處理邏輯,我們今天將的這個簡單的例子,topology也非常簡單。整個topology如下:

[[107826]]

整個topology分為三個部分:

KestrelSpout:數據源,負責發送sentence

Splitsentence:負責將sentence切分

Wordcount:負責對單詞的頻率進行累加

3. 設計數據流

這個topology從kestrel queue讀取句子,并把句子劃分成單詞,然后匯總每個單詞出現的次數,一個tuple負責讀取句子,每一個tuple分別對應計算每一個單詞出現的次數,大概樣子如下所示:

[[107824]]

4. 代碼實現:

1) 構建maven環境:

為了開發storm topology, 你需要把storm相關的jar包添加到classpath里面去: 要么手動添加所有相關的jar包, 要么使用maven來管理所有的依賴。storm的jar包發布在Clojars(一個maven庫), 如果你使用maven的話,把下面的配置添加在你項目的pom.xml里面。

  1. <repository> 
  2.  
  3.     <id>clojars.org</id> 
  4.  
  5.     <url>http://clojars.org/repo</url> 
  6.  
  7. </repository> 
  8.  
  9. <dependency> 
  10.  
  11.      <groupId>storm</groupId> 
  12.  
  13.     <artifactId>storm</artifactId> 
  14.  
  15.      <version>0.5.3</version> 
  16.  
  17.      <scope>test</scope> 
  18.  
  19. </dependency> 

2) 定義topology:

  1. TopologyBuilder builder = new TopologyBuilder(); 
  2.  
  3. builder.setSpout(1, new KestrelSpout(“kestrel.backtype.com”,22133, 
  4.  
  5.                                                                                     ”sentence_queue”, 
  6.  
  7.                                                                                     new StringScheme())); 
  8.  
  9. builder.setBolt(2, new SplitSentence(), 10) 
  10.  
  11.        .shuffleGrouping(1); 
  12.  
  13. builder.setBolt(3, new WordCount(), 20) 
  14.  
  15.        .fieldsGrouping(2, new Fields(“word”)); 

這種topology的spout從句子隊列中讀取句子,在kestrel.backtype.com位于一個Kestrel的服務器端口22133。

Spout用setSpout方法插入一個獨特的id到topology。 Topology中的每個節點必須給予一個id,id是由其他bolts用于訂閱該節點的輸出流。 KestrelSpout在topology中id為1。

setBolt是用于在Topology中插入bolts。 在topology中定義的第個bolts 是切割句子的bolts。 這個bolts 將句子流轉成成單詞流。

#p#

讓我們看看SplitSentence實施:

  1. public class SplitSentence implements IBasicBolt{ 
  2.  
  3.         public void prepare(Map conf, TopologyContext context) { 
  4.  
  5.          } 
  6.  
  7.        public void execute(Tuple tuple, BasicOutputCollector collector) { 
  8.  
  9.               String sentence = tuple.getString(0); 
  10.  
  11.                for(String word: sentence.split(“ ”)) { 
  12.  
  13.                         collector.emit(new Values(word)); 
  14.  
  15.                   } 
  16.  
  17.              } 
  18.  
  19.          public void cleanup() { 
  20.  
  21.         } 
  22.  
  23.         public void declareOutputFields(OutputFieldsDeclarer declarer) { 
  24.  
  25.                 declarer.declare(new Fields(“word”)); 
  26.  
  27.              } 
  28.  
  29.  } 

關鍵的方法 execute方法。 正如你可以看到,它將句子拆分成單詞,并發出每個單詞作為一個新的元組。 另一個重要的方法是declareOutputFields其中宣布bolts輸出元組的架構。 在這里宣布,它發出一個域為word的元組

setBolt的***一個參數是你想為bolts的并行量。 SplitSentence bolts 是10個并發,這將導致在storm集群中有十個線程并行執行。 你所要做的的是增加bolts的并行量在遇到topology的瓶頸時。

 setBolt方法返回一個對象,用來定義bolts的輸入。 例如SplitSentence螺栓訂閱組件“1”使用隨機分組的輸出流。 “1”是指已經定義KestrelSpout。 我將解釋在某一時刻的隨機分組的一部分。 到目前為止,最要緊的是,SplitSentence bolts會消耗KestrelSpout發出的每一個元組。

#p#

下面在讓我們看看wordcount的實現:

  1. public class WordCount implements IBasicBolt { 
  2.  
  3.         private Map<String, Integer> _counts = new HashMap<String, Integer>(); 
  4.  
  5.         public void prepare(Map conf, TopologyContext context) { 
  6.  
  7.         } 
  8.  
  9.        public void execute(Tuple tuple, BasicOutputCollector collector) { 
  10.  
  11.               String word = tuple.getString(0); 
  12.  
  13.               int count; 
  14.  
  15.               if(_counts.containsKey(word)) { 
  16.  
  17.                      count = _counts.get(word); 
  18.  
  19.               } else { 
  20.  
  21.                      count = 0; 
  22.  
  23.  
  24.               count++; 
  25.  
  26.               _counts.put(word, count); 
  27.  
  28.               collector.emit(new Values(word, count)); 
  29.  
  30.        } 
  31.  
  32.        public void cleanup() { 
  33.  
  34.        } 
  35.  
  36.        public void declareOutputFields(OutputFieldsDeclarer declarer) { 
  37.  
  38.               declarer.declare(new Fields(“word”, “count”)); 
  39.  
  40.        } 
  41.  

SplitSentence對于句子里面的每個單詞發射一個新的tuple, WordCount在內存里面維護一個單詞->次數的mapping, WordCount每收到一個單詞, 它就更新內存里面的統計狀態。

5. 運行Topology

storm的運行有兩種模式: 本地模式和分布式模式.

1) 本地模式:

storm用一個進程里面的線程來模擬所有的spout和bolt. 本地模式對開發和測試來說比較有用。 你運行storm-starter里面的topology的時候它們就是以本地模式運行的, 你可以看到topology里面的每一個組件在發射什么消息。

2) 分布式模式:

storm由一堆機器組成。當你提交topology給master的時候, 你同時也把topology的代碼提交了。master負責分發你的代碼并且負責給你的topolgoy分配工作進程。如果一個工作進程掛掉了, master節點會把認為重新分配到其它節點。

3) 下面是以本地模式運行的代碼:

  1. Config conf = new Config(); 
  2.  
  3.        conf.setDebug(true); 
  4.  
  5.        conf.setNumWorkers(2); 
  6.  
  7.        LocalCluster cluster = new LocalCluster(); 
  8.  
  9.        cluster.submitTopology(“test”, conf, builder.createTopology()); 
  10.  
  11.         Utils.sleep(10000); 
  12.  
  13.         cluster.killTopology(“test”); 
  14.  
  15.         cluster.shutdown(); 

首先, 這個代碼定義通過定義一個LocalCluster對象來定義一個進程內的集群。提交topology給這個虛擬的集群和提交topology給分布式集群是一樣的。通過調用submitTopology方法來提交topology, 它接受三個參數:要運行的topology的名字,一個配置對象以及要運行的topology本身。

topology的名字是用來唯一區別一個topology的,這樣你然后可以用這個名字來殺死這個topology的。前面已經說過了, 你必須顯式的殺掉一個topology, 否則它會一直運行。

Conf對象可以配置很多東西, 下面兩個是最常見的:

TOPOLOGY_WORKERS(setNumWorkers) 定義你希望集群分配多少個工作進程給你來執行這個topology. topology里面的每個組件會被需要線程來執行。每個組件到底用多少個線程是通過setBolt和setSpout來指定的。這些線程都運行在工作進程里面. 每一個工作進程包含一些節點的一些工作線程。比如, 如果你指定300個線程,60個進程, 那么每個工作進程里面要執行6個線程, 而這6個線程可能屬于不同的組件(Spout, Bolt)。你可以通過調整每個組件的并行度以及這些線程所在的進程數量來調整topology的性能。

TOPOLOGY_DEBUG(setDebug), 當它被設置成true的話, storm會記錄下每個組件所發射的每條消息。這在本地環境調試topology很有用, 但是在線上這么做的話會影響性能的。

結論:

本章從storm的基本對象的定義,到廣泛的介紹了storm的開發環境,從一個簡單的例子講解了topology的構建和定義。希望大家可以從本章的內容對storm有一個基本的理解和概念,并且已經可以構建一個簡單的topology?。?/p>

原文鏈接:http://blog.linezing.com/2013/01/storm%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B-%E7%AC%AC%E

 

責任編輯:陳四芳 來源: blog.linezing.com
相關推薦

2013-08-29 14:28:09

StormHadoop

2014-01-13 11:22:28

storm

2013-08-29 14:12:52

Storm分布式實時計算

2014-01-16 14:30:43

storm安裝部署

2013-09-18 14:46:32

StormStorm集群

2013-12-12 16:14:21

storm入門教程storm消息處理

2014-01-16 15:48:49

storm

2018-06-14 11:15:08

區塊鏈數字貨幣比特幣

2014-01-16 16:53:53

storm事務一致性

2015-12-31 09:22:25

編程故事printf

2013-12-12 16:37:45

Storm入門教程一致性事務

2011-07-20 08:49:24

jQuery MobiAndroid

2012-02-13 16:39:03

AndroidWeb App官方文檔

2011-12-02 13:04:06

Java

2011-07-20 10:56:53

jQuery Mobi手機新聞瀏覽器

2010-08-03 13:06:15

Flex Builde

2009-07-08 15:12:48

Java Servle

2014-05-26 15:35:55

Web組件Web Compone

2023-11-29 07:30:08

Python用戶界面

2010-06-13 09:45:35

Widget開發
點贊
收藏

51CTO技術棧公眾號

国产亚洲欧洲一区高清在线观看| 国产在线播放精品| 北条麻妃一区二区三区| 亚州欧美日韩中文视频| 日本一卡二卡在线| 欧美xxx视频| 欧美激情在线看| 91国产美女在线观看| 波多野结衣福利| 91精品国产66| 亚洲综合视频在线| 久久久久久99| 91视频在线视频| 我不卡伦不卡影院| 欧美刺激午夜性久久久久久久| 日本xxxxxxxxxx75| 国产九色在线| 国产乱码精品一区二区三区忘忧草 | 亚洲欧美日韩中文视频| 亚洲第一狼人区| 黑人另类精品××××性爽| 久久精品免费在线观看| 成人免费福利在线| 免费av网站在线| 亚洲欧美在线专区| 亚洲九九九在线观看| 91精产国品一二三产区别沈先生| 精精国产xxxx视频在线野外| 中文字幕不卡在线播放| av免费精品一区二区三区| 久久久精品福利| 亚洲欧美偷拍自拍| 这里精品视频免费| 在线观看免费视频黄| 成人做爰免费视频免费看| 一区二区三区不卡视频| 偷拍视频一区二区| 韩国av永久免费| 久久国产日韩欧美精品| 91精品国产99久久久久久| 992在线观看| 在线日韩一区| 欧美二区在线观看| 国产免费视频传媒| 9999精品成人免费毛片在线看| 国产精品久久久久一区| 国产精品免费一区二区| 91久久久久久久久久久久| 国产精品视区| 久久久久国产视频| 日本a级片视频| 精品日韩免费| 亚洲精品网址在线观看| 精品无码人妻少妇久久久久久| 亚洲日韩中文字幕一区| 欧洲视频一区二区| 日本福利视频在线| 97人人在线视频| 亚洲午夜羞羞片| 日本久久久网站| 菠萝菠萝蜜在线视频免费观看| 中文字幕不卡在线播放| 日韩jizzz| 国产精品ⅴa有声小说| av在线不卡观看免费观看| 亚洲字幕一区二区| 99产精品成人啪免费网站| 麻豆国产精品777777在线| 国产精品99一区| 婷婷激情五月网| 国产精品一区亚洲| 欧美一区第一页| 亚洲婷婷综合网| 日韩一区二区久久| 97超碰国产精品女人人人爽| 国产在线精品观看| 亚洲每日更新| 午夜精品久久久久久99热| 欧美精品入口蜜桃| 亚洲高清资源| 91国内免费在线视频| 日韩成人免费观看| 国产亚洲在线| 国产精品igao视频| 怡红院男人天堂| 国内久久婷婷综合| 69堂成人精品视频免费| 亚洲精品一区二区三区四区| 成人福利视频网站| 久久伦理网站| av在线资源站| 亚洲色图另类专区| 久久人妻无码一区二区| heyzo在线欧美播放| 午夜激情久久久| 日韩毛片在线免费看| 草民电影神马电影一区二区| 777奇米四色成人影色区| 日本成人在线免费观看| 久久中文资源| 国产一区二区三区久久精品| 男女性高潮免费网站| 亚洲电影在线一区二区三区| 欧美激情一级二级| 亚洲av中文无码乱人伦在线视色| 蜜桃精品在线观看| 国产高清不卡av| 欧美xxx.com| 自拍av一区二区三区| 台湾无码一区二区| 伊人久久精品一区二区三区| 在线不卡a资源高清| 丰满人妻一区二区三区大胸| 天堂av一区二区三区在线播放| 在线看片第一页欧美| 激情综合五月网| 噜噜噜躁狠狠躁狠狠精品视频 | 中日韩av电影| 一区二区在线观| 免费电影网站在线视频观看福利| 欧美日韩国产激情| 男操女免费网站| 朝桐光av一区二区三区| 亚洲欧洲色图| 久久视频在线视频| 国产一级理论片| 久久蜜桃精品| 成人在线看片| 国产精品秘入口| 亚洲成av人片在www色猫咪| 国产精品一区二区小说| 加勒比色综合久久久久久久久| 日韩在线视频国产| 久久久久久久久黄色| 国产999精品久久| 中文字幕日韩精品久久| 欧美调教sm| 亚洲成人网av| 女教师淫辱の教室蜜臀av软件| 99国产精品99久久久久久粉嫩| 亚洲一区二区三区视频播放| 成年网站在线| 欧美视频13p| a级一a一级在线观看| 欧美91精品| 91美女福利视频高清| 午夜视频在线播放| 亚洲va天堂va国产va久| 亚洲热在线视频| 99欧美视频| 国产精品普通话| 久蕉在线视频| 狠狠久久五月精品中文字幕| 韩国av中国字幕| jvid福利在线一区二区| 91av在线国产| 青青久在线视频免费观看| 午夜精品一区在线观看| 欧美日韩一区二区三区四区五区六区| 欧美freesex交免费视频| 国产欧美婷婷中文| 天堂а√在线资源在线| 欧美日韩一区久久| 蜜桃av.com| 老司机亚洲精品| 色噜噜色狠狠狠狠狠综合色一| 日本综合字幕| 中文日韩电影网站| 国产成人av免费| 国产亚洲精品aa| 亚洲综合在线网站| 欧美三级三级| 国产欧美精品在线播放| 国产黄色在线网站| 日韩一级黄色片| 久久综合久久鬼| 波多野结衣视频一区| 亚洲熟妇av一区二区三区漫画| 欧洲亚洲视频| 国产精品扒开腿做| 91电影在线播放| 欧美日韩国产高清一区二区三区| 三级黄色片在线观看| 国产一区二区中文字幕| 日韩成人三级视频| 神马午夜久久| 136fldh精品导航福利| 牛牛热在线视频| 欧美日韩一区二区在线观看视频| 极品美妇后花庭翘臀娇吟小说| 国产一区二区三区观看| 青草网在线观看| 欧美日韩直播| 国产精品久久久久影院日本| 精品美女在线观看视频在线观看| 精品成人a区在线观看| 中文字幕免费在线观看视频| 国产精品欧美一区喷水| 俄罗斯女人裸体性做爰| 黄色工厂这里只有精品| 欧美一区二区在线| 韩国一区二区三区视频| 97久久精品人人澡人人爽缅北| 国产一级二级三级在线观看| 56国语精品自产拍在线观看| 精品少妇theporn| 久久精品免费在线观看| 五月天六月丁香| 免费在线亚洲欧美| 伊人婷婷久久| 日韩成人一级| 成人免费网视频| 在线视频超级| 超碰91人人草人人干| 日批免费在线观看| 色狠狠桃花综合| 久久久久久久九九九九| 国产色一区二区| 亚洲视频天天射| 蜜臀av性久久久久蜜臀aⅴ四虎| 成人区一区二区| 欧美理论电影大全| 国产区二精品视| 亚洲精品aa| 欧美制服第一页| 丝袜在线视频| 在线日韩中文字幕| 色综合免费视频| 在线成人av影院| 欧美性猛交xxxx乱大交hd| 精品高清美女精品国产区| 久久黄色免费视频| 亚洲婷婷综合色高清在线| 中文字幕欧美激情极品| 久久久不卡影院| 中文字幕第4页| 97久久精品人人做人人爽| 亚洲精品无码一区二区| 国产91精品一区二区麻豆亚洲| 一区二区在线免费观看视频| 国产一区二区不卡老阿姨| 青青草久久伊人| 久久精品国产秦先生| 中文字幕第88页| 捆绑调教一区二区三区| 亚洲36d大奶网| 久久99这里只有精品| 亚洲天堂2018av| 久久精品99久久久| 中文字幕资源在线观看| 国产真实乱偷精品视频免| 91蝌蚪视频在线| 国产在线看一区| 国产精品熟妇一区二区三区四区 | 毛片毛片毛片毛片毛| 久久99国产精品久久99| 久久婷婷中文字幕| 国产激情一区二区三区| 在线观看亚洲免费视频| 91麻豆国产福利精品| 欧美福利第一页| 综合激情成人伊人| 久久国产精品波多野结衣av| 激情亚洲一区二区三区四区 | 免费在线观看av电影| 欧美激情视频在线| 中文字幕人成乱码在线观看 | 国产女主播一区| 影音先锋男人资源在线观看| 亚洲美女区一区| 日韩激情一区二区三区| 欧美小视频在线观看| 中文字幕一二三四| 欧美一区二区播放| 丝袜视频国产在线播放| 一区二区福利视频| jizzjizz亚洲| 韩日欧美一区二区| 日韩精品一区二区三区av| 91九色蝌蚪嫩草| 日韩av三区| 一区二区成人国产精品 | 97在线视频免费| 国产精品毛片久久久久久久久久99999999 | 国产第一页在线播放| 欧美性大战久久| 亚洲av少妇一区二区在线观看| 亚洲欧美变态国产另类| 国产一二区在线| 国产91精品久久久久久| 黄色成人小视频| 精品乱子伦一区二区三区| 色婷婷一区二区三区| 成人毛片一区二区| 黄色日韩网站视频| 国产精品扒开腿做爽爽| 亚洲欧美在线高清| 国产亚洲欧美在线精品| 日韩欧美在线网站| 国产在线视频网址| 欧美精品videosex性欧美| yy6080久久伦理一区二区| 国产高清自拍99| 无需播放器亚洲| 日韩欧美黄色大片| 成人丝袜高跟foot| 小早川怜子一区二区的演员表| 懂色aⅴ精品一区二区三区蜜月 | 成人黄色图片网站| 国产中文一区二区| 91成人国产| 免费一级特黄录像| 2021久久国产精品不只是精品| 青青操国产视频| 欧美日韩另类一区| 欧美巨乳在线| 91sa在线看| 成人资源在线播放| 992tv成人免费观看| 日本不卡的三区四区五区| 国产肉体xxxx裸体784大胆| 一区二区三区小说| 国产男男gay体育生白袜| 永久555www成人免费| 韩日成人影院| 精品视频第一区| 国产精品xvideos88| 免费成人黄色大片| 中文字幕av一区 二区| 日本中文字幕在线观看视频| 亚洲精品国产suv| 波多野一区二区| 国产精品国色综合久久| 欧美日韩99| 在线中文字日产幕| 亚洲综合男人的天堂| 国产高清免费av| 久久成人人人人精品欧| www999久久| 蜜臀在线免费观看| 国产在线观看免费一区| 欧美日韩色视频| 欧美一区在线视频| www在线免费观看视频| 亚洲va电影大全| 亚洲综合专区| 精品无码av一区二区三区不卡| 亚洲精品成人a在线观看| 国产叼嘿视频在线观看| 欧美成人激情视频免费观看| 日韩中文字幕在线一区| 成年人网站国产| av网站一区二区三区| 一本一道无码中文字幕精品热| 亚洲欧美一区二区三区情侣bbw| 日韩影片中文字幕| 丝袜美腿玉足3d专区一区| 奇米777欧美一区二区| 精品熟妇无码av免费久久| 欧美高清视频不卡网| 呦呦在线视频| 好吊色欧美一区二区三区| 免费视频久久| 成人欧美一区二区三区黑人一| 91精品福利在线一区二区三区 | 国产成人亚洲综合青青| 欧美色网址大全| 特黄特黄一级片| 偷拍一区二区三区四区| 川上优的av在线一区二区| 成人免费看吃奶视频网站| 国内自拍一区| 蜜乳av中文字幕| 日韩一区二区三区观看| 麻豆蜜桃在线观看| 天天人人精品| 国产v日产∨综合v精品视频| 青青国产在线观看| 最新91在线视频| av自拍一区| 天美星空大象mv在线观看视频| 亚洲欧美欧美一区二区三区| 凸凹人妻人人澡人人添| 国产精品精品视频| 午夜精品久久| 欧美xxxx精品| 欧美成人精品福利| 性欧美1819sex性高清| 人人妻人人澡人人爽精品欧美一区| 成人动漫精品一区二区| 日韩乱码一区二区三区| 美女av一区二区三区| 香蕉久久99| 爱情岛论坛亚洲自拍| 欧美亚洲动漫精品| 菠萝蜜视频在线观看www入口| 日韩黄色影视| 99免费精品视频| 国产福利第一页| 国产精品都在这里|