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

Storm入門教程:構建Topology

開源
Storm集群和Hadoop集群表面上看很類似。但是Hadoop上運行的是MapReduce jobs,而在Storm上運行的是拓撲(topology),這兩者之間是非常不一樣的。Topology的定義是一個Thrift結構,并且Nimbus就是一個Thrift服務, 你可以提交由任何語言創建的topology。

一、Storm基本概念

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

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

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

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

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

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

1、Topologies

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

一個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、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提供的接口來處理你的業務邏輯。

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。

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。

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行為一致。

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的可靠性我們在第四章會深入介紹。

7、Tasks

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

8、Workers

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

9、Configuration

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

#p#

二、構建Topology

1. 實現的目標:

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

2. 設計Topology結構:

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

 

整個topology分為三個部分:

  • KestrelSpout:數據源,負責發送sentence
  • Splitsentence:負責將sentence切分
  • Wordcount:負責對單詞的頻率進行累加

3. 設計數據流

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

 

4. 代碼實現:

1) 構建maven環境:

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

  1. <repository> 
  2.     <id>clojars.org</id> 
  3.     <url>http://clojars.org/repo</url> 
  4. </repository> 
  5. <dependency> 
  6.      <groupId>storm</groupId> 
  7.     <artifactId>storm</artifactId> 
  8.      <version>0.5.3</version> 
  9.      <scope>test</scope> 
  10. </dependency> 

2) 定義topology:

  1. TopologyBuilder builder = new TopologyBuilder(); 
  2. builder.setSpout(1, new KestrelSpout(“kestrel.backtype.com”,22133,                                                                                   ”sentence_queue”,                                                                                 new StringScheme())); 
  3. builder.setBolt(2, new SplitSentence(), 10) 
  4. .shuffleGrouping(1); 
  5. builder.setBolt(3, new WordCount(), 20) 
  6. .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 將句子流轉成成單詞流。

讓我們看看SplitSentence實施:

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

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

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

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

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

  1. public class WordCount implements IBasicBolt { 
  2.         private Map<String, Integer> _counts = new HashMap<String, Integer>(); 
  3.         public void prepare(Map conf, TopologyContext context) { 
  4.         } 
  5.        public void execute(Tuple tuple, BasicOutputCollector collector) { 
  6.               String word = tuple.getString(0); 
  7.               int count; 
  8.               if(_counts.containsKey(word)) { 
  9.                      count = _counts.get(word); 
  10.               } else { 
  11.                     count = 0
  12.               count++; 
  13.               _counts.put(word, count); 
  14.               collector.emit(new Values(word, count)); 
  15.        } 
  16.        public void cleanup() { 
  17.        } 
  18.        public void declareOutputFields(OutputFieldsDeclarer declarer) { 
  19.               declarer.declare(new Fields(“word”, “count”)); 
  20.        } 

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. conf.setDebug(true); 
  3. conf.setNumWorkers(2); 
  4. LocalCluster cluster = new LocalCluster(); 
  5. cluster.submitTopology(“test”, conf, builder.createTopology()); 
  6. Utils.sleep(10000); 
  7. cluster.killTopology(“test”); 
  8. 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!!

責任編輯:黃丹 來源: 量子恒道官方博客
相關推薦

2014-01-16 11:14:37

StormTopology

2013-08-29 14:12:52

Storm分布式實時計算

2013-09-18 14:46:32

StormStorm集群

2013-12-12 16:14:21

storm入門教程storm消息處理

2014-01-13 11:22:28

storm

2014-01-16 14:30:43

storm安裝部署

2013-12-12 16:37:45

Storm入門教程一致性事務

2014-01-16 15:48:49

storm

2011-12-02 13:04:06

Java

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

2014-01-16 16:53:53

storm事務一致性

2023-11-29 07:30:08

Python用戶界面

2010-06-13 09:45:35

Widget開發

2010-05-21 12:50:45

Subversion快

2024-11-12 15:46:37

2010-08-03 14:37:30

Flex入門教程

2010-07-27 15:53:15

2011-07-21 10:29:18

iPhone 開發
點贊
收藏

51CTO技術棧公眾號

久久精品国产96久久久香蕉| 欧美午夜精品一区二区蜜桃| 国产一区二区三区av在线| 黄色片网站在线免费观看| 国产在线日韩精品| 91精品欧美久久久久久动漫 | 91精品一区二区三区综合在线爱| 日韩亚洲欧美中文三级| 国产a级一级片| 欧美尤物美女在线| 成年人午夜久久久| 国产精品久久av| 久久久久无码国产精品不卡| 视频一区中文| 欧美成人午夜电影| 一区二区三区 日韩| 国内小视频在线看| 成人免费在线视频观看| 欧美成人免费在线| va视频在线观看| 日韩不卡手机在线v区| 色综合久久中文字幕综合网小说| 亚洲精品午夜视频| 国产精品久av福利在线观看| 99在线精品视频免费观看20| 欧美最新另类人妖| 亚洲第一福利网| 污污视频网站在线| 日韩精品免费观看视频| 亚洲成av人片一区二区梦乃| 一区二区免费在线观看| 青青草观看免费视频在线| 国产成人小视频| 91人人爽人人爽人人精88v| 亚洲欧美日韩激情| 国产欧美日韩一区二区三区在线| 久精品免费视频| 长河落日免费高清观看| 九一精品国产| 亚洲免费电影在线观看| 免费看91视频| 日本免费精品| 这里只有精品视频在线观看| 国产精品一区二区羞羞答答| 另类专区亚洲| 欧美性猛交视频| 91好吊色国产欧美日韩在线| 成人高潮aa毛片免费| 一区二区三区在线观看网站| 精品日韩在线播放| 乱人伦中文视频在线| 国产精品―色哟哟| 亚洲精品视频一区二区三区| 岛国最新视频免费在线观看| 国产三级一区二区| 日韩欧美手机在线| 成年人在线免费观看| 国产亚洲一区字幕| 欧美亚洲丝袜| 国内在线精品| 国产欧美日韩视频一区二区| 日韩精品一线二线三线| 岛国最新视频免费在线观看| 国产精品视频你懂的| 亚洲欧洲久久| 18在线观看的| 亚洲午夜羞羞片| 成人免费aaa| 巨茎人妖videos另类| 欧美在线观看一区二区| 国产日韩欧美久久| 嫩呦国产一区二区三区av| 日韩欧美一级在线播放| 美女露出粉嫩尿囗让男人桶| 青青操综合网| 在线日韩中文字幕| 9999热视频| 亚洲人体偷拍| 国产成人黄色av| 国产又黄又爽视频| 国产成人精品在线看| 精品免费日产一区一区三区免费| 久久电影视频| 中文字幕日韩欧美一区二区三区| 亚洲av综合色区| 精品捆绑调教一区二区三区| 一本大道综合伊人精品热热| 中文字幕1234区| 91免费精品国偷自产在线在线| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 最近高清中文在线字幕在线观看| 国产精品电影院| 九九爱精品视频| 久久精品资源| 亚洲第一网站免费视频| 亚洲精品国产精品国自| 欧美激情1区| 国产成人极品视频| www.xxxx国产| 国产蜜臀av在线一区二区三区| 久久久成人精品一区二区三区| 福利影院在线看| 欧美三级在线播放| 超碰caoprom| 91成人精品视频| 青青草原成人在线视频| 99热这里只有精品在线| 久久蜜桃av一区精品变态类天堂| 国产免费xxx| 日韩中文视频| 亚洲精品mp4| 五月天激情丁香| 日韩电影免费一区| 国产欧美亚洲日本| 菠萝蜜视频国产在线播放| 一本久久综合亚洲鲁鲁五月天| 丰满饥渴老女人hd| 91亚洲国产| 4438全国成人免费| 亚洲国产精品久久人人爱潘金莲| 国产精品蜜臀av| 欧美一级黄色片视频| 成人精品动漫一区二区三区| 久久久精品久久| av手机天堂网| 2020日本不卡一区二区视频| 精品一二三四五区| 久久久国产精品入口麻豆| 永久免费看mv网站入口亚洲| 中文字幕在线欧美| 99热99精品| 久久久久久免费看| 亚洲午夜精品| 欧美精品第一页在线播放| 国产精品一二三四五区| 国产精品理伦片| 国产三级三级三级看三级| 在线成人动漫av| 欧美亚洲在线播放| 视频二区在线| 欧美午夜激情视频| 草草影院第一页| 亚洲一区二区免费看| 久久99九九| 欧美aaaaa性bbbbb小妇| 亚洲精品福利资源站| 五月婷婷开心网| 91丨九色丨国产丨porny| 阿v天堂2017| 欧美巨大xxxx| 欧美做受高潮电影o| 麻豆app在线观看| 色欧美片视频在线观看| 日本一区二区视频在线播放| 奇米影视一区二区三区| 中文字幕一区二区三区乱码| 色综合视频一区二区三区44| 久久综合伊人77777蜜臀| 国产精品久久久久久久成人午夜| 亚洲少妇中出一区| 免费欧美一级片| 伊人久久亚洲美女图片| 久精品国产欧美| 性欧美hd调教| 色妞色视频一区二区三区四区| 亚洲一区二区人妻| 亚洲免费av网站| 国产性生活毛片| 美女被久久久| 在线综合视频网站| 天堂av一区| 欧美一性一乱一交一视频| 黄色片免费在线| 91精品一区二区三区久久久久久 | 欧美三区免费完整视频在线观看| 亚洲少妇xxx| 粉嫩av一区二区三区粉嫩| 欧美日韩成人免费视频| 欧美三级伦理在线| 亚洲伊人一本大道中文字幕| 97人澡人人添人人爽欧美| 亚洲社区在线观看| av网站在线免费看| 激情亚洲一区二区三区四区| 国产免费无遮挡吸奶头视频| 国产激情91久久精品导航| 免费在线观看亚洲视频 | 9i在线看片成人免费| 男人插女人下面免费视频| 亚洲精品中文字幕乱码| 韩国成人动漫在线观看| 精品久久99| 高清一区二区三区日本久| 国产福利在线视频| 日韩视频国产视频| 欧美brazzers| 亚洲一卡二卡三卡四卡无卡久久| 中文幕无线码中文字蜜桃| 精品无人码麻豆乱码1区2区| 黄色一级视频在线播放| 青青草91久久久久久久久| 国产精品二区三区| 成人国产激情在线| 韩国19禁主播vip福利视频| 成人高清免费观看mv| 日韩美女一区二区三区四区| 91黑人精品一区二区三区| 亚洲在线视频网站| 日本黄区免费视频观看| av成人免费在线| 激情成人在线观看| 日本不卡不码高清免费观看| 精品无码国产一区二区三区av| 成人免费av| 精品国产乱码久久久久| 国产美女精品视频免费播放软件| 欧美亚洲第一页| 好看的中文字幕在线播放 | 国产一区二区三区视频播放| 成人av午夜电影| 57pao国产成永久免费视频| 国产一区91| 国产无限制自拍| 欧美91视频| 天天做天天爱天天高潮| 精品国产123区| 久久精品99| 精品伊人久久久| 超碰在线观看97| 日韩成人视屏| 91麻豆精品秘密入口| av在线成人| 成人字幕网zmw| 日韩美香港a一级毛片| 在线视频亚洲| 国模私拍视频一区| av大全在线| 欧美精品在线播放| 理论片午午伦夜理片在线播放| 国产一区二区三区网站| 国内精品一区视频| 亚洲欧洲午夜一线一品| 精品美女视频在线观看免费软件| 日韩精品黄色网| 青青九九免费视频在线| 亚洲美女在线视频| 国产在线电影| 一区二区三区无码高清视频| aaa日本高清在线播放免费观看| 亚洲人在线观看| 91网页在线观看| 久久久97精品| 亚洲婷婷噜噜| 久久久伊人日本| 毛片电影在线| 琪琪第一精品导航| 欧美影视资讯| 国产精品亚洲综合天堂夜夜| 日韩黄色三级| av日韩免费电影| 精品自拍偷拍| 日韩av电影免费播放| 日韩精品永久网址| 一区二区三区在线观看www| 久久视频在线| 加勒比海盗1在线观看免费国语版| 欧美1区免费| 欧美国产激情视频| 日本不卡在线视频| 欧美一级特黄aaa| 豆国产96在线|亚洲| 人妻丰满熟妇av无码久久洗澡| 久久精品在线免费观看| 欧美另类69xxxx| 亚洲精品成人少妇| 久久久国产高清| 欧美日韩一区二区三区高清| 亚洲av无码乱码在线观看性色| 亚洲国产另类 国产精品国产免费| 免费在线看v| 久久色精品视频| 国产传媒av在线| 国产精自产拍久久久久久| 亚洲国产欧美国产第一区| 麻豆传媒一区| 欧美国产美女| 可以在线看的av网站| 免费久久99精品国产| 亚洲麻豆一区二区三区| 亚洲国产精品激情在线观看| 久久机热这里只有精品| 在线精品视频小说1| 精品人妻午夜一区二区三区四区| 国产视频一区在线| 黄色免费网站在线| 欧美在线中文字幕| 欧美黄视频在线观看| 日本黑人久久| 狠色狠色综合久久| 少妇一级淫免费放| a亚洲天堂av| 亚洲最大的黄色网址| 日本韩国欧美三级| 理论片中文字幕| 中文字幕亚洲一区二区三区五十路 | 五月婷婷激情视频| 日韩免费高清av| 777电影在线观看| 3344国产精品免费看| 亚洲一区网址| 免费成人深夜夜行网站视频| 视频一区二区三区中文字幕| 成人区人妻精品一区二| 中文字幕一区二区三区四区| 国产成人一级片| 精品国产污污免费网站入口| 蜜芽在线免费观看| 国产精品久久一| 亚洲v天堂v手机在线| 成年人视频网站免费| 九九久久精品视频| www..com.cn蕾丝视频在线观看免费版| 亚洲一级在线观看| 精品人妻一区二区三区麻豆91| 中文字幕日韩欧美在线视频| 国产自产自拍视频在线观看| 俄罗斯精品一区二区| 亚洲香蕉av| 在线能看的av网站| 国产精品水嫩水嫩| 最近中文字幕av| 亚洲人成电影网站色www| 中文在线免费视频| 久久精品ww人人做人人爽| 亚洲成人资源| 中国xxxx性xxxx产国| 一区二区三区在线观看动漫 | 国产精品99久久久久久久女警 | 日韩国产福利| 91精品国产高清久久久久久91| 88久久精品| 东北少妇不带套对白| 成人a区在线观看| 日本一级淫片色费放| 亚洲а∨天堂久久精品9966| 丁香影院在线| 国产伦理一区二区三区| 国内精品嫩模av私拍在线观看| 国偷自产av一区二区三区麻豆| 亚洲综合无码一区二区| 亚洲精品久久久久久久久久久久久久| 欧美xxxx做受欧美.88| 日韩视频在线直播| 轻点好疼好大好爽视频| 丁香桃色午夜亚洲一区二区三区| 麻豆亚洲av熟女国产一区二| 精品国产乱码久久久久久闺蜜| 黄色激情在线播放| 欧美人与物videos另类| 日韩精品一区第一页| 午夜黄色福利视频| 欧美一区二区大片| 2018av在线| 日本一区二区免费看| 美女视频黄 久久| 唐朝av高清盛宴| 亚洲国产欧美一区| 欧美福利在线播放| 亚洲高清乱码| 国产高清不卡一区二区| 日韩精品一区二区三| 国产亚洲aⅴaaaaaa毛片| 91成人在线网站| 黄色一级片黄色| 久久色成人在线| 一区二区精品视频在线观看| 九九精品视频在线| 西瓜成人精品人成网站| 91亚洲精品久久久蜜桃借种| 一区二区不卡在线视频 午夜欧美不卡在| 日本黄视频在线观看| 国产精品国语对白| 欧美深夜福利| 中字幕一区二区三区乱码| 欧美一区二区三区人| 成入视频在线观看| 亚洲国产欧美不卡在线观看| 国产福利电影一区二区三区| 国产精品第5页| 日韩欧美亚洲成人| 国产视频99| 亚洲免费二区| 国产熟妇久久777777| 91麻豆精品国产91久久久使用方法| 波多野结衣在线播放| 亚洲精品在线视频观看| av亚洲精华国产精华| 97超碰人人模人人人爽人人爱| 久久久久久伊人| 91综合视频|