久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Java JDBC連接Hive實(shí)戰(zhàn):HiveServer2原理與五大避坑經(jīng)驗(yàn)

Java JDBC連接Hive實(shí)戰(zhàn):HiveServer2原理與五大避坑經(jīng)驗(yàn) 簡介面向Java與大數(shù)據(jù)開發(fā)者以Hive JDBC連接為主題提供一套可直接運(yùn)行的基礎(chǔ)操作示例覆蓋通過Hive查詢語句創(chuàng)建表、插入記錄、查詢結(jié)果等常用場景也包含Kerberos認(rèn)證連接時(shí)的URL與參數(shù)配置參考。整個(gè)壓縮包共22個(gè)文件包括Maven配置xml、Java源碼、編譯后的class文件以及依賴jar包合計(jì)約24.97MB目錄結(jié)構(gòu)清晰可快速定位主程序和資源文件。已有2444人瀏覽學(xué)習(xí)適合正在入門Hive大數(shù)據(jù)開發(fā)、需要參考JDBC連接寫法或搭建實(shí)驗(yàn)環(huán)境的讀者。資源整合了驅(qū)動(dòng)依賴引入方式、連接建立步驟、結(jié)果集遍歷處理和資源釋放規(guī)范導(dǎo)入IDE后即可對(duì)照源碼理解并執(zhí)行能幫助開發(fā)者快速掌握J(rèn)DBC與Hive交互的完整實(shí)現(xiàn)思路。示例還保留了打包運(yùn)行所需的target目錄與構(gòu)建配置可據(jù)此修改訪問地址、賬號(hào)密碼或認(rèn)證信息進(jìn)一步擴(kuò)展為數(shù)據(jù)導(dǎo)入、ETL等小型應(yīng)用也可作為后續(xù)接入Spring JdbcTemplate或MyBatis的起點(diǎn)。1. 用Java JDBC連Hive不只是跑通一個(gè)查詢那么簡單作為一個(gè)常年寫Java的工程師你可能閉著眼就能寫出MySQL的JDBC連接代碼但把URL換成jdbc:hive2://之后很多習(xí)慣都不成立了。Hive本身不是數(shù)據(jù)庫它沒有存儲(chǔ)過程、沒有事務(wù)甚至沒有專用查詢端口Java JDBC連接Hive數(shù)據(jù)實(shí)際是連接它背后的HiveServer2服務(wù)讓服務(wù)端去調(diào)度MapReduce或Tez完成計(jì)算。標(biāo)題里點(diǎn)名了“簡單的操作”但真從零開始做一遍可能會(huì)撞上驅(qū)動(dòng)包沖突、認(rèn)證方式不明、查詢卡死等一堆問題。這篇文章面向有Java基礎(chǔ)、但對(duì)Hive JDBC只有模糊概念的讀者從連接原理講到最小工程再講到五條值得記錄的踩坑經(jīng)驗(yàn)讓你不至于在第一步就翻車。2. 先搞懂Hive JDBC的底層鏈路HiveServer2與驅(qū)動(dòng)選擇2.1 Hive JDBC不是連數(shù)據(jù)庫是連HiveServer2很多入門教程把“JDBC連Hive”說得和“JDBC連MySQL”一樣簡單這可太誤導(dǎo)了。Hive是一個(gè)數(shù)倉工具它把SQL翻譯成分布式計(jì)算任務(wù)底層對(duì)象是HDFS上的目錄和文件。Hive的元數(shù)據(jù)庫、表、字段、分區(qū)都存在MetaStore一般運(yùn)行在獨(dú)立進(jìn)程里而負(fù)責(zé)接收客戶端請(qǐng)求的進(jìn)程是HiveServer2簡稱HS2。所以Java程序用JDBC連上HS2本質(zhì)上是建立一個(gè)Thrift會(huì)話然后把SQL字符串丟給HS2由它完成編譯、優(yōu)化、執(zhí)行和結(jié)果回收。你手里的Connection對(duì)象并不是在和某個(gè)數(shù)據(jù)庫實(shí)例對(duì)話而是在和HS2的會(huì)話服務(wù)對(duì)話。理解這一點(diǎn)前先記住一條關(guān)鍵結(jié)論Hive JDBC有一套獨(dú)立的驅(qū)動(dòng)和URL協(xié)議和MySQL、Oracle完全不同。MySQL用com.mysql.cj.jdbc.DriverURL寫jdbc:mysql://ip:3306/db?useSSLfalse而Hive的驅(qū)動(dòng)是org.apache.hive.jdbc.HiveDriverURL以jdbc:hive2://開頭。別小看這后半段它決定了HS2的認(rèn)證方式、底層的傳輸模式以及會(huì)話超時(shí)參數(shù)。如果你還停留在“JDBC只是換一個(gè)驅(qū)動(dòng)類”的認(rèn)知后面排查問題時(shí)會(huì)很痛苦。HiveServer2本身是一個(gè)常駐的JVM進(jìn)程你可以把它理解成“SQL網(wǎng)關(guān)”。它內(nèi)部對(duì)接了執(zhí)行引擎可以是MapReduce、Tez或Spark。默認(rèn)配置下如果你什么都不改HS2會(huì)監(jiān)聽在0.0.0.0:10000但這不代表你的客戶端就能連上因?yàn)橹虚g還隔著防火墻、用戶權(quán)限和認(rèn)證配置。常見的錯(cuò)誤是Hive已經(jīng)安裝好了卻沒有人啟動(dòng)HS2于是JDBC報(bào)告拒絕連接。在動(dòng)手寫Java代碼之前先確認(rèn)這個(gè)服務(wù)是活的并且端口能被你的開發(fā)機(jī)訪問到。關(guān)于“為什么連接Hive要用HS2而不是連MetaStore”還有一個(gè)容易混淆的點(diǎn)MetaStore暴露的是Thrift接口端口通常是9083它只負(fù)責(zé)元數(shù)據(jù)讀寫不執(zhí)行SQL查詢。如果你用JDBC去連9083協(xié)議完全不兼容立馬報(bào)錯(cuò)。所以只要看到j(luò)dbc:hive2://它的目標(biāo)一定是HS2的端口也就是默認(rèn)的10000。如果要把Hive的安裝與配置做扎實(shí)也請(qǐng)把hive-site.xml中的hive.server2.thrift.port和hive.metastore.uris這兩樣參數(shù)拆開記清楚一個(gè)是SQL入口一個(gè)是元數(shù)據(jù)入口別搞混。2.2 驅(qū)動(dòng)類與URL格式Class.forName和jdbc:hive2://怎么匹配現(xiàn)在來看Java代碼里最直接的驅(qū)動(dòng)類。Hive 1.x時(shí)代的老驅(qū)動(dòng)類名是org.apache.hadoop.hive.jdbc.HiveDriverHive 2.0之后被新接口取代改成了org.apache.hive.jdbc.HiveDriver。如果項(xiàng)目中依賴的是Hive 3.x的hive-jdbc包加載的驅(qū)動(dòng)類一定是后者。很多教程還停留在老寫法用了老驅(qū)動(dòng)類不僅代碼風(fēng)格陳舊還可能和當(dāng)前的Hadoop版本沖突。我的建議是在新項(xiàng)目里只認(rèn)準(zhǔn)org.apache.hive.jdbc.HiveDriver這一個(gè)即使顯式寫Class.forName也不容易出錯(cuò)。完整URL長這樣jdbc:hive2://hive-server.example.com:10000/default;authnoauth;socketTimeout60;transportModebinary不要把它和MySQL的URL混為一談。Hive的URL里除了host:port/dbName后面用分號(hào)拼接參數(shù)不是用問號(hào)和。常用的參數(shù)有auth指定認(rèn)證方式取值是noauth、kerberos、ldapsocketTimeout以秒為單位控制底層socket超時(shí)默認(rèn)是0表示不超時(shí)生產(chǎn)環(huán)境最好顯式設(shè)置否則一個(gè)卡住的任務(wù)會(huì)讓線程掛很久transportMode取binary或http前者是HS2默認(rèn)端口后者會(huì)走HTTP網(wǎng)關(guān)配合httpPath使用。這些參數(shù)不是擺設(shè)你會(huì)在第5章看到它們引發(fā)的實(shí)際問題。顯式加載驅(qū)動(dòng)在JDBC 4.0之后不是必須的因?yàn)镈riverManager能從classpath中自動(dòng)發(fā)現(xiàn)META-INF/services里的驅(qū)動(dòng)。但是如果開發(fā)環(huán)境里同時(shí)存在多個(gè)JDBC驅(qū)動(dòng)或者你把hive-jdbc包用shade插件打進(jìn)了FatJarSPI可能失效這時(shí)在代碼里保留一行Class.forName(org.apache.hive.jdbc.HiveDriver)能減少不少玄學(xué)問題。這行代碼不會(huì)被記入什么“先進(jìn)做法”但它是穩(wěn)定兜底至少能讓ClassNotFoundException這個(gè)報(bào)錯(cuò)早一點(diǎn)暴露。把URL和驅(qū)動(dòng)類對(duì)應(yīng)起來之后還要理解“庫名”的語義。URL中間的那段dbName代表你要進(jìn)入的Hive數(shù)據(jù)庫比如default。你可以在每次打開連接時(shí)指定它也可以在連接后通過stmt.execute(use db)來切換。不過Hive JDBC的Connection.setCatalog、setSchema實(shí)現(xiàn)并不像MySQL那么完整很多版本壓根不支持所以最可靠的辦法還是把數(shù)據(jù)庫名直接寫進(jìn)URL里。順帶一提如果在URL中省略dbName連接會(huì)落到default庫建議不要依賴這個(gè)缺省值顯式寫清楚后面讀代碼的人也更舒服。3. 從零搭一個(gè)可復(fù)現(xiàn)的連接工程依賴、配置與最小示例3.1 環(huán)境準(zhǔn)備Hive的安裝與配置里最影響JDBC的三個(gè)點(diǎn)在你新建Maven工程之前先把服務(wù)端準(zhǔn)備好。假設(shè)你已經(jīng)完成了Hive的安裝與配置那至少要讓這三個(gè)點(diǎn)立住第一HiveServer2的綁定地址和端口要和開發(fā)機(jī)可達(dá)第二HS2和MetaStore兩個(gè)進(jìn)程都在運(yùn)行第三用于連接的用戶有HDFS上讀寫對(duì)應(yīng)目錄的權(quán)限。第三個(gè)點(diǎn)特別容易被Java工程師忽略因?yàn)楸镜剡B接MySQL時(shí)數(shù)據(jù)庫賬號(hào)往往只管庫表權(quán)限但在Hive這里用戶最終要訪問HDFS文件沒有HDFS權(quán)限SQL能編譯卻會(huì)在執(zhí)行階段報(bào)PermissionDenied。啟動(dòng)HS2的標(biāo)準(zhǔn)姿勢是在Hive安裝目錄下執(zhí)行nohup hive --service metastore /tmp/metastore.log 21 nohup hive --service hiveserver2 /tmp/hiveserver2.log 21 這兩行命令分別啟動(dòng)了MetaStore和HiveServer2。注意順序一般建議先啟動(dòng)MetaStore再啟動(dòng)HS2因?yàn)镠S2啟動(dòng)時(shí)會(huì)去連接MetaStore。如果hive-site.xml里要求的MetaStore地址連不上HS2會(huì)直接啟動(dòng)失敗或在日志里刷滿連接異常。檢驗(yàn)是否啟動(dòng)成功可以執(zhí)行l(wèi)sof -i :10000查看端口監(jiān)聽或者直接跑beelinebeeline -u jdbc:hive2://localhost:10000/default -n hive如果Beeline能連上說明服務(wù)端本身沒問題接下來寫Java就少一個(gè)變量。如果你的HS2綁定的是內(nèi)網(wǎng)IP而不是0.0.0.0記得把hive.server2.thrift.bind.host改成對(duì)外可達(dá)的地址否則開發(fā)機(jī)永遠(yuǎn)連不上。這些配置散落在hive-site.xml里常見問題是有人改了hive-site.xml卻沒重啟HS2導(dǎo)致連不上時(shí)根本測不出問題。還有一個(gè)和環(huán)境一起出現(xiàn)的坑Hive JDBC的Maven依賴會(huì)拖出一大堆Hadoop和Guava的傳遞依賴。我的經(jīng)驗(yàn)是最好把hive-jdbc的依賴放在一個(gè)獨(dú)立的模塊里或者用maven-shade-plugin把依賴重新定位否則它和Spring Boot自帶的Guava版本沖突幾乎是家常便飯。版本選擇上可以直接使用與集群HIVE版本一致的坐標(biāo)比如3.1.3。不要盲目追新Hive的客戶端版本要比服務(wù)端版本略低或持平太高可能觸發(fā)協(xié)議不兼容。3.2 最小Java代碼建立連接、執(zhí)行查詢并打印結(jié)果現(xiàn)在可以寫Java了。先建一個(gè)最普通的Maven項(xiàng)目在pom.xml里加上依賴dependency groupIdorg.apache.hive/groupId artifactIdhive-jdbc/artifactId version3.1.3/version /dependency注意這個(gè)坐標(biāo)會(huì)傳遞引入hadoop-client、guava等一系列包。如果你不想在單測里被類的沖突折磨可以再用exclusions排除掉部分高版本Guava或者用shade插件處理。下面是最小可運(yùn)行的代碼它做的事是連上HS2并打印所有庫名import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class HiveJdbcSimple { public static void main(String[] args) { String url jdbc:hive2://192.168.1.10:10000/default;authnoauth; String user hive; String password ; try { Class.forName(org.apache.hive.jdbc.HiveDriver); } catch (ClassNotFoundException e) { e.printStackTrace(); return; } try (Connection conn DriverManager.getConnection(url, user, password); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(show databases)) { while (rs.next()) { System.out.println(rs.getString(1)); } } catch (SQLException e) { e.printStackTrace(); } } }這段代碼的邏輯很簡單先顯式加載HiveDriver再通過DriverManager.getConnection建立連接然后創(chuàng)建Statement執(zhí)行show databases。注意我用了try-with-resources這樣Connection、Statement、ResultSet會(huì)在使用完畢后自動(dòng)關(guān)閉避免連接泄漏。authnoauth表明這個(gè)HS2沒有開啟認(rèn)證user和password傳了也會(huì)被忽略但不傳user有時(shí)會(huì)觸發(fā)NPE所以建議保留。executeQuery返回的ResultSet和MySQL JDBC最大的不同是Hive JDBC的查詢是異步提交給HS2的executeQuery會(huì)阻塞等待作業(yè)執(zhí)行完成然后一次性緩沖返回結(jié)果。這意味著你的客戶端不能像MySQL那樣期待流式讀取數(shù)據(jù)量大時(shí)JVM堆可能被打爆。這個(gè)問題會(huì)在后面“避坑”章節(jié)細(xì)說?,F(xiàn)在只要知道跑通這個(gè)最小示例是后面所有操作的地基。如果你看到打印出的庫名列表恭喜你JDBC通路已經(jīng)打通。如果失敗建議先用Beeline跑同樣的URL這樣能把問題迅速定位在“Hive本身”還是“Java環(huán)境”。別一上來就懷疑自己的Java代碼Hive JDBC最常掛在服務(wù)端、網(wǎng)絡(luò)和依賴三件事上這些無法靠代碼修復(fù)。3.3 參數(shù)說明URL里的host、port、dbName與會(huì)話參數(shù)能把最小代碼跑通之后值得把URL里的參數(shù)吃得再透一點(diǎn)。host和port決定了你連哪臺(tái)機(jī)器這好理解dbName的作用也不只是定個(gè)默認(rèn)庫它還影響HS2做語句解析時(shí)的搜索路徑。比如你要查的表在ods庫URL寫成jdbc:hive2://host:10000/ods就能少寫一個(gè)庫前綴。如果表分布在多個(gè)庫那就在URL里寫default然后在SQL里寫ods.table_name。下面這張表是幾個(gè)常用參數(shù)的備查清單參數(shù)作用示例auth認(rèn)證類型noauth/kerberos/ldapauthkerberossocketTimeoutsocket層超時(shí)秒數(shù)0為不超時(shí)socketTimeout60transportMode傳輸方式binary或httptransportModehttphttpPath配合HTTP模式使用的網(wǎng)關(guān)路徑httpPathcliservicetimeZone會(huì)話時(shí)區(qū)影響時(shí)間類型轉(zhuǎn)換timeZoneAsia/Shanghai這些參數(shù)用分號(hào)拼接在URL尾部。還要注意如果某個(gè)參數(shù)值本身含特殊字符可能需要URL編碼這種情況多出現(xiàn)在Kerberos的principal里后面會(huì)提。另外Hive的會(huì)話參數(shù)并不都能通過URL設(shè)置比如你想讓某個(gè)查詢改用Tez引擎就得在每次連接后執(zhí)行stmt.execute(set hive.execution.enginetez)。這種set語句是會(huì)話級(jí)別的只對(duì)當(dāng)前Connection有效連接關(guān)閉后失效。通過JDBC設(shè)置會(huì)話參數(shù)比在HS2服務(wù)端全局修改要靈活得多。我一般在執(zhí)行復(fù)雜SQL前會(huì)在代碼里拼一個(gè)set mapreduce.job.reduces20之類的語句避免每個(gè)查詢都吃默認(rèn)配置。需要注意set語句的返回不是一個(gè)標(biāo)準(zhǔn)的ResultSet通常是一個(gè)只有一列字符串的結(jié)果集但如果你執(zhí)行的是set而不是set xxxHive會(huì)返回所有配置項(xiàng)這本身也是一個(gè)調(diào)試手段。還有一點(diǎn)容易忽略DriverManager.getConnection可能會(huì)在你的應(yīng)用里觸發(fā)大量的連接創(chuàng)建而HiveServer2每個(gè)連接都會(huì)占用一個(gè)會(huì)話線程。如果業(yè)務(wù)并發(fā)高務(wù)必在應(yīng)用層加連接池或限流否則HS2的線程數(shù)飆升最終表現(xiàn)為連接超時(shí)。這個(gè)話題留到第6章再展開但你現(xiàn)在至少要知道hive.server2.max.threads這個(gè)參數(shù)不是隨便設(shè)的它是HS2默認(rèn)線程池大小的上限。4. 實(shí)現(xiàn)簡單操作建表、寫入與查詢以及PreparedStatement的邊界4.1 用JDBC執(zhí)行DDL在Hive里建內(nèi)部表與外部表標(biāo)題里的“簡單操作”大部分是這三種建表、裝載數(shù)據(jù)、查詢。用JDBC執(zhí)行DDL和用Beeline操作幾乎一樣區(qū)別只是SQL語句不能有結(jié)尾分號(hào)也不需要額外傳腳本文件。下面這段代碼先檢查目標(biāo)表是否存在然后創(chuàng)建一個(gè)按日期分區(qū)的內(nèi)部表try (Connection conn DriverManager.getConnection(url, user, password); Statement stmt conn.createStatement()) { stmt.execute(create table if not exists ods.t_user_login ( user_id int, login_time string, device_type string) partitioned by (dt string) stored as orc); } catch (SQLException e) { e.printStackTrace(); }這里沒有用executeQuery因?yàn)镈DL語句不會(huì)返回結(jié)果集execute就夠了。邏輯上create table if not exists可以保證重復(fù)運(yùn)行時(shí)不會(huì)報(bào)錯(cuò)但從工程角度看如果表結(jié)構(gòu)改了這種自動(dòng)跳過會(huì)讓你的腳本悄悄失效。所以我更推薦在Java代碼里先查一下show create table的返回如果表存在且結(jié)構(gòu)不符就主動(dòng)告警而不是靜默跳過。關(guān)于內(nèi)部表和外部表的選擇內(nèi)部表的目錄由Hive管理drop時(shí)數(shù)據(jù)被刪掉外部表需要指定locationdrop時(shí)只刪元數(shù)據(jù)HDFS文件還在。用JDBC做自動(dòng)化建表時(shí)我強(qiáng)烈建議優(yōu)先考慮外部表尤其是讀取其他系統(tǒng)寫入的HDFS數(shù)據(jù)。因?yàn)镴DBC執(zhí)行DDL太順滑時(shí)容易讓人忘記表后面還有一份物理數(shù)據(jù)。如果你建表時(shí)沒寫external默認(rèn)就是內(nèi)部表后續(xù)要恢復(fù)一份數(shù)據(jù)就要重新裝載了。建表語句中分區(qū)字段dt string的位置是“partitioned by”它不能在普通字段列表里重復(fù)出現(xiàn)。有很多新手會(huì)在這里把dt既當(dāng)普通字段寫一遍又放在分區(qū)字段里Hive雖然不報(bào)錯(cuò)但查詢時(shí)會(huì)出現(xiàn)重復(fù)字段沖突這算是一個(gè)不成文的坑。在這里用stored as orc指定存儲(chǔ)格式也是建議的默認(rèn)值。ORC比TextFile在壓縮和統(tǒng)計(jì)信息上更適合數(shù)倉場景后文查坑時(shí)會(huì)看到它對(duì)小文件也有影響。4.2 裝載數(shù)據(jù)與查詢load data與select的JDBC寫法建表之后要裝載數(shù)據(jù)。如果數(shù)據(jù)已經(jīng)以文件形式放在HDFS上最直接的方式是執(zhí)行l(wèi)oad data。假設(shè)你已經(jīng)把login.log放到了HDFS的/data/20240901/目錄下Java代碼是這樣的String loadSql load data inpath /data/20240901/login.log overwrite into table ods.t_user_login partition (dt2024-09-01); try (Statement stmt conn.createStatement()) { stmt.execute(loadSql); }注意load data inpath會(huì)把HDFS上的文件“移動(dòng)”到表目錄里而不是復(fù)制。如果源目錄是業(yè)務(wù)系統(tǒng)的實(shí)時(shí)產(chǎn)出移動(dòng)后源數(shù)據(jù)就沒了這是一個(gè)很危險(xiǎn)的操作。我在生產(chǎn)環(huán)境里一般不會(huì)用load data inpath去接外部業(yè)務(wù)數(shù)據(jù)而是采用load data local inpath從HS2所在機(jī)器的本地目錄上裝載或者干脆用外部表指向那個(gè)目錄再通過msck repair table刷新分區(qū)。用JDBC執(zhí)行l(wèi)oad data時(shí)local的語義稍微有點(diǎn)繞如果寫的是local那么文件路徑是HS2服務(wù)端的本地路徑不是你Java程序所在機(jī)器的路徑。這一步有無數(shù)人踩坑因?yàn)殚_發(fā)環(huán)境里跑Java的機(jī)器和HS2通常不是同一臺(tái)。裝載完數(shù)據(jù)后寫一個(gè)帶統(tǒng)計(jì)的查詢String sql select dt, count(1) from ods.t_user_login where dt 2024-09-01 group by dt; try (Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql)) { while (rs.next()) { System.out.println(rs.getString(dt) \t rs.getLong(2)); } }Hive JDBC的ResultSet和MySQL相比存在以下區(qū)別默認(rèn)fetchSize是1000也就是說HS2一次性給客戶端的行數(shù)是有限的超過部分要在Java代碼里慢慢迭代getString(dt)按列名獲取是能用的但不保證所有版本都支持重復(fù)列名。建議能按列序號(hào)取的就按列序號(hào)取避免HS2在列別名解析上的差異。這個(gè)小細(xì)節(jié)在數(shù)據(jù)字段多、SQL別名復(fù)雜時(shí)尤其有用。load data還有一個(gè)隱藏的語義overwrite關(guān)鍵字會(huì)清空分區(qū)里已有的文件再放入新文件。如果你想追加數(shù)據(jù)就不要寫overwrite讓HS2把文件放進(jìn)去。但這里要提醒如果文件格式是ORC源文件格式和表格式不一致時(shí)load data不會(huì)做轉(zhuǎn)換它會(huì)直接把源文件放到表目錄里導(dǎo)致查出來是亂碼或零行。很多團(tuán)隊(duì)最終放棄load data改為在Hive里用insert把數(shù)據(jù)轉(zhuǎn)換一次就是這個(gè)原因。4.3 PreparedStatement在Hive JDBC里的使用邊界很多Java開發(fā)者一看到JDBC就習(xí)慣性地用PreparedStatement但在Hive JDBC上要格外冷靜。Hive JDBC驅(qū)動(dòng)對(duì)PreparedStatement的支持是“能用但功能很有限”。正則的?占位符在executeQuery里能工作但綁定參數(shù)的類型推斷有時(shí)會(huì)出錯(cuò)比如字符串參數(shù)被當(dāng)成列名或數(shù)字。更關(guān)鍵的是Hive不支持事務(wù)Connection的commit/rollback基本是空操作在執(zhí)行“寫操作”時(shí)executeUpdate的返回值也和各種數(shù)據(jù)庫都不一樣有的版本返回-1或0不能依賴于這個(gè)返回值判斷是否有數(shù)據(jù)變更??匆幌掠肞reparedStatement插入單條語句的嘗試String insertSql insert into table ods.t_user_login values (?, ?, ?, ?); try (PreparedStatement ps conn.prepareStatement(insertSql)) { ps.setInt(1, 1001); ps.setString(2, 2024-09-01 08:00:00); ps.setString(3, ios); ps.setString(4, 2024-09-01); ps.executeUpdate(); }這段代碼在Hive 3.x上能跑通但它會(huì)觸發(fā)一個(gè)MapReduce或Tez作業(yè)非常慢。如果循環(huán)一萬次就是一萬個(gè)作業(yè)產(chǎn)生的開銷和小文件數(shù)量都不可控。這里就涉及到“hive優(yōu)化小文件”的核心場景你在Java代碼里用insert into values一條條寫Hive在本質(zhì)上并不是行級(jí)數(shù)據(jù)庫每執(zhí)行一次都可能在HDFS上產(chǎn)生至少一個(gè)文件。我見過有人用這種寫法同步日志跑了一晚上表目錄下出現(xiàn)了上萬個(gè)小文件查詢性能一落千丈。正確姿勢是如果業(yè)務(wù)性質(zhì)是離線批量導(dǎo)入先寫臨時(shí)文件再用load data一次裝載如果數(shù)據(jù)原本在關(guān)系庫里應(yīng)該走Sqoop或編寫Flink/Spark的批量寫入而不是在JDBC里逐條insert。即使某些場景非用insert不可也盡量用insert into ... select ...配合distribute by或cluster by來控制最終生成的文件數(shù)。PreparedStatement在Hive里更大的價(jià)值不是避免SQL注入而是讓你把SQL模板化至于參數(shù)注入安全Hive JDBC實(shí)質(zhì)上把SQL原樣發(fā)給HS2注入風(fēng)險(xiǎn)反而要更認(rèn)真地對(duì)待。既然PreparedStatement有這個(gè)短板那就老老實(shí)實(shí)回到Statement。日常做數(shù)據(jù)校驗(yàn)或臨時(shí)查詢直接拼接SQL并不丟人只要你拼的是固定表名和硬編碼條件不把用戶輸入直接拼進(jìn)去。如果一定要用綁定變量先在你的Hive版本上做一次小實(shí)驗(yàn)把參數(shù)類型和結(jié)果集列類型打印出來比對(duì)。多數(shù)情況下你會(huì)發(fā)現(xiàn)與其和驅(qū)動(dòng)的限制搏斗不如改用Statement再用自定義的占位符替換。5. 常見問題與避坑從連接失敗到查詢卡死的5條血淚記錄5.1 連接失敗ClassNotFoundException、端口不可達(dá)與URL缺庫名現(xiàn)象程序一啟動(dòng)就拋ClassNotFoundException: org.apache.hive.jdbc.HiveDriver或者在DriverManager.getConnection時(shí)拋出Could not open client transport。前者說明依賴沒進(jìn)classpath后者說明網(wǎng)絡(luò)或服務(wù)不可達(dá)。原因往往有幾種Maven項(xiàng)目里只引入了老的hive-jdbc但類名寫錯(cuò)依賴被Scope為provided運(yùn)行期缺失或者HS2沒啟動(dòng)、防火墻擋了端口。解決方法是先分開驗(yàn)證用mvn dependency:tree查驅(qū)動(dòng)包是否引入再用telnet host 10000查端口最后用Beeline做同樣URL的連接測試。URL缺數(shù)據(jù)庫名導(dǎo)致的異常通常表現(xiàn)為“表找不到”或“Failed to Schema”其實(shí)只是因?yàn)槿睅烀孒S2用了你沒權(quán)限的默認(rèn)庫加上顯式的dbName基本能處理掉。5.2 查詢卡死fetch size、作業(yè)排隊(duì)與執(zhí)行引擎現(xiàn)象SQL明明不復(fù)雜但executeQuery遲遲不返回甚至幾分鐘過去了還沒結(jié)果。原因不只是JDBC慢可能還有兩個(gè)一是HS2把SQL提交給了YARN但集群里任務(wù)隊(duì)列滿作業(yè)一直排隊(duì)二是Hive JDBC在結(jié)果集拉取時(shí)默認(rèn)用fetchSize1000當(dāng)結(jié)果集很大但你又想一次性裝進(jìn)List時(shí)JVM一直在累積數(shù)據(jù)看起來就像卡住。解決方法是先把stmt.setFetchSize(100)調(diào)小同時(shí)在SQL里加limit來限制規(guī)模其次要去看HS2日志或YARN頁面確認(rèn)作業(yè)是在ACCEPTED還是RUNNING狀態(tài)。如果連的是同一套集群把hive.execution.engine切到tez往往能縮短調(diào)度時(shí)間但不要隨便在URL里加這個(gè)參數(shù)它屬于會(huì)話級(jí)設(shè)置需要顯式set。5.3 小文件問題JDBC寫入后如何避免HDFS小文件失控現(xiàn)象用JDBC循環(huán)寫了幾萬行后表目錄里出現(xiàn)數(shù)十個(gè)幾十KB的文件查詢時(shí)NameNode壓力變大跑MapReduce的map數(shù)也跟著爆炸。原因就是前面提到的“逐條insert into values”以及l(fā)oad data時(shí)直接丟入過多小文件。解決方向有三個(gè)第一批量裝載時(shí)先合并輸入文件例如在HDFS上把多段小日志合并成200MB以上的大文件第二用insert overwrite ... select ... distribute by ...作為轉(zhuǎn)換和合并的手段讓Reducer個(gè)數(shù)和數(shù)據(jù)分布匹配第三配置Hive的自動(dòng)合并參數(shù)比如hive.merge.mapredfilestrue、hive.merge.size.per.task這些參數(shù)屬于“hive優(yōu)化小文件”的通用手段不只局限于JDBC場景。我的踩坑經(jīng)歷是做數(shù)據(jù)清洗任務(wù)時(shí)在JDBC里用了insert into ... values做全量回刷結(jié)果一個(gè)分區(qū)下多出幾百個(gè)小文件?,F(xiàn)在只要通過JDBC寫數(shù)據(jù)我都會(huì)確認(rèn)目標(biāo)是“一次一個(gè)作業(yè)”而不是碎片化插入。5.4 時(shí)區(qū)與類型轉(zhuǎn)換TIMESTAMP和DECIMAL的坑現(xiàn)象表里存的時(shí)間是2024-09-01 12:00:00通過JDBC讀到Java里卻變成了2024-09-01 04:00:00或者BigDecimal取出的標(biāo)度比預(yù)期多幾位。原因通常有兩個(gè)Hive底層時(shí)間戳以UTC存儲(chǔ)JDBC連接時(shí)沒有指定timeZone驅(qū)動(dòng)按默認(rèn)時(shí)區(qū)轉(zhuǎn)換DECIMAL在Hive里是二進(jìn)制格式JDBC驅(qū)動(dòng)在getObject時(shí)可能返回一個(gè)帶大量尾數(shù)的BigDecimal。解決方法是URL里加timeZoneAsia/Shanghai并在Java側(cè)統(tǒng)一LocalDateTime解析對(duì)于DECIMAL顯式用rs.getBigDecimal(col).setScale(2, RoundingMode.HALF_UP)而不是直接用getObject。如果你還在為“為什么同一張表用Beeline和用Java讀出來不同”發(fā)愁第一時(shí)間去查連接串和時(shí)區(qū)而不是懷疑Hive數(shù)據(jù)被寫壞了。5.5 Kerberos與安全集群認(rèn)證參數(shù)怎么給現(xiàn)象本地開發(fā)環(huán)境連測試HS2好好的一連接安全集群就報(bào)GSSException: No valid credentials provided或Authentication failed。原因是在Kerberos開啟的集群里HS2要求客戶端必須先拿到Ticket-Granting Ticket。解決方式分兩步啟動(dòng)Java進(jìn)程時(shí)帶上-Djava.security.krb5.conf/etc/krb5.conf在代碼里使用UserGroupInformation.loginUserFromKeytab完成登錄然后連接URL里寫明;principalhive/hostnameREALM;authkerberos。如果你不想寫代碼開發(fā)期可以先用kinit在本地獲取憑證再運(yùn)行Java進(jìn)程。一個(gè)常見的誤用是給noauth的集群也配上Kerberos參數(shù)這不會(huì)讓連接更安全反而會(huì)誘導(dǎo)驅(qū)動(dòng)走錯(cuò)誤的認(rèn)證流程。判斷集群到底開沒開認(rèn)證直接看HS2日志里的AuthType或Beeline用-u jdbc:hive2://host:10000/;authnoauth是否能連通用最小實(shí)驗(yàn)做界定再去調(diào)整Java端。6. 進(jìn)階把連接池、日志與驗(yàn)證方法用起來6.1 用連接池管理Hive連接Hive連接并不“輕”一個(gè)Connection背后就是一個(gè)HS2會(huì)話HS2會(huì)為會(huì)話分配一組線程資源。如果應(yīng)用只做低頻查詢直接用裸連接就夠了但如果要嵌入數(shù)據(jù)服務(wù)建議還是引入HikariCP這樣的連接池。配置時(shí)最大連接數(shù)不要照搬MySQL的50、100我會(huì)控制在510個(gè)因?yàn)檎嬲牟l(fā)是HS2服務(wù)端線程不是連接數(shù)。HikariCP初始化時(shí)設(shè)置connectionTestQuery為select 1實(shí)際上Hive JDBC不一定支持這個(gè)語法但HS2會(huì)將select 1翻譯成MapReduce里的一個(gè)小任務(wù)代價(jià)很重。所以更合適的測試方式是validationTimeout短一點(diǎn)并且不用connectionTestQuery讓連接池只依賴setAutoCommit(false)這類輕量調(diào)用去檢測存活。每個(gè)集群規(guī)模、任務(wù)跑法不同最終還是需要壓測后再調(diào)整。6.2 驗(yàn)證你的操作是否真正生效寫完“簡單操作”之后驗(yàn)證環(huán)節(jié)比寫代碼更重要。我的習(xí)慣是每次都開著Beeline做對(duì)照。比如通過JDBC執(zhí)行create table后立刻在Beeline里show create table確認(rèn)表結(jié)構(gòu)執(zhí)行l(wèi)oad data后用hdfs dfs -ls /user/hive/warehouse/ods.db/t_user_login/dt2024-09-01看文件塊大小和數(shù)量執(zhí)行查詢后去YARN的Application頁面看日志確認(rèn)是Tez還是MapReduce以及各階段IO都跑完。還有一個(gè)很容易被忽略的驗(yàn)證點(diǎn)用JDBC的isValid方法或者再執(zhí)行一條select 1來確認(rèn)連接還活著但這在Hive上代價(jià)不小所以放一條真實(shí)的小查詢比isValid更有說服力。這套驗(yàn)證習(xí)慣是從一次翻車?yán)飺Q來的。幾年前我在一個(gè)數(shù)據(jù)平臺(tái)項(xiàng)目里想當(dāng)然地認(rèn)為Hive JDBC和MySQL JDBC一樣可以批量更新事務(wù)數(shù)據(jù)結(jié)果用PreparedStatement循環(huán)插了一晚上第二天一查不僅性能慘不忍睹還留下了一堆小文件。后來我改變了做法凡是能用load data一次完成的絕不用循環(huán)insert凡是能在Beeline里先驗(yàn)證的絕不在Java代碼里賭一把。希望這些經(jīng)驗(yàn)和坑位清單能幫到你在Java JDBC連接Hive這條路上少走一段彎路。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品成人AV片免费看网站 | 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 欧美色图成人网一区二区| 日韩av无码网站| 97久久国产亚洲精品超碰热| 久久綜合很很很| 亚洲免费看片| 91强热人妻| 东京热一区二区中文字幕| 国产精品久久久久999| 五月天婷婷色| 性爱乱伦网址| 91av一区二区在线观看| 国产在线能看的你懂的| 亚洲男人天堂2017| 中文字幕色AV| 超碰免费欧美7| 911av网站免费观看| 97色欧洲| 91色s| 青青欧洲黑| 97亚洲综合电影| 日本精品一区二区中文字幕| 亚洲国产高清福利视频| 久久精品国产AV一区二区三区| 97在线/亚洲| 蜜桃臀AV在线| 操曰本熟女| 91色伦综合| 成年男人的天堂| 91久久精品蜜臀| 国产一级αv免费看片| jk白丝没脱就开始啪啪| 午夜福利无毒不卡| 天天操天天射天天日| 九九视频黄色片| 日韩精品人妻| 中文字幕精品探花视频| 人人操人人摸人人骑| 97av在线观看| 国产亚洲日本精品在线| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 激情天天视频| 综合国产影视三级| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | a片在线播放| 影音先锋每日最新资源在线观看| 久久透逼视频| 九一综合网| 五月丁香啪啪| 99蜜桃臀亚洲成人在线观看| 夜夜操一区二区| 性交一区二区在线播放| 99久草| 亚洲日韩美女丝袜美腿人妻视频| 蜜乳AV.COM| 在线综合色| 欧美在线观看综合国产| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 自拍大香蕉乱插| 噜噜噜无码AV一级一级久久影院| 久久9精品视频| 99xav| 日本加勒比无码专区一二三| 丰满人妻区一区二区三| 丝袜综合色图| 97超碰欧美手机在线| 国产嫩草精品A88AV| 麻豆美女丝袜人妻中文| 操逼逼无码| 午夜免费视频1000| 极品AV网站在线观看| 综合亚洲网| 超碰免费人妻人人| 欧亚在线视频| 丁香五月综合| 亚洲成人综合在线| 青青草啪啪网| 夜夜爽夜夜| 激情小说图片亚洲首页| 91成人在线免费视频| 人人爱操| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 这里都是精品在线观看| 操死我了嗯嗯嗯| 久久久91| 日韩精品99999| 超碰1024久久| 日韩在线地址一| 激情五月天婷婷| 亚洲淫色网中文| 亚洲亚洲亚洲天堂天堂| 二级久久网| 91 偷| 亚洲欧美精品国产一区二区| 亚洲宅男天堂| 情色五月天就去干| 吖在线不卡一区二区国产剧情| 激情小说五月天| 国产精品粉嫩福利在线| 操逼视频色| 精品无码久久久| 欧美,亚洲,日韩,v,天堂,手机在线观看| 91丝袜美女视频| 欧美日韩精品一区二区三区高清| 免费农村成人少妇人妻Aa一区二区视频 | 亚洲熟女乱综合一区二区三区| 亚洲一区二区AV| 欧美日韩香蕉| 人妻少妇精品久久久| 神马久久久久久久| 殴美,日韩国产伦精品| 久超碰这里只有精品| 一区二区三区亚洲| 九九九久久久久| 男人的天堂va| 国模限制级电影| 亚洲男人天堂手机版| 思思热国产在线视频| 97超碰逼| 欧美成人四级在线播放| 婷婷丁香五月天综合东京热| 老司机久久| 亚洲在线网站| 欧美日韩亚洲高清不卡一区二区三区| 中文乱码字幕观看视频| 日本有码久久| 91综合色噜噜| 国产不卡中文字幕免费avi| 人人性爱视频免费| 2017大香蕉国产精品久久| 伊人大香蕉在线| 亚洲。天堂。日本在线观看| 日韩亚洲美女一区久久| 国产91福利小视频在线观看| 少妇与黑人高潮在线| 国产在线综合网| 富二代亚洲精品99| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 加勒比综合九九99视频在线播放| 老熟女搡BBBB搡BBBB视频| 九九成人精品| 99热在线观看| 欧美gv在线观看| 99re热| 国产高清无码一区二区三区四区皇冠| 91天天爽| 亚洲日韩青青草色月| 不卡中文字幕aⅴ在线| 久96热在线观看视频| 国产suv精品一区二区四区999| 精品久久久av无码免费| 岛国不卡超碰护士AV在线播放| 精品黑人一区二区| 久久二| 人妻人人澡人人爽人人| 97色干| 日本免费人成视频播放120秒| 久久久久深夜无码| 久久国产精品一级二级三级| 亚洲最大的综合性av| 午夜九九九九九九| 中文字幕AV片| 婷婷国产精品九区| 99色视频| 国产麻豆一级精品视频| 一级二级三级黑人无码| 黄色交缠性感爆操91国产精品免费一区二区三区 | 黄页大片在线观看| 国产 亚洲 丝袜 制服| 青青在线视频免费| 亚洲欧美啪啪| 天天综合网入口~91| 超碰在线人妻| 制度丝袜99| 精品人妻av区天天看片| 屁股久久久久久久久| 午夜男人天堂| 91操人视频| 伦伦成年午夜免费视频| www.99中文字幕| 亚洲本色精品一区二区久久| 97超碰影音| 久久只有精品一区二区三区| 99热这里是精品| 操操逼视频| 欧美亚洲综合高清在线| 欧洲精品一级二级精品综合视频综合| 婷婷五月天色网| 亚洲情色1区| 久热这里| 九月丁香| 日本三级日本三级99| 色就色综合| 搡老熟女免费视频| 五月丁香激情四射| 夜色综合| 欧美天天综合网| 91n处女在线观看| 999熟女精品| 亚洲日产专区婷婷| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 91综合色| 中文字幕在线观看永久| heyZO天然素人无码AⅤ专区| 亚洲AV无码乱码| 国产精品999aaa| 欧美日韩资源| 91成人18| 最新av中文字幕高清| 亚洲婷婷丁香在线| 91九色蝌蚪在线观看| 久久精品国内Av熟女高清| 国产乱伦视频污| 超碰97亚洲| 清纯唯美亚洲综合| 午夜福利1区2区3区| 婷婷av在线中文字幕| 国产精品com| a片久久久久久久久久久久 | 91精品国产高清久久久久久,亚洲成人| A级片日韩欧美国产欧美视频精选观看| 久久免费9| 超碰97国产欧美| 欧美日韩中文字幕不卡| 性爱乱伦一区| 丁香五月成人| 激情第四色| 精品超碰中文在线| 国产精品91ai| 欧美日韩人妻婷婷一区| 青青草大香蕉视频| 国产精品永久免费10000| 中文字幕亚洲永久精品| 日韩精品中文字幕二区| 色精品极品| 亚洲成人一二三区| 操淫穴亚洲五月丁香 | 啊好大好舒服| 久久久不卡区一区二区三区久久久| 久超超碰| 天天日天天干少妇日| 秋霞曰韩R级| 欧美制服网站美腿丝袜| 国产精品粉嫩福利在线| 丰满人妻一区二区三区色-百度| 91精品国产91久久福利| 啪啪啪精品视频| 天天弄天天操| 96国产污污污丝袜| 97网色| 国产精品探花色| 操逼网免费无码视频| 超91综合网| 婷婷五月天无码| 亚洲欧美综合网| 影音先锋每日最新资源在线观看| 欧美超碰9798| 婷婷久草| 日韩三A大片在线观看| 六十路日本| 欧美 日韩 国产传媒| 久久中文字幕人妻熟av女蜜柚| 97干在线| 欧洲色| 久久天天摸| 任你干在线视频| 操国产高清| 人妻精品视频一区二区| 超碰人妻中文在线| 亚洲啪AⅤ永久无码| 久久婷婷五月天| 欧美亚洲厕所精品偷拍91| 夜夜欢天天干| 黄片不用下载在线观看| 欧美亚洲综合999| 精品欧美不卡在线播放| 极品色社| 亚洲天天更新| 日本色色色| 国产九九九九九九| 丁香色五月 97干| 久久久久久久久久久久久久久久9| 蜜臀99久| 加勒比无码一区二区三区| 久久久91福利姬| 成人性爱AV在线免费观看| 91国产精品熟女| 久久二| 久久黄黄| 欧美 日韩 亚洲 春色| 久久a久久| 97亚洲中文| 亚洲成人免费在线| 男人的天堂99| 亚洲天堂另类小说男人| 天天操人人操狠狠插| 东京热一区二区三区四区五区六区| 爱爱动态60秒| 夜夜高潮夜夜爽高清视频一| 国内毛片热久久思思热| 久久超碰、| 日逼逼免费看| 超碰精品人妻狠狠干| 强奸乱伦av电影| 呻吟 欧美 日本 中出| 26uuu国产成人综合| 亚洲精品1区| 女人喷水视频在线观看| 91性网| 久久久久久亚洲精品不卡人乳| 亚洲 欧美 第一页| 久久综合18p| 人人操人人93| 欧美日韩天堂| 日本日逼视频网| 深夜视频| 99操| 中文字幕 码 自拍 视频 区| 亚洲熟伦熟妇AV无码春色| 18岁禁 茉莉成人久久| 97在线视频观看网站| 91国产丝袜美女| 丁香色五月 97干| 国产久久久久久| 亚洲色性情三级| 亚洲一区二区三区欧美日韩| 亚洲无992tv| 男人的天堂2000| 成人午夜无码视频| 黄片qw| 欧美小说区视频区| 亚洲棕合电彰| 婷婷色婷婷| 国产一区二区三区白丝| 91丝袜人妻| 91丝袜美腿网站| 天天躁日日躁xxxxx| 日韩BBN| 黄网站黄视频网站进入口 | 思思热免费视频观看| 久9精品| 天美传媒AV国产在线| 999岛国大片| 日韩黄片影院| 91人人操| 蜜汁欧美| 久超碰这里只有精品| 麻豆国产av网| 亚洲av夫妻操穴网| 免费看日产一区二区三区| A级片日韩欧美国产欧美视频精选观看| 欧美在线综合| 综合亚洲情色| 97 亚洲 日韩 欧美 在线| 久久91精品国产9丨久久分亭| 超碰色老头| av草草在线电影| 操B久久| 丝袜美腿诱惑亚洲欧美视频在线观看 | 久热热| 高清不卡 中文 人妻| 日本 免费 一区二区三区 久久香蕉 | 九九热超碰97亚洲最新香蕉| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 日本超碰97日韩精品人妻| 99亚洲精品| 免费视频a级毛片免费视频| 777AV电影| 欧美精品23| 色哟哟 日韩精品| 久久这里只| 天天影视91看看| 色在线69堂| 欧美精品三区| 青青伊人久久| 色拍偷亚洲| 和协影院中文字幕三区| 97精品中文字幕| 日韩天天本| 欧美亚洲高清不卡| 大乔未久88一区| 97在线青| 亚欧操逼片在线观看 | 欧美色图另类图片| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 粉嫩AV一区二区夜夜| 999熟女精品| 99热日| 日韩有码回春沙龙第一页| 天天拍天| 成人情色综合网| 91热色| 亚洲深夜福利| 青青青国产手线观看视频2| 日本一区二区亚洲综合| 人人操人人色人人摸| 最新av中文字幕高清| 久久av无码| 操逼免费视频无码国产| 加勒比久久综合网高清| 午夜免费福利视频一区| 91在线欧色| 亚洲 图片 欧美 色图| 黄色不卡视频| 青青草影视蜜久久| 丁香九月婷婷| 秋霞成人做爱| 成人日本视频人妻在线| 青青草日韩无码| 男人的天堂在线2| 久久综合超碰| 麻豆成人影音在线| 久久久久免费看少妇A片特黄| 多乙久久久久久| 俺去也婷婷| 97色97好| 99少妇| 国产精品成久久久久午夜午夜| 人人艹亚洲| 欧美在线干| 91色图片| 亚洲男人天堂网站| 国产操伦| 亚洲综合网电影91| 美女黄码视频午夜| 69一区二区| 在线国产福利网址导航| 久久久久性熟视频| 久久久月天| 成人av福利在线观看| 激情婷婷| 中文字幕久久亚州无码| 亚洲伊人成综合成人网| 日韩欧美经典在线观看| 极品少妇99| 99精品九九九九九九| 国内毛片无遮挡国产| 日日干日日| 97国产伦理| 香伊人在线| 天天干一干| 99久久9| 91被操| 色婷婷五月天| 97精品视频在线| 人妻丰满熟妇一区二区三| 91啪啪| 精品久操| 风流老熟女一区二区三区l| 韩国女主播青草福利视频| 欧美日韩亚洲少妇寂寞影院正在播放| 亚洲人妻在线一区| 国产一区麻豆免费观看| 中文字幕在线观| 开心五月激情网| 超碰是碰在线观看| 欧美另类综合久久| 久久草视频污视频| 青娱乐亚洲自拍| 久久超碰大香蕉| 亚洲AV成人精品网站在AV| 91国产精品在线看| 色香AV| 电影69乱码96| 精品无码秘 人妻一区二区| 久久超碰爱| 欧美亚洲手机在线| 亚洲日产专区| 国产深夜福利| 区一在线观看| 欧美黄色片在线播放| 欧美日韩淫加| 日韩色欲久久一二三四区| 精品999日本| 2019久久久久久久久福利| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 99精品欧美一区二区三区桃色| 亚洲www91| 天天躁日日躁xxxxx| 熟女网站最新| 亚洲欧洲日韩国产自在线| 久艹99| 欧美视频在线视频免费va| 色97欧美| 中文字幕精品人妻丝袜| 内射夫妻三片| 婷婷激情五月综合| 激情自拍 校园春色| 91久久青青草原精品| 宅男午夜在线视频| 亚洲1区2区三区高清中文字幕| 97超碰中文| 免费观看啪视频| 四虎免费在线观看| 亚洲 欧美 另类 日韩 人妻一区| 亚洲二区精品在线观看| 中文字幕视频在线观看| 亚洲情色一区三区| 8050无码八戒| 女性91网站| 精品中文日韩字幕视频| 免费看毛片操穴| 午夜男女爽爽爽影院视频| 色眯眯av| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 97超碰美女| 国产丝袜美腿美女麻豆| 99久久网站| 午夜a成v人电影| 激情视频一二三| 最新日本中文字幕| 伊人久久大香线综合无码| 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲国产麻豆一区二区三区| 蜜臀久久久99久久久久 | 日韩精品黄片免费观看| 女生91网站| 性性久久| 九一亚洲国产免费| 99久视频| 午夜电影在线观看无码专区| 69国产对白刺激| 精品久操| 亚洲欧洲久久天堂| 麻豆av一区二区三区| 中文字幕狠狠玩| 黑人精品一区二区在线播放| 91美| www.成人无码| 久久久久久九九九九-美女久久久久久久-成人AV| 永久免费发布性爱网| aa片毛片| 玖玖久久久| 天天日熟妇| 9 7超碰在线免费观看| 丁香五月婷婷基地| 天天天天天干夜夜夜夜夜操| 久久久久亚洲av综合波多野制衣| 丝袜亚洲综合| 国产精品农村妇女| 欧美色图99| 伊人色综合欧美| 99re只有精品| 爽爽爽免费视频| 亚洲自拍青操视频| 欧美曰韩国产精品| 综合 青草 伊久久 影院 综合 | m欧洲一级午老| 一道本东京热加勒比一区二区三区| 久久久久久久久久8888| 深夜激情无码| 911粉嫩人妻| 国产三级多多影院2022国产AA一级毛片无码 | 在线五区| 哑洲在线| 丝袜加勒比| 亚洲双插| 2017天天插| 欧美天堂在线| 亚洲综合第一页| 欧美97爱| 91精品人妻偷情| 天天看精品动漫视频一区| 精品久久久久久中文字幕视频免费| 久久内射| 欧美成人一级麻豆| 天天做天天爱夜夜爽毛片试看| 在线日韩精品一区二区三区| 蜜臀AV秘一区翔田千里| 天天色,天天干,天天干| 国产精品爽爽va在线观看98| 天天插天天操| 精品视频日日夜夜| 操逼内射干逼白丝91| 欧美日韩亚洲高清不卡一区二区三区| 9久久美女首页| 男人的天堂久久狠| sewuyueav| 在线午夜成人无码视频| 日韩性爱毛片操骚逼| 97人妻免费中文字幕| 很很热性爱视频| 另类小说五月天| 日本不卡三级网在线播放| 国产男女无套97| 日韩不卡网操逼中文字幕日韩| 亚洲玖玖爱| 福利视频合集| 欧美日本中字另类在线| 操操碰| 4141514逼喷水三级片| 丝袜美腿射精91| 日逼97| 国产成人精品必看| 大香蕉综合| 天天摸夜夜摸| 久久精品一区一起草| 七月婷婷综合| 午夜高清成人在线视频| 中文字幕在线观看网页| 97chaopenrihan| 人人爱人人乐人人操| 老司机老司机午夜影院| 视频在线观看一二三区| 偷拍新久久| 麻豆国产精品午夜视频| 国产精品久久久久av| 亚洲成人精品久久久| 变态另类专区| 亚洲国产婷婷在线播放| 超碰日本97美女人妻人人玩人人爱| 欧美日韩另类字幕中文| 久久久新亚洲AV| 久久人人爽人人爽人人片Ⅴ| 伊人精品视频| 成·人免费午夜在线观看| 人人操人人操草草| 97自拍一区| 蜜臀久久99精品久久久久久无删减 | 中文人妻av高清一区| 99无码视频| 美女网站黄页| 国产二区视频在线观看电影| 久久久久久大| 偷拍盗拍亚洲色图图片| 国产原创剧情在线丝袜| 亚洲性少妇| 亚洲男人综合| 高清不卡一二三区视频......| 亚洲色婷婷综合久久一区二区三区| 午夜乱轮操逼视频免费看| 久久久精品日本一道| 暴力av在线| 黄色片大香蕉| 四虎影视永久在线观看精品免费网站 | 久久久久9| 玖玖爱在线视频免费观看| 熟女精品日韩一区二区三区| 国产白嫩漂亮KTV在线| 精品久久久亚洲AV成人网站| 色综合超碰超| 日韩人妻中文视频| 东北女人操比视频| 男人天堂黄片| 欧洲一区二区三区免费| 秋霞操逼片| av情色影音| 久久成年片色大黄全免费网站| 69超碰综合| 欧亚日韩中文在线| 超碰超碰95| 国语av狠狠色丁香婷婷综合激情| 日本久操视频| 国产黄色剧情影片麻豆免费播放| 久久综合乱子伦国产免费| 亚洲精品久久久久毛片A片拉屎 | 欧美欲色| 最新国内自拍av免费| 久久大线蕉一区| 色综合天天| 欧美色图在线视频少妇| 日韩性爱电影一区| 激情小说激情视频| 97香焦色区| 国产福利电影| 日韩欧美天天爽爽爽天天爽爽| 国产三级多多影院2022国产AA一级毛片无码 | 中文字幕-区二区三区四区视频中国| 色屁屁影院www国产| 超碰天天操| 麻豆国产免费影片| 欧美96精品在线| 成人老鸭窝人人在线视频| 无码人妻精品一区二区中文| 久久精品91| 99久热| 欧美亚洲国产91在线| 欧美国产有色电影| 性一交一乱一交A片久久四色| 日韩啪啪视频| 丁香婷婷激情五月天无毒不卡| 久久久国产亚洲精品系列| 欧美亚洲中文字幕| 日韩久久超碰色| 熟女色综合久久| 婷婷爽人人婷婷爽视频| 国产熟女精品区| 精品久热| 白天啪啪晚上啪啪视频| 久久香蕉国产线看观看亚洲女人 | 呦呦影院| 四季av一区二区凹凸精品小说| 欧美日韩情色一区二区| 男女激情黄色网址| 亚洲精品久久久久毛片A片拉屎 | 美女被艹尤物视频| a片久久久久久久久久久久| 黄色一区三区| 色婷婷蜜臀av| 日日狠狠久久偷偷色综合免费| 免费av在线播放二区| 亚洲欧美综合网| 一区二区三区四区久久视1| 成人AV在线电影| 国产野战露脸在线播放| 国产精品天堂| 骚鸭AV| 天天内射| 欧美性暴力猛交XXXX| 久久丁香五月婷婷| 天天色天天干天天射| 天天射夜夜操| 中文字幕一区二区三区人妻不卡| 色网在线| 中文97国产| 91N欧美| 色99视频| 日本亚洲熟女视频| 欧美丰满少妇xx高潮| 日本人妻最新在线中| 深喉吞精| 日韩天天综合| 久久久草草精品| 欧美人妻中出| 久久久久久中文版| 欧美色图天堂网m| 97色五月天完| 96AV精品| 99超碰色| 伊人影院在线理论播放 | 国产中文字幕在线| 色亚州人久干视频在线观看免费版| 欧美日日夜夜| 欧美熟妇乱码在线一区| 黄页大片在线观看| 欧美日韩夜夜| 精品久久久av| 中文字幕在线观看AV| 麻豆天美电影一区二区| 国产丝袜视频| 国产女上位好爽在线| 无码免费一区二区三区啪啪| 五月激情在线| 资源在线观一 二| 小泽玛利亚一二三| 国产久久一区二区午夜| 国内91熟女人妻丝袜天天精品视频在线| 久久99网站| 九九成人视频| 亚洲人精品久久久喷水| 欧美成不卡网| 日韩激情视频| 伦理弟一页| 99最新日韩偷拍视频| 国产精品一二三| 欧美亚洲中文字幕| 加勒比海色香蕉婷婷| 日韩综合无码一区久久92| 综合亚洲欧美精品日韩?v| 久久成人国产精品| 国产操逼逼网| 精品国产精品一区二区| 亚洲成人av色网| 香蕉一区二区三区在线视频| 超碰人妻中文在线| 国内一区二区三区| 伊人91| 日韩欧美操逼xxx| 欧美性爱1080p| 91九色网| 午夜天堂精品久久| 91N综合网在线| 九九热三级片| 亚洲图片婷婷五月天| 亚洲精品成人激情在线| 91狠狠综合久久久久久| av72网| 四虎影视精品| 秋霞网—男女啪啪亚洲免费体验区| 夜夜影视四色| 欧州色图区| 成人黄页| av三级电影在线播放| 精品人体无圣光凹凸| 在线只有精品| 强奸熟女一区二区三区| 97超碰香蕉| 91人妻做a观看视频| 久久精品国产精品亚洲艾通辽熟妇| 天天综合网久久ww| 日韩精品亚洲一二三| 欧美综合国产精品久久丁香| 免费观看啪视频| 亚洲人妻熟妇三十三区| 另类图片五月天| 五月天我淫我色av| 91狠狠色丁香婷婷综合久久精品| 久久中日麻豆| 97爱亚洲| 亚洲综合九九| 熟妇国产免费一区| 亚洲网站一区二区在线| 五月婷婷激情网| 蜜臀久久久| 又粗又长又大国产不卡| 无套内射性感少妇视频| 午夜精品久久久久| 亚洲精品久久久久毛片A片拉屎| 亚洲AV无码国产精品久久久久| 中文字幕视频2区| 久久久久久加勒比| 92午夜免费福利视频| 国产一区麻豆免费观看| 国产精品久久久久久久久久久久| 久久久久久AⅤ无码免费肉站| 国产成自自拍在线观看| 啪啪视频免费在线观看| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴| 欧美亚洲成人在线一区二区三区| 91av熟女人妻| 小草精彩毛片| 97国产人人| 999狠狠综合| 欧美天天综合在线| 大香蕉520| 麻豆色99999| 久久艹逼视频| 草B在线| 香蕉久久国产AV一区二区| 亚洲好色人妻| 中字乱伦AV| 97超碰影音| 婬女免费一二三区A片| 性感美女啊啊啊在线| 久久久国产亚洲精品系列| 新97国产超碰| 黄色网址在线免费观看| 青青操视频在线| 久久久久久久国产a∨| 玖玖爱伊人玖玖爱| 高清在线偷拍自拍视频| 97国产精选| 婷婷五月天久久久| 91N综合网| 亚洲男人bt天堂| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 秋霞色色影院| 啊啊啊啊二区好大| 成人 日本A片无码8888| 欧美,日韩,中文,另类| 一起草av| 午夜啪| 美美91成人国产精品欧美精品久久久久久久| 欧美性生活男人的天堂| 亚洲精品国产av天美传媒| 国产99久久99热这里只有精品15| 色欧美色交综合| 久热这里| 在线观看不卡一区二区三区| 亚洲熟久久| 国产成人+综合亚洲+天堂| 超碰欧美97| www.高清无码诱惑一区.com | 91精品久久综合熟女| 五十路三区在线| 国产黄色动态精品| 少妇高潮对白在线观看| 超碰在线91| 啊啊啊97视频| 国产精品久久久久av| 精品九九九九九| 久久宗合亚洲| 蜜桃成人1区2区3区| A 在线网址| 九九热re99re6在线精品| 久热久一区二区三区| 国产亚洲美日韩Aⅴ中文字幕无码成人| 死我十八禁| 久久久9品一区二区三区| 18禁网站在线播放| 日韩射精| 超碰日韩美妻| 久久大香蕉手机高清视频| 91碰超| 大香蕉中文| 四虎精品一区| 欧美日日夜夜| 99熟女| 亚欧视频在线| 97色碰| 综合亚洲网| 97国产色图 | 五月亭亭六月丁香| 妇女乱色二区| 男人的天堂日本东京热| 花野真衣| 久久丁香五月婷婷| 思思热久久成人| 国产精品久久| 少妇贴图| 欧美性综合| 欧美性后入| 国产精品一二三区福利| 成人性爱全视频观看| 亚洲黄片免费在线播放| 青草精品视频一日本久久久久网站| 超碰人妻中文在线| 美女啊啊啊啊pc| 婷婷色网| 亚洲欧美日韩综合在线尤物 | 吉田爱美AV在线| 日韩人妻精品久久久久| 国产一区二区三区精品观看啪| 秋霞成人做爱| 日韩激情无码影院| 国产精品白丝| 啊啊啊爽爽| 无套后入双马尾| 夜夜骑日日| 国产精品午夜福利视频| 久久鲁夜| 欧美精品久久96人妻无码| 暖暖精品二区三区观看| 亚洲精品丝袜-不卡成人免费……| 女人被添高潮免费视频| 国产午夜无码片在线观看影视| 久久青青草原免费视频| 激情抓乳插进去啪啪啪日韩| 久久久久久亚洲Av无码精| 人妻少妇久久中文字幕一区二区 麻豆 | 97视频7| 91久久18禁| 99亚洲人人| 夜夜騷av、一區二區| 天天综合网91入口| 97久久超碰国产网站| AV高清一区| 日日骚 av| 亚洲色香| 日本精品九九九| 果冻传媒A片一二三区| 中文字幕精品三级久久久| 色97综合中文字幕| 久久精品国产97欧美精品亚洲| 久久精品一区一起草| 91操熟女视频 | 97 亚洲 日韩 欧美 在线| 欧美三级一级| 亚洲第一色页夜| 熟妇高潮精品一区二区三区下载| 亚洲无限观看| 欧美在线第五页| 亚洲男人天堂网站| 91色综合| 日韩熟女乱伦中出| 成人免费福利网站国产| 亚洲夜夜欢无码一区二区| 五月丁香影院| 午夜福利久久久噜久噜久久综合 | 亚洲另类小说卡通动漫| 无码黑人精品一区二区三区三| 亚洲砖码砖专无区2023| 色九月婷婷| 男人天堂站| 超碰伊人在线| 2020中文字幕在线观看| 天天日天天操天天射河南省| 国产乱色国产精品免费视| 92午夜免费福利视频| 人妻嗯啊啊在线播放| 国产大片精久久久久久| 在线观看午夜婷婷久久久久清性观看| 97精品一区| 呦呦一区| 久久精品国产亚洲AV高级北京| 亚洲激情AV| 激情亚洲天堂| 天天综合~91| 我要去看2个日本美女.com曹逼| 无码丰满熟妇一区二区浪潮AV| 97精品综合久久| 青青草久久一区网| 四虎影视 亚洲无码| dy888午夜老子影视达达兔| 黄页网站免费高清在线观看| 大香蕉九九| 日韩9999| 蜜臀久久99精品久久久久久婷婷 | 一区| 97免费视频在线| 2020中文在线一区二区三区| 色综合99| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 精品女同一区| 91伊人久| 欧美后进式| 亚州图片第一页| 亚洲精品自拍| 亚洲综合激情五月久久| 天天干天天中出av| 91青青草| 人人考人人摸人人干| 日韩精品99久久久久久中文字幕| 久草免费在线视频| 国产精品成人无码av无码免费| 国产精品久久9| 精品免费囯产一区二区三区 | 国产传媒日本欧美专区| 精品人妻少妇| 免费av大片| 亚洲日韩熟女人妻高清在线| 欧美不卡五十路| 国产av尤物| 97久久综合网| 久久精品国产亚洲AV片多多| 91嫩草欧美| 人妻一区二区三区四区视频| 人妻少妇色综合| 久久久一二三四区| japan日本高清乱xxxx| 中文字幕久久精视频久久大全| 91综合在线| 亚洲午夜免费狠狠干| 97超碰精品图片| 97香蕉碰碰人妻国产欧美| 狠狠干2020| 国产精品无码在线| 亚洲鸥美色图| 黄骗免费| 超碰97久久国| 亚洲无码?第一页| 欧美精品久久| 性久久| 无码操逼天堂| 青草青草久热| 亚洲人精品久久久| 日韩人妻一区二区精品| 亚洲另类色综合网站| 一区二区三区视频在线观看免费| 嗯~啊~快点 死我视频免费看网站| 精品人体无圣光凹凸| 久久久专区| α√在线| 久久精品国产97欧美精品亚洲| 久草福利在线资源站| 欧美淫乱视频| 五月丁香婷婷色| 一区二区影视| 国产馆极品诱惑| 欧美亚洲国产91在线| 国产乱弄免费在线视频。| 人妻9117c| 亚洲九九九| 秋霞男人网| 九九精品无码专区免费| 久日91在线| 自拍大香蕉乱插| 久草看看看| 欧州色图区| 狠狠色伊人亚洲综合网站色| 最新中文字幕av| 日韩精品1区2区中文字幕| 精品二区三四区五电影 | 亚洲国产成人精品无码专区| 亚洲天在线| 日本不卡卡一区| 26uuu偷拍亚洲欧洲综合| 欲女人妻性色av| 99热18| 无码一区免费在线不卡| 中文字幕神马久久| 在线国产探花| 99久久久无码国产精品性啊聊| 日韩欧美被操黄免费观看| 干干干天天| 精品国产乱码久久久久久久久久毛片 | 偷窥自拍亚洲色图| 伊人丁香五月婷婷| 中文字幕日韩情色| 天天操女人| 国产剧情AV不卡在线观看| 综合少妇网| 97超碰逼| 中文字幕在线日亚州9| 另类亚洲一区二区三区| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 亚洲精品天天影视综合网 | 亚洲 欧美 日韩另类 麻豆| AV色天香在线| 久操网线| 日韩成年人性爱视频| 九九九九一级| 精品夜夜澡人妻无码| 日本天天操| 百度百度日本操逼| 久久久少妇诱惑精品视频| 99999精品视频| 国产伦乱91| 无码外流操逼视频| 九九热国产| 偷拍色图| 欧美少妇第一页| 91九色首页| 老熟女乱子伦中文字幕一区二区| 欧美91变态| 69丨亚洲丨精品丨入口免费播放| 亚洲情色婷婷五月天| 国产精品久久久三级无码| AV一区观看| 久久男人的天堂| 久久9免费视频| 欲射影视| 欧美亚男人的天堂| 久久精彩免费视频| 99性爱在线观看| 亚洲啪啪视频免费| 快灬快灬 一下爽蜜桃在线观看| 啊啊啊啊啊啊啊啊啊在线观看| 大香蕉伊人亚洲| 大香蕉亚洲中文| 久久婷婷影院| 在线观看av区| 国产精品探花视频| 人人艹亚洲| 在线岛国新天堂8| 欧美日韩在线视频网站| 91 丝袜在线播放| 大香蕉中文201| 人妻少妇无码| 涩亚洲欧洲| 91碰碰| 久久综合久色欧美综合狠狠| 99国产精品免费| 超碰性爱97| 久久精品视频久久久| 国产91美女高潮| 亚洲男人天堂Av| av天天在线观看| 天天爱天天韩国日本牛牛牛牛| 国产精品99久久久www| 黄色视频特级毛片| 亚洲国产一级精品毛一级精品看免费视频 | 天天艹天天日| 中国少妇XXXX做受| 一级性爱啪啪视频| 国产精品久久久久久久AV大片| 色y情视频免费看| 自怕偷自怕亚洲精品| 老妇女91| 性色av一区二区| 一级黄碟在线看| 精品一二三区女同 | 综合久久久久久久综合网| 欧美综合娱乐久久| 国产熟女乱论| 亚洲精品成人激情在线| 九九碰九九爱97超碰| 色蜜AV| 99re69综合|