青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Way of C++

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 19 Comments :: 0 Trackbacks

公告

The first time i use this blog, i will write something that i learn which i think is worth write down.

常用鏈接

留言簿(3)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

一、           hive 簡介

        hive 是一個基于 hadoop 的開源數據倉庫工具,用于存儲和處理海量結構化數據。    它把海量數據存儲于 hadoop 文件系統,而不是數據庫,但提供了一套類數據庫的數據存儲和處理機制,并采用 HQL (類 SQL )語言對這些數據進行自動化管理和處理。我們可以把 hive 中海量結構化數據看成一個個的表,而實際上這些數據是分布式存儲在 HDFS 中的。 Hive 經過對語句進行解析和轉換,最終生成一系列基于 hadoop  map/reduce 任務,通過執行這些任務完成數據處理

        Hive 誕生于 facebook 的日志分析需求,面對海量的結構化數據, hive 以較低的成本完成了以往需要大規模數據庫才能完成的任務,并且學習門檻相對較低,應用開發靈活而高效。

        Hive  2009.4.29 發布第一個官方穩定版 0.3.0 至今,不過一年的時間,正在慢慢完善,網上能找到的相關資料相當少,尤其中文資料更少,本文結合業務對 hive 的應用做了一些探索,并把這些經驗做一個總結,所謂前車之鑒,希望讀者能少走一些彎路。

        Hive 的官方 wiki 請參考這里 :

        http://wiki.apache.org/hadoop/Hive

        官方主頁在這里:

        http://hadoop.apache.org/hive/

        hive-0.5.0 源碼包和二進制發布包的下載地址

        http://labs.renren.com/apache-mirror/hadoop/hive/hive-0.5.0/

二、           部署

        由于 Hive 是基于 hadoop 的工具,所以 hive 的部署需要一個正常運行的 hadoop 環境。以下介紹 hive 的簡單部署和應用。

        部署環境:

        操作系統: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)

        Hadoop  hadoop-0.20.2 ,正常運行

        部署步驟如下:

1、   下載最新版本發布包 hive-0.5.0-dev.tar.gz ,傳到 hadoop  namenode 節點上,解壓得到 hive 目錄。假設路徑為: /opt/hadoop/hive-0.5.0-bin

2、   設置環境變量 HIVE_HOME ,指向 hive 根目錄 /opt/hadoop/hive-0.5.0-bin 。由于 hadoop 已運行,檢查環境變量 JAVA_HOME  HADOOP_HOME 是否正確有效。

3、   切換到 $HIVE_HOME 目錄, hive 配置默認即可,運行 bin/hive 即可啟動 hive ,如果正常啟動,將會出現“ hive> ”提示符。

4、   在命令提示符中輸入“ show tables; ”,如果正常運行,說明已部署成功,可供使用。

常見問題:

1、        執行“ show tables; ”命令提示“ FAILED: Error in metadata: java.lang.IllegalArgumentException: URI:  does not have a scheme ”,這是由于 hive 找不到存放元數據庫的數據庫而導致的,修改 conf/ hive-default.xml 配置文件中的 hive.metastore.local  true 即可。由于 hive 把結構化數據的元數據信息放在第三方數據庫,此處設置為 true  hive 將在本地創建 derby 數據庫用于存放元數據。當然如果有需要也可以采用 mysql 等第三方數據庫存放元數據,不過這時 hive.metastore.local 的配置值應為 false 

2、        如果你已有一套 nutch1.0 系統正在跑,而你不想單獨再去部署一套 hadoop 環境,你可以直接使用 nutch1.0 自帶的 hadoop 環境,但這樣的部署會導致 hive 不能正常運行,提示找不到某些方法。這是由于 nutch1.0 使用了 commons-lang-2.1.jar 這個包,而 hive 需要的是 commons-lang-2.4.jar ,下載一個 2.4 版本的包替換掉 2.1 即可, nutch  hive 都能正常運行。

三、           應用場景

        本文主要講述使用 hive 的實踐,業務不是關鍵,簡要介紹業務場景,本次的任務是對搜索日志數據進行統計分析。

        集團搜索剛上線不久,日志量并不大 。這些日志分布在 5 臺前端機,按小時保存,并以小時為周期定時將上一小時產生的數據同步到日志分析機,統計數據要求按小時更新。這些統計項,包括關鍵詞搜索量 pv ,類別訪問量,每秒訪問量 tps 等等。

基于 hive ,我們將這些數據按天為單位建表,每天一個表,后臺腳本根據時間戳將每小時同步過來的 5 臺前端機的日志數據合并成一個日志文件,導入 hive 系統,每小時同步的日志數據被追加到當天數據表中,導入完成后,當天各項統計項將被重新計算并輸出統計結果。

        以上需求若直接基于 hadoop 開發,需要自行管理數據,針對多個統計需求開發不同的 map/reduce 運算任務,對合并、排序等多項操作進行定制,并檢測任務運行狀態,工作量并不小。但使用 hive ,從導入到分析、排序、去重、結果輸出,這些操作都可以運用 hql 語句來解決,一條語句經過處理被解析成幾個任務來運行,即使是關鍵詞訪問量增量這種需要同時訪問多天數據的較為復雜的需求也能通過表關聯這樣的語句自動完成,節省了大量工作量。

四、           Hive 實戰

        初次使用 hive ,應該說上手還是挺快的。 Hive 提供的類 SQL 語句與 mysql 語句極為相似,語法上有大量相同的地方,這給我們上手帶來了很大的方便,但是要得心應手地寫好這些語句,還需要對 hive 有較好的了解,才能結合 hive 特色寫出精妙的語句。

        關于 hive 語言的詳細語法可參考官方 wiki 的語言手冊 :

        http://wiki.apache.org/hadoop/Hive/LanguageManual

        雖然語法風格為我們提供了便利,但初次使用遇到的問題還是不少的,下面針對業務場景談談我們遇到的問題,和對 hive 功能的定制。

1、 分隔符問題

                首先遇到的是日志數據的分隔符問題,我們的日志數據的大致格式如下:

2010-05-24 00:00:02@$_$@QQ2010@$_$@all@$_$@NOKIA_1681C@$_$@1@$_$@10@$_$@@$_$@-1@$_$@10@$_$@application@$_$@1

        從格式可見其分隔符是“ @$_$@ ”,這是為了盡可能防止日志正文出現與分隔符相同的字符而導致數據混淆。本來 hive支持在建表的時候指定自定義分隔符的,但經過多次測試發現只支持單個字符的自定義分隔符,像“ @$_$@ ”這樣的分隔符是不能被支持的,但是我們可以通過對分隔符的定制解決這個問題, hive 的內部分隔符是“ \001 ”,只要把分隔符替換成“\001 ”即可。

經過探索我們發現有兩條途徑解決這個問題。

a)          自定義 outputformat  inputformat 

        Hive  outputformat/inputformat  hadoop  outputformat/inputformat 相當類似, inputformat 負責把輸入數據進行格式化,然后提供給 hive  outputformat 負責把 hive 輸出的數據重新格式化成目標格式再輸出到文件,這種對格式進行定制的方式較為底層,對其進行定制也相對簡單,重寫 InputFormat  RecordReader 類中的 next 方法即可,示例代碼如下:

    public boolean next(LongWritable key, BytesWritable value)

        throws IOException {

        while ( reader .next(key, text ) ) {

        String strReplace = text .toString().toLowerCase().replace( "@$_$@" "\001" );

        Text txtReplace = new Text();

        txtReplace.set(strReplace );

        value.set(txtReplace.getBytes(), 0, txtReplace.getLength());

        return true ;

      }

         return false ;

}

        重寫 HiveIgnoreKeyTextOutputFormat  RecordWriter 中的 write 方法,示例代碼如下:

    public void write (Writable w) throws IOException {

      String strReplace = ((Text)w).toString().replace( "\001" "@$_$@" );

      Text txtReplace = new Text();

      txtReplace.set(strReplace);

      byte [] output = txtReplace.getBytes();

      bytesWritable .set(output, 0, output. length );

      writer .write( bytesWritable );

}

        自定義 outputformat/inputformat 后,在建表時需要指定 outputformat/inputformat ,如下示例:

stored as INPUTFORMAT 'com.aspire.search.loganalysis.hive.SearchLogInputFormat' OUTPUTFORMAT 'com.aspire.search.loganalysis.hive.SearchLogOutputFormat'

b)          通過 SerDe(serialize/deserialize) ,在數據序列化和反序列化時格式化數據。

這種方式稍微復雜一點,對數據的控制能力也要弱一些,它使用正則表達式來匹配和處理數據,性能也會有所影響。但它的優點是可以自定義表屬性信息 SERDEPROPERTIES ,在 SerDe 中通過這些屬性信息可以有更多的定制行為。

2、 數據導入導出

a)          多版本日志格式的兼容

        由于 hive 的應用場景主要是處理冷數據(只讀不寫),因此它只支持批量導入和導出數據,并不支持單條數據的寫入或更新,所以如果要導入的數據存在某些不太規范的行,則需要我們定制一些擴展功能對其進行處理。

        我們需要處理的日志數據存在多個版本,各個版本每個字段的數據內容存在一些差異,可能版本 A 日志數據的第二個列是搜索關鍵字,但版本 B 的第二列卻是搜索的終端類型,如果這兩個版本的日志直接導入 hive 中,很明顯數據將會混亂,統計結果也不會正確。我們的任務是要使多個版本的日志數據能在 hive 數據倉庫中共存,且表的 input/output 操作能夠最終映射到正確的日志版本的正確字段。

        這里我們不關心這部分繁瑣的工作,只關心技術實現的關鍵點,這個功能該在哪里實現才能讓 hive 認得這些不同格式的數據呢?經過多方嘗試,在中間任何環節做這個版本適配都將導致復雜化,最終這個工作還是在 inputformat/outputformat 中完成最為優雅,畢竟 inputformat 是源頭, outputformat 是最終歸宿。具體來說,是在前面提到的 inputformat  next 方法中和在 outputformat  write 方法中完成這個適配工作。

b)          Hive 操作本地數據

        一開始,總是把本地數據先傳到 HDFS ,再由 hive 操作 hdfs 上的數據,然后再把數據從 HDFS 上傳回本地數據。后來發現大可不必如此, hive 語句都提供了“ local ”關鍵字,支持直接從本地導入數據到 hive ,也能從 hive 直接導出數據到本地,不過其內部計算時當然是用 HDFS 上的數據,只是自動為我們完成導入導出而已。

3、 數據處理

日志數據的統計處理在這里反倒沒有什么特別之處,就是一些 SQL 語句而已,也沒有什么高深的技巧,不過還是列舉一些語句示例,以示 hive 處理數據的方便之處,并展示 hive 的一些用法。

a)           hive 添加用戶定制功能,自定義功能都位于 hive_contrib.jar 包中

add jar /opt/hadoop/hive-0.5.0-bin/lib/hive_contrib.jar;

b)          統計每個關鍵詞的搜索量,并按搜索量降序排列,然后把結果存入表 keyword_20100603 

create table keyword_20100603 as select keyword,count(keyword) as count from searchlog_20100603 group by keyword order by count desc;

c)          統計每類用戶終端的搜索量,并按搜索量降序排列,然后把結果存入表 device_20100603 

create table device_20100603 as select device,count(device) as count from searchlog_20100603 group by device order by count desc;

d)          創建表 time_20100603 ,使用自定義的 INPUTFORMAT  OUTPUTFORMAT ,并指定表數據的真實存放位置在 '/LogAnalysis/results/time_20100603'  HDFS 路徑),而不是放在 hive 自己的數據目錄中

create external table if not exists time_20100603(time string, count int) stored as INPUTFORMAT 'com.aspire.search.loganalysis.hive.XmlResultInputFormat' OUTPUTFORMAT 'com.aspire.search.loganalysis.hive.XmlResultOutputFormat' LOCATION '/LogAnalysis/results/time_20100603';

e)          統計每秒訪問量 TPS ,按訪問量降序排列,并把結果輸出到表 time_20100603 中,這個表我們在上面剛剛定義過,其真實位置在 '/LogAnalysis/results/time_20100603' ,并且由于 XmlResultOutputFormat 的格式化,文件內容是 XML 格式。

insert overwrite table time_20100603 select time,count(time) as count from searchlog_20100603 group by time order by count desc;

f)           計算每個搜索請求響應時間的最大值,最小值和平均值

insert overwrite table response_20100603 select max(responsetime) as max,min(responsetime) as min,avg(responsetime) as avg from searchlog_20100603;

g)          創建一個表用于存放今天與昨天的關鍵詞搜索量和增量及其增量比率,表數據位于 '/LogAnalysis/results/keyword_20100604_20100603' ,內容將是 XML 格式。

create external table if not exists keyword_20100604_20100603(keyword string, count int, increment int, incrementrate double) stored as INPUTFORMAT 'com.aspire.search.loganalysis.hive.XmlResultInputFormat' OUTPUTFORMAT 'com.aspire.search.loganalysis.hive.XmlResultOutputFormat' LOCATION '/LogAnalysis/results/keyword_20100604_20100603';

h)          設置表的屬性,以便 XmlResultInputFormat  XmlResultOutputFormat 能根據 output.resulttype 的不同內容輸出不同格式的 XML 文件。

alter table keyword_20100604_20100603 set tblproperties ('output.resulttype'='keyword');

i)            關聯今天關鍵詞統計結果表( keyword_20100604 )與昨天關鍵詞統計結果表( keyword_20100603 ),統計今天與昨天同時出現的關鍵詞的搜索次數,今天相對昨天的增量和增量比率,并按增量比率降序排列,結果輸出到剛剛定義的 keyword_20100604_20100603 表中,其數據文件內容將為 XML 格式。

insert overwrite table keyword_20100604_20100603 select cur.keyword, cur.count, cur.count-yes.count as increment, (cur.count-yes.count)/yes.count as incrementrate from keyword_20100604 cur join keyword_20100603 yes on (cur.keyword = yes.keyword) order by incrementrate desc;

j)             

 

4、 用戶自定義函數 UDF

部分統計結果需要以 CSV 的格式輸出,對于這類文件體全是有效內容的文件,不需要像 XML 一樣包含 version  encoding 等信息的文件頭,最適合用 UDF(user define function) 了。

UDF 函數可直接應用于 select 語句,對查詢結構做格式化處理之后,再輸出內容。自定義 UDF 需要繼承 org.apache.hadoop.hive.ql.exec.UDF ,并實現 evaluate 函數, Evaluate 函數支持重載,還支持可變參數。我們實現了一個支持可變字符串參數的 UDF ,支持把 select 得出的任意個數的不同類型數據轉換為字符串后,按 CSV 格式輸出,由于代碼較簡單,這里給出源碼示例:

    public String evaluate(String... strs) {

       StringBuilder sb = new StringBuilder();

       for ( int i = 0; i < strs. length ; i++) {

           sb.append(ConvertCSVField(strs[i])).append( ',' );

       }

       sb.deleteCharAt(sb.length()-1);

       return sb.toString();

}

         需要注意的是,要使用 UDF 功能,除了實現自定義 UDF 外,還需要加入包含 UDF 的包,示例:

add jar /opt/hadoop/hive-0.5.0-bin/lib/hive_contrib.jar;

然后創建臨時方法,示例:

CREATE TEMPORARY FUNCTION Result2CSv AS ‘com.aspire.search.loganalysis.hive. Result2CSv';

         使用完畢還要 drop 方法,示例:

DROP TEMPORARY FUNCTION Result2CSv;

5、   輸出 XML 格式的統計結果

前面看到部分日志統計結果輸出到一個表中,借助 XmlResultInputFormat  XmlResultOutputFormat 格式化成 XML 文件,考慮到創建這個表只是為了得到 XML 格式的輸出數據,我們只需實現 XmlResultOutputFormat 即可,如果還要支持 select 查詢,則我們還需要實現 XmlResultInputFormat ,這里我們只介紹 XmlResultOutputFormat 

前面介紹過,定制 XmlResultOutputFormat 我們只需重寫 write 即可,這個方法將會把 hive 的以 ’\001’ 分隔的多字段數據格式化為我們需要的 XML 格式,被簡化的示例代碼如下:

    public void write(Writable w) throws IOException {

           String[] strFields = ((Text) w).toString().split( "\001" );

           StringBuffer sbXml = new StringBuffer();

           if ( strResultType .equals( "keyword" )) {

    sbXml.append( "<record><keyword>" ).append(strFields[0]).append(

    "</keyword><count>" ).append(strFields[1]).append(           "</count><increment>" ).append(strFields[2]).append(

    "</increment><rate>" ).append(strFields[3]).append(

"</rate></result>" );

           }

           Text txtXml = new Text();

           byte [] strBytes = sbXml.toString().getBytes( "utf-8" );

           txtXml.set(strBytes, 0, strBytes. length );

           byte [] output = txtXml.getBytes();

           bytesWritable .set(output, 0, output. length );

           writer .write( bytesWritable );

    }

        其中的 strResultType .equals( "keyword" ) 指定關鍵詞統計結果,這個屬性來自以下語句對結果類型的指定,通過這個屬性我們還可以用同一個 outputformat 輸出多種類型的結果。

        alter table keyword_20100604_20100603 set tblproperties ('output.resulttype'='keyword');

        仔細看看 write 函數的實現便可發現,其實這里只輸出了 XML 文件的正文,而 XML 的文件頭和結束標簽在哪里輸出呢?所幸我們采用的是基于 outputformat 的實現,我們可以在構造函數輸出 version  encoding 等文件頭信息,在 close() 方法中輸出結束標簽。

        這也是我們為什么不使用 UDF 來輸出結果的原因,自定義 UDF 函數不能輸出文件頭和文件尾,對于 XML 格式的數據無法輸出完整格式,只能輸出 CSV 這類所有行都是有效數據的文件。

五、           總結

        Hive 是一個可擴展性極強的數據倉庫工具,借助于 hadoop 分布式存儲計算平臺和 hive  SQL 語句的理解能力,我們所要做的大部分工作就是輸入和輸出數據的適配,恰恰這兩部分 IO 格式是千變萬化的,我們只需要定制我們自己的輸入輸出適配器, hive將為我們透明化存儲和處理這些數據,大大簡化我們的工作。本文的重心也正在于此,這部分工作相信每一個做數據分析的朋友都會面對的,希望對您有益。

        本文介紹了一次相當簡單的基于 hive 的日志統計實戰,對 hive 的運用還處于一個相對較淺的層面,目前尚能滿足需求。對于一些較復雜的數據分析任務,以上所介紹的經驗很可能是不夠用的,甚至是 hive 做不到的, hive 還有很多進階功能,限于篇幅本文未能涉及,待日后結合具體任務再詳細闡述。

        如您對本文有任何建議或指教,請評論,謝謝。

posted on 2010-07-19 14:39 koson 閱讀(6401) 評論(4)  編輯 收藏 引用 所屬分類: Hadoop

Feedback

# re: 基于hive的日志數據統計實戰 2010-07-19 19:53 dajuezhao
寫的很好!  回復  更多評論
  

# re: 基于hive的日志數據統計實戰[未登錄] 2010-07-19 19:53 echo
大牛,剛拜讀您的文章,寫得很好,解決了我很多問題,繼續加油:)  回復  更多評論
  

# re: 基于hive的日志數據統計實戰 2010-12-08 14:34 淡然一笑
http://blog.csdn.net/sutine/archive/2010/06/07/5653137.aspx
轉載煩請注明出處。  回復  更多評論
  

# re: 基于hive的日志數據統計實戰 2011-08-23 15:42 知雨之樂
此篇文章是轉載的,非原創  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美女人交a| 国内外成人免费激情在线视频网站| 亚洲国产高清在线观看视频| 蜜桃精品一区二区三区| 久久综合精品国产一区二区三区| 亚洲国产成人精品视频| 欧美激情国产日韩| 欧美日韩国产成人| 午夜精品久久久久久久久久久| 亚洲一级片在线观看| 国产亚洲精品v| 欧美freesex交免费视频| 欧美高清在线一区| 午夜久久久久久久久久一区二区| 午夜日韩在线| 亚洲欧洲一区二区在线观看 | 亚洲第一狼人社区| 亚洲国产专区校园欧美| 欧美午夜大胆人体| 久久亚洲春色中文字幕| 欧美国产欧美亚洲国产日韩mv天天看完整| 99riav久久精品riav| 午夜精品国产精品大乳美女| 亚洲高清在线播放| 亚洲午夜免费福利视频| 亚洲第一区色| 亚洲免费中文字幕| 亚洲人成精品久久久久| 午夜精品成人在线视频| 亚洲精品视频一区| 欧美在线观看你懂的| 99在线精品视频在线观看| 欧美一级淫片播放口| 一区二区三区蜜桃网| 久久久精品一区二区三区| 亚洲图中文字幕| 美女任你摸久久| 久久精品国产99国产精品澳门| 欧美成人精品三级在线观看| 久久精品免费电影| 欧美性片在线观看| 亚洲人成高清| 亚洲国产一区二区在线| 欧美一二三视频| 亚洲一区在线观看视频 | 久久精品一区四区| 亚洲欧美久久久久一区二区三区| 欧美插天视频在线播放| 久久一区二区三区四区五区| 国产精品亚洲综合| 亚洲一区二区三区在线| 亚洲视频每日更新| 欧美日本乱大交xxxxx| 亚洲国产91色在线| 亚洲国产成人久久综合一区| 久久久久国产精品人| 久久久久久久尹人综合网亚洲 | 久久www免费人成看片高清| 亚洲女性喷水在线观看一区| 欧美日韩高清在线播放| 亚洲经典自拍| 99riav国产精品| 欧美精品在线观看| 亚洲精品一区二区三区不| 日韩午夜精品视频| 欧美日韩国产欧美日美国产精品| 91久久精品日日躁夜夜躁欧美| 亚洲黑丝一区二区| 欧美精品videossex性护士| 亚洲电影在线| 99热免费精品| 国产精品国产三级国产aⅴ无密码| 日韩亚洲欧美在线观看| 亚洲欧美区自拍先锋| 国产伦精品一区二区| 欧美一区二区三区另类 | 亚洲欧美大片| 国产伦精品一区二区三区高清| 午夜在线观看欧美| 欧美电影在线播放| 一本色道久久| 国产精品免费看久久久香蕉| 香蕉久久一区二区不卡无毒影院| 久久久久久亚洲精品杨幂换脸| 一区二区三区在线视频免费观看| 老司机精品视频网站| 99精品99| 久久精品中文字幕免费mv| 亚洲国产精品成人| 欧美日韩亚洲综合在线| 欧美一区不卡| 亚洲国产高清在线观看视频| 亚洲资源av| 在线看成人片| 欧美午夜精品久久久久免费视| 亚洲欧美日韩精品久久久| 美女视频黄免费的久久| 亚洲视频电影图片偷拍一区| 国产日本亚洲高清| 欧美成人国产| 午夜精品电影| 亚洲激情视频在线播放| 久久国产黑丝| 一区二区三区久久网| 激情成人av| 欧美性做爰毛片| 麻豆成人av| 午夜精品久久久久久久久久久久久| 欧美国产日本韩| 欧美在线视频在线播放完整版免费观看| 精品成人久久| 国产九九精品| 欧美日韩国产首页| 另类av一区二区| 小辣椒精品导航| 一本色道精品久久一区二区三区| 欧美14一18处毛片| 欧美在线中文字幕| 亚洲午夜精品久久久久久app| 亚洲国产一二三| 国内精品久久久久影院薰衣草| 欧美视频在线观看 亚洲欧| 男女激情久久| 久久午夜电影网| 欧美在线一二三四区| 一区二区欧美精品| 亚洲精品日产精品乱码不卡| 欧美成人免费全部| 麻豆精品传媒视频| 久久亚洲私人国产精品va媚药| 午夜精品在线视频| 午夜精品国产更新| 亚洲欧美中文另类| 亚洲欧美www| 亚洲欧美一区二区视频| 亚洲午夜羞羞片| 亚洲一区二区三区四区在线观看| av成人免费| 亚洲视频国产视频| 亚洲女人小视频在线观看| 亚洲一品av免费观看| 亚洲四色影视在线观看| 亚洲午夜精品一区二区三区他趣| 一本色道久久88精品综合| 日韩亚洲视频| 亚洲一区二区三区午夜| 亚洲在线成人精品| 亚洲欧美日韩爽爽影院| 欧美一区二区三区在线免费观看| 欧美一区2区视频在线观看| 午夜精品久久久久| 久久久久久有精品国产| 免费久久99精品国产| 欧美成人午夜激情视频| 亚洲国产日韩欧美| 日韩视频在线你懂得| 亚洲一区二区成人| 性欧美xxxx视频在线观看| 久久精品导航| 欧美激情一区二区在线| 欧美日韩一区在线| 国产亚洲va综合人人澡精品| 在线观看视频日韩| 亚洲精品一区二区三区福利| 亚洲一区二区三区在线看| 久久国产精品久久久久久电车| 久久一二三四| 亚洲日韩欧美视频| 午夜精品一区二区三区四区| 久久免费国产精品| 欧美日韩精品伦理作品在线免费观看| 欧美视频四区| 伊人激情综合| 亚洲私人影院| 男男成人高潮片免费网站| 日韩视频在线播放| 欧美中文字幕| 欧美日韩国产123| 国内精品美女av在线播放| 夜夜嗨av一区二区三区四季av | 噜噜噜91成人网| 亚洲国产一区二区a毛片| 亚洲图片在区色| 欧美+日本+国产+在线a∨观看| 国产精品黄色| 亚洲精品一区二区三区四区高清| 欧美亚洲综合久久| 亚洲激情中文1区| 久久国产精品久久精品国产| 欧美日韩成人网| 亚洲成人资源| 亚洲欧美日韩综合| 亚洲激情精品| 久久亚裔精品欧美| 国产精品综合| 亚洲女同同性videoxma| 亚洲欧洲另类国产综合| 久久久国产精品一区| 国产欧美日韩一级| 亚洲一区在线观看免费观看电影高清|