999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種大數據分析組件的自動化開發集成方法

2016-08-05 07:58:01吳懷林馬志柔
計算機應用與軟件 2016年7期
關鍵詞:方法

陳 茜 吳懷林 馬志柔 劉 杰 鐘 華

1(中國科學院大學 北京 100049)2(中國科學院軟件研究所 北京 100190)

?

一種大數據分析組件的自動化開發集成方法

陳茜1,2吳懷林2馬志柔2劉杰2鐘華2

1(中國科學院大學北京 100049)2(中國科學院軟件研究所北京 100190)

摘要隨著大數據時代的到來,數據分析需求日趨多樣化,大數據分析工具自帶的算法庫已無法滿足個性化的數據分析需求,亟需開發或集成新的算法。但現有的大數據分析工具算法開發集成學習成本高,給新算法的開發集成帶來一定困難。提出一種針對大數據分析工具自動化開發集成算法的方法,算法以組件的形式集成到分析工具中。首先定義組件模型,其次給出組件模型自動化生成流程,最后重點分析組件代碼的自動生成和代碼檢測問題,給出基于元信息的代碼生成方案和基于Soot控制流的靜態代碼檢測方法。實驗表明,該方法可以完成大數據分析組件的自動化開發集成。

關鍵詞大數據分析組件Soot控制流分析代碼生成

0引言

隨著互聯網的快速發展,我們已經進入大數據時代,越來越多的機構組織開始重視數據分析帶來的價值,人們對數據分析的需求也迅速提升。許多優秀的算法分析師致力于數據分析算法開發優化的同時,日趨增長的大數據分析業務亟需業務部門的分析師完成。集成化的大數據分析工具正是連接兩者的紐帶,它可以集成開發者開發好的數據分析算法,供業務分析師使用。

Haflow正是這樣的一個集成化的大數據分析工具。該工具以組件為設計單位,具有拖拽式流程設計界面,以分布式集群Hadoop為組件運行的基礎設施,組件間通過HDFS文件傳遞數據[1]。除了Haflow,目前市場上已經有一些成熟的數據分析工具,如Weka[2]、Clementine、R[3]等。這些工具本身集成了一些優秀的數據分析算法,數據分析師固然可以利用這些工具自帶的算法進行數據挖掘分析。但是當遇到特定的數據分析需求,需要開發和實現新的數據分析算法時,這些數據分析工具卻并未提供很好的平臺算法擴展接口和算法開發工具,方便算法的快速開發和集成。以Weka為例,擴展現有的算法庫,添加一個新的算法需要完成以下步驟:1) 按照Weka接口和規范編寫新的算法;2) 建立合理的目錄結構,定位算法所在的包;3) 修改Weka啟動時加載的系統配置文件[4]。這必然增加了算法開發和集成的復雜程度,給算法開發人員帶來了學習負擔。

為了解決大數據分析工具算法集成開發復雜的問題,本文基于現有的大數據分析工具Haflow提出一種自動的算法開發集成方法。通過該方法,屏蔽算法開發人員與工具適配的工作,免去算法開發人員研究平臺接口規范的麻煩,使其只需關注在算法的實現和優化工作上,從而提高算法開發人員的工作效率。另外本文還利用靜態代碼分析的方法檢測現有開源代碼中不符合工具規范的部分,從而實現開源代碼的自動化集成。總之,利用該方法,可以快速地為Haflow大數據分析工具開發和集成開源算法,從而解決數據分析算法開發集成困難的問題。

1相關研究

相關研究主要調研了主流的商業數據分析工具算法開發現狀和學術界數據分析組件自動化開發方案。

在數據挖掘領域,國內外針對不同的應用場景研究開發了不同的數據分析工具。主流的數據分析工具包括:SAS、SPSS、Weka以及R語言等。研究這些工具上的算法開發解決方案,SAS、SPSS由于不開源,基本無法為其開發自定義的算法。R和Weka是開源的,前文中以及提到為Weka編寫新算法需要三步,Weka并未提供自動化的算法開發方法;R是一個開放式平臺,R提供了包結構的解決方案來管理算法,開發的新的算法需要滿足包結構的標準。Haflow是一個基于組件的大數據分析工具[1],該工具構建在分布式集群上,以HDFS為底層文件系統,提供可擴展的組件接口。數據分析算法可以以組件的形式集成到工具平臺上,并且支持異構底層的算法。Haflow雖然提供了開放接口來支持組件開發集成,但沒有提供自動化的方法,開發人員要學習Haflow本身的接口,熟悉Haflow的處理邏輯才能開發組件。對于開源算法的集成,也需要開發人員找出算法中不符合平臺規范的地方,代價很高。

綜上所述,現有的大數據分析工具給出的算法開發和集成方案為:提供可擴展的算法開發接口,新組件的開發需要實現該接口,滿足包結構管理規范,但沒有給出自動化的組件開發集成方案。

除了以上提到的商業數據分析工具,學術界提出了以下研究方法。

采用模型驅動的代碼生成方法,利用系統提供的模型組件定義數據挖掘過程,該過程是一個邏輯模型,與具體實現技術無關。邏輯模型經過系統的后臺解析成物理模型,然后在系統中執行。通過Jet模板解析的方式來生成物理模型代碼,Jet解析器將用戶參數和代碼模板轉換成可執行Java代碼[5]。該方法實現了數據挖掘組件的自動化開發過程,但沒有提供開源算法集成到數據分析工具的解決方案。

利用靜態代碼分析方法可以對程序中的代碼進行檢測分析,Soot是McGill大學的Sable研究小組于1996年開發的Java字節碼優化框架[6],其目標是開發能夠更快更好地理解與執行Java程序的工具[7]。通過 Soot 提供的過程內和過程間的分析與優化支持,用戶可以很方便地獲得每個方法的控制流圖和各個折衷級別上的全局調用圖[8]。在學術研究中,Soot還被用來檢測分析程序中的缺陷[9]。本文將利用Soot分析開源算法中的輸入輸出語句代碼,從而完成開源算法的集成。

2大數據分析組件的自動化開發集成

本文將研究如何自動化開發和集成大數據分析算法到Haflow工具中。Haflow將平臺上的分析算法定義為組件,首先要了解組件的概念,然后給出自動化集成和開發這些組件的步驟和處理框架。

2.1大數據分析組件模型

由圖1可以看出組件模型由三部分構成:組件元信息、組件實體和組件接口,可以表示為V=(M,E,I)。

圖1 組件模型

具體介紹如下:

M為組件元信息:定義組件的描述,繼承Haflow提供的抽象類來滿足其規范,是組件被平臺識別和管理的基礎。

E為組件實體:是組件功能的實現部分,是集成或者全新開發的算法部分,支持Java、MapReduce、R、Hive等多種底層異構平臺。

I為組件接口:是組件的輸入輸出部分,用來滿足與其他組件的匹配,將相鄰兩個組件的匹配轉換為中間數據結點的匹配。

從具體代碼實現上看,一個組件可以理解為一個Jar包,是由Java代碼按照規定的包結構打包生成。Java源碼按照功能的不同區分成兩部分:組件元信息Java類和組件實現Java類。組件接口Java代碼段分布在兩者之中,組件Jar包結構如圖2所示。

圖2 組件Jar包結構圖

元信息Java類由ID、組件參數以及根據底層平臺不同繼承實現的不同組件抽象類三部分組成。實體部分可以是以Main函數作為調用入口的一個Java類,也可以是由Main函數做入口調用的多個Java類。組件接口部分比較特殊不是單獨的Java類,而是由兩部分代碼段組成:元信息Java類中描述組件輸入輸出的參數部分和實體Java文件中對這些輸入輸出進行處理的部分。Haflow底層是HDFS文件系統,組件協同工作需要以HDFS文件作為接口標準,即前一個組件輸出的HDFS文件作為與其相連的后一個組件的輸入。如圖3所示,組件的輸入輸出會以鍵值對(Key,Value)的形式作為Main函數的命令行參數傳遞到組件實體類內,實體類讀取Main函數的Args參數即可讀到輸入輸出文件所在的地址。

圖3 組件接口文件處理機制

2.2組件自動化開發集成處理流程

Haflow的組件主要有兩種來源:一是算法工程師自己從頭開始編寫的全新的算法包裝成組件;另一種是將Mahout、Weka等開源的算法適配成工具支持的組件。

兩種來源的算法要集成到平臺上成為組件。首先,要能被Haflow平臺識別,這就需要自動生成組件的元信息;其次,Mahout、Weka中有部分單機算法,對輸入輸出文件的處理都是單機方法,不滿足Haflow接口文件處理要求,需要自動化檢測這部分代碼,給出需要修改的片段;最后,修改后的算法本身可以作為組件實體,連同自動生成的組件元信息按照一定的包組織結構生成Jar包提交到Haflow上。按照以上三步就完成了組件自動化開發集成,流程如圖4所示。

圖4 組件自動化開發集成處理流程

3方法實現及關鍵技術研究

3.1組件元信息自動化生成

Haflow對于組件元信息有統一的規范,可以抽象成一個元信息邏輯模型LM=(ID,Property,Platform)。該邏輯模型從用戶的角度來定義,ID是自動為組件生成的唯一標識,Property是組件的參數信息,Platform代表組件依賴的底層平臺,不同的平臺對應的物理模型不一樣。組件開發人員只需要填寫抽象邏輯模型要求的字段,從而屏蔽了其對底層平臺學習的成本。

采用基于元數據邏輯模型的文本模板替換算法實現組件元信息Java類的自動生成,處理流程如圖5所示。核心思想是定制一套文本模板,模板分為靜態和動態部分。根據組件元數據信息的不同,組件生成引擎加載文本模板,將靜態部分直接復制,動態部分根據元數據信息生成不同的代碼,最終自動化生成元信息Java文件。元信息代碼生成工作方式如圖6所示,元數據邏輯模型本質是標識組件元信息的一套鍵值對。文本模板顯式標明了這些這些鍵值對該被替換的位置,替換算法的任務就是將文本模板的變量替換和根據底層物理平臺不同集成實現不同的抽象類。

圖5 組件元信息自動生成處理流程

圖6 元信息代碼生成工作方式

替換算法將文本模板中帶有$符號的變量被替換成參數鍵值對中實際值,按照底層平臺模型不同分別選擇繼承AbstractJavaModule、AbstractHiveModule、AbstractSqoopModule或AbstractMapReductModule不同的類。這些支持底層平臺的抽象類是預先寫好的,只要選擇需要的類型繼承。替換算法的偽代碼如算法1所示,首先將文本模板讀入輸入流中,然后遍歷參數鍵值對,查找文本模板輸入流中的相應Key值,替換成Value即可。另外Haflow具有可擴展性,組件元信息中可實現用戶自定義的組件配置參數處理,用戶利用鍵值對<$type,custom>標記參數里有需要自定義處理的類型。然后給出自定義的處理方法,替換算法會用該方法重寫上面提到的抽象類中的getArguments方法。最后給出生成的組件元信息Java類。

算法1替換算法

Input: ModulePropertyMap, ModuleTemplate

Output: ModuleMetaJavaFile

Read ModuleTemplate file into MTInputStream;

for each MP in MoudlePropertyMap:

key ← MP.key; value ← MP.value

//用戶自定義類型,需重寫讀取參數方法

if key==type && value==custom:

needtooverride is true

Endif

//將文本模板中的變量替換成參數鍵值對中的實際值

replace key in MTInputStream to value

if needtooverride is true

override getArguments function

Endif

Write MTInputStream into ModuleMetaJavaFile

3.2基于Soot控制流的靜態組件代碼檢測

開源算法對于命令行輸入輸出的處理多樣化,不同的代碼有不同的處理邏輯,要找到代碼中對于特定參數的讀寫語句是一個十分復雜繁瑣的工作。主要有兩個難點:找到輸入文件地址從命令行參數變量開始到最終被賦值的存儲輸入文件地址的變量;找到對該變量進行文件讀寫的語句。

以Mahout中的單機代碼TrainLogistic為例,代碼的部分相關片段如下:

public class TrainLogistic{

private static String inputFile;

?

public static void main(String[] args){

mainToOutput(args,new PrintWriter());

}

static void mainToOutput(String[] args,PrintWriter o){

if(parseArgs(args)){

BufferedReader in= open(inputFile);

?

}

}

private static boolean parseArgs(String[] args){

Option inputFile = builder.withLongName(″input″)

?

CommandLine cmdLine=parse.parseAndHelp(args);

TrainLogistic.inputFile=getStringArgument(cmdLine,inputFile);

}

從中可以看出,輸入文件參數從Main函數的命令行參數讀入后,并未在Main函數體內直接處理,而是傳遞多次到parseArgs函數中。而該函數體中又沒有對args參數直接處理,而是調用了其他類的函數進行處理。經過多次非本類的成員函數處理后,最終賦值給本類的成員變量InputFile,這才完成了兩個難點中的第一步。找到最終的InputFile變量后,查看對其文件讀寫語句,發現inputFile作為函數open的調用參數,分析open函數體內語句,最終找到對inputFile變量的文件處理語句,完成了難點中的第二步。

為了解決以上兩個難點,我們采用Soot代碼分析工具來獲得代碼的控制流圖UnitGraph,從而跟蹤代碼對輸入參數的處理語句。

基于Soot控制流的靜態代碼檢測算法核心思想如下:

1) 從處理args的函數作為入口,跟蹤args中保存輸入或輸出路徑的變量被傳遞到的函數和變量;

2) 根據變量類型以及對其的相關處理判斷這些變量是目標輸入輸出變量的可能性;

3) 將可能是目標變量的作為“污染”變量;

4) 進一步跟蹤,發現“污染”變量作為參數的函數,且函數返回值是InputStream、OutputStream、Reader、Writer及其子類,且函數調用是第三方類庫中的函數或者初始化構造函數時,報警該行;

5) 重復步驟2)-步驟4),直到算法分析完。

為了實現以上算法,需要利用Soot中的一些基本對象和方法。Scene用來保存整個分析發生的場景,可以設置要分析的包含main函數的類和應用類,以及采用過程間還是過程內分析。SootClass是裝入Soot中的單個類,而SootMethod是類中的一個方法,Body是存儲SootMethod的實現代碼,Unit是Body中具體的語句,UnitsChain是Body中Units組成的鏈,UnitGraph表示一個具體方法生成的控制流圖,Unit有多種類型。例如定義語句IdentityStmt、調用語句InvokeStmt、賦值語句AssignStmt以及判斷語句IfStmt、跳轉語句GotoStmt等。Local表示臨時變量,Field是成員變量,兩者都叫作Value。

結合Soot的基本對象和方法,基于以上核心思想,得到最終的靜態檢測算法如算法2所示。

算法2基于Soot控制流的靜態代碼檢測算法

Input: classname,classpath,key, IORegex

Output: JavaSourceCodeLineNum, WarnLevel

MAIN(String,String,String,String)

globalTargetList←Null

//全局變量,用來保存成員變量中屬于目標變量的部分

load classes into Scene

//配置分析場景

set whole mode

//設置為過程間分析模式

methods←sootclass.getMethods

for each method in methods:

if method is Main:

call ANALYSIS(method, paras)

End MAIN

ANALYSIS(SootMethod,Int[])

paraList←Null

//記錄該函數的調用參數變量

localTargetList←Null

//記錄函數體內目標變量

taintList←Null

//記錄被key污染的變量

body←get body from method

graph← new UnitGraph(body)

for each unit in graph

switch condition in rule 1

case 1:

get newMethod and newParas

ANALYSIS(newMethod,newParas)

case 2:

add to paraList,globalTargetList, taintList or localTargetList

if returnType in IORegex

print line based on rule 2

End ANALYSIS

輸入數據是待分類組件實體的類名、類所在的路徑、命令行參數args中與輸入或輸出相關的關鍵字、需要捕獲的函數返回值類型對應的正則表達式(即輸入輸出流及其子類)。輸出是單機讀寫輸入或輸出文件的Java源代碼所在的行以及該行的危險度級別。算法包括一個主函數MAIN,完成將類轉換成中間代碼的準備工作,并且獲得類中的所有方法。算法還包括靜態代碼分析函數ANALYSIS,該函數用來分析類中單獨的方法片段,調用參數是SootMethod和調用參數中需要被跟蹤的參數位置。ANALYSIS遍歷要分析方法的UnitGraph,按照表1作出相應的動作,包括遞歸調用ANALYSIS方法或者將相關變量加入四個List中的一個。當正在遍歷的unit語句返回值符合IORegex,并且參數在四個List中時,按照表2給出報警的源代碼行數和報警級別。其中重點介紹四個List,四個List都是用來記錄與輸入的Key相關的變量。paraList是用來保存函數調用參數中與key相關的變量,localTargetList用來記錄某個方法內部與key直接相關的臨時變量,taintList是間接相關的臨時變量。兩者的區別是targetList是我們要找的value值所在的變量,而taintList是可能為value值的變量。最后將跨函數的變量,比如成員變量,存儲在globalTargetList中。

表1跟蹤規則

表2 報警規則

參數函數報警等級taintList中的變量第三方類庫函數低(L0)輸入流構造函數中(L1)targetList中的變量第三方類庫函數中(L1)輸入流構造函數高(L2)paraList中的變量第三方類庫函數中(L1)輸入流構造函數高(L2)

4實驗驗證

4.1實驗目的和數據選取

實驗是為了驗證基于Soot控制流的靜態代碼檢測算法的準確性。使用該算法能夠將檢測出開源算法庫中對輸入輸出關鍵詞單機讀寫的代碼,從而找到代碼中不滿足Haflow要求的代碼行,給出報警。選取機器學習領域著名的開源算法Mahout中的例子以及要集成進Haflow的開源文本分析算法進行實驗。

4.2評價標準

采用準確率(P)、召回率(R)、有效性(E)三者結合的評價標準,定義算法給出的報警語句數目為NumOfWarn。其中確實判斷正確的語句數目為NumOfRight,待檢測的類中實際應該報警的語句數目為NumOfShouldWarn。當語句被正確報警時,給出的報警等級與實際報警等級相符的語句數目為NumOfRightLevel,給出評價標準公式如下:

(1)

(2)

(3)

4.3實驗結果

首先給出兩個測試案例,mahout-examples包中TrainLogistic類是單機處理輸入輸出文件的類[10]。使用該類對本文提到的算法進行測試,定位類中對輸入單機處理的代碼行并且報警。算法得到的結果和人工審核結果對比如表3所示,可以看出準確率75%,召回率100%,有效性67%。

表3 TrainLogistic中輸入處理報警的行

定位類中對輸出單機處理的代碼行并且報警,算法得到的結果和人工審核結果對比如表4所示,準確率75%,召回率100%,有效性100%。

表4 TrainLogistic中輸出處理報警的行

按照以上方法,對mahout-example中的其他以main函數為入口的主類用該方法進行測試,給出測試結果如圖7所示。

圖7 mahout-example中部分代碼的實驗結果

從結果中可以看出,該算法的召回率一直穩定在100%,這就保證了該方法不會漏掉開源代碼中有問題的代碼片段。從圖7中可以看出,前十一個程序都是單機程序,其準確率平均值為73%,表明找到的語句基本與輸入輸出處理相關;后五個代碼的準確率為0,這是由于后五個代碼均是MapReduce代碼,并沒有需要修改的代碼。前十一個程序的有效性平均值為91%,表明算法對于認為有問題的語句給出的相關性判斷即報警等級基本正確。利用報警等級來優化了算法的準確率,開發人員可以優先修改報警等級高的語句,大大提高了工作效率。

5結語

大數據分析工具的組件開發和集成往往非常復雜,缺少自動化的方法。結合大數據分析工具Haflow,本文提出了一種大數據分析組件自動化開發集成的方法。方法主要包括組件元信息代碼自動生成和開源組件代碼的靜態檢測兩方面。利用開源Mahout代碼對靜態檢測算法進行實驗驗證,結果表明,該算法效果較好,能夠相對準確地找到開源代碼中需要修改的語句,方便開源組件的集成。在未來的工作中,將進一步考慮利用Soot代碼生成的方法,自動化修改有問題的代碼行,從而進一步提高組件集成的自動化程度。

參考文獻

[1] 趙薇,劉杰,葉丹.基于組件的大數據分析服務平臺[J].計算機科學,2014,41(9):75-79.

[2] Hall M,Frank E,Holmes G,et al.The WEKA data mining software:an update[J].ACM SIGKDD explorations newsletter,2009,11(1):10-18.

[3] Ihaka R,Gentleman R.R:a language for data analysis and graphics[J].Journal of computational and graphical statistics,1996,5(3):299-314.

[4] Bouckaert R R,Frank E,Hall M,et al.WEKA Manual for Version 3-7-8[EB/OL].http://prdownloads.sourceforge.net/weka/WekaManual-3-7-12.pdf.

[5] 黃斌,許舒人,蒲衛.基于MapReduce的數據挖掘平臺設計與實現[J].計算機工程與設計,2013,34(2):495-501.

[6] Vallée-Rai R,Co P,Gagnon E,et al.Soot-a Java bytecode optimization framework[C]//Proceedings of the 1999 conference of the Centre for Advanced Studies on Collaborative research.IBM Press,1999:13.

[7] Einarsson A,Nielsen J D.A survivor’s guide to Java program analysis with soot[EB/OL].http://www.brics.dk/SootGuide/sootsurvivorsguide.pdf.

[8] 李遠玲,陳華,劉麗.Soot的Java程序控制流分析及圖形化輸出[J].計算機系統應用,2009,18(10):88-92.

[9] 佟超,王建新,齊建東.基于形式化規約的缺陷規則庫構建與檢測方法[J].Computer Engineering and Applications,2014,50(13):66-72,102.

[10] Anil R,Dunning T,Friedman E.Mahout in action[M].Manning,2011.

收稿日期:2015-02-06。國家自然科學基金項目(61170074,6120 2065);國家科技支撐計劃項目(2015BAH06F01,2012BAH14B02)。陳茜,碩士生,主研領域:大數據分析,軟件工程。吳懷林,工程師。馬志柔,工程師。劉杰,副研究員。鐘華,研究員。

中圖分類號TP3

文獻標識碼A

DOI:10.3969/j.issn.1000-386x.2016.07.008

AN AUTOMATIC DEVELOPMENT AND INTEGRATION APPROACH FOR BIG DATA ANALYSIS MODULES

Chen Xi1,2Wu Huailin2Ma Zhirou2Liu Jie2Zhong Hua2

1(UniversityofChineseAcademyofSciences,Beijing100049,China)2(InstituteofSoftware,ChineseAcademyofSciences,Beijing100190,China)

AbstractAs the coming of big data era, the need of data analysis is becoming increasingly diverse, this results in the incapability of big data analysis tools to meet the customised data analysis requirements by using its own build-in algorithm libraries, to develop or integrate new algorithm is urgently necessary. But existing big data analysis tools algorithm has high learning cost in development and integration, and makes it difficult to develop and integrate a new one. This paper proposes an approach targeted at the automatic algorithms development and integration for big data analysis tools, the algorithms are integrated into analysis tools as modules. The approach first defines the module model, and then presents the automatic generation flow of the module model, finally it puts the emphasis on analysing the automatic code generation and code detection method of modules, and proposes the metadata-based code generation scheme and the Soot control flow-based static code detection algorithm. As the experiment shows, this approach can complete the automatic development and integration for big data analysis modules.

KeywordsBig data analysisModuleSoot control flow analysisCode generation

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 最新日韩AV网址在线观看| 国产欧美一区二区三区视频在线观看| 国产综合色在线视频播放线视| 91精品啪在线观看国产60岁| 综合成人国产| 黄色网页在线观看| 亚洲精品爱草草视频在线| 国产免费久久精品99re丫丫一| 日韩福利在线观看| 911亚洲精品| 国内熟女少妇一线天| 99久久亚洲综合精品TS| 97超碰精品成人国产| 日韩精品一区二区深田咏美| 女人av社区男人的天堂| 综合色亚洲| 久久国语对白| 中文字幕一区二区人妻电影| 日韩一区精品视频一区二区| 久久中文电影| 色综合五月| 日本不卡在线播放| 国产成人AV男人的天堂| 欧美自慰一级看片免费| 国内精品免费| 免费大黄网站在线观看| 在线观看国产黄色| 欧美在线视频不卡第一页| 亚洲综合18p| 国产精品综合色区在线观看| 国产亚洲精品无码专| 国产国语一级毛片在线视频| 成人久久精品一区二区三区| 国产精品片在线观看手机版 | 91精品小视频| 谁有在线观看日韩亚洲最新视频| 国产理论最新国产精品视频| 亚洲日韩AV无码一区二区三区人 | 久久久久青草大香线综合精品 | 亚洲国语自产一区第二页| 99久视频| 久久无码高潮喷水| 青青草原偷拍视频| 乱系列中文字幕在线视频| 国产精品大白天新婚身材| 在线观看视频99| 国产一区二区网站| 欧美成人免费| 亚洲成人一区在线| 国产亚洲视频中文字幕视频| 日日噜噜夜夜狠狠视频| 国产成人1024精品| 精品偷拍一区二区| 中文字幕人妻无码系列第三区| 亚洲日韩久久综合中文字幕| 999精品在线视频| 国产午夜在线观看视频| 中文字幕人成人乱码亚洲电影| 婷婷开心中文字幕| 麻豆a级片| 天天综合天天综合| 久久综合干| 亚洲人成色在线观看| 最新午夜男女福利片视频| 久久久久人妻精品一区三寸蜜桃| 91久草视频| 亚洲色图另类| 日日拍夜夜操| 国产成人8x视频一区二区| 91福利片| 成人另类稀缺在线观看| 麻豆精品在线播放| 国产精品成人一区二区不卡 | 欧美区国产区| 国产男女免费视频| 免费人成在线观看视频色| 最新日韩AV网址在线观看| 一本大道无码日韩精品影视| 日本国产精品一区久久久| 伊人国产无码高清视频| 亚洲精品天堂在线观看| 国产成人精品综合|