HiveServer2(以下簡稱:HS2)是Hive提供的一種jdbc服務(wù)臀规,用戶可以通過Hive自帶的Beeline連接刨摩,也可以使用Java痹兜、Python或者PHP等通過jdbc的方式連接再登。下面以Java連接HiveServer2為例來介紹幾種向Hive傳遞參數(shù)的方法方篮。
一有缆、如何連接HS2
連接到HS2象踊,一般需要提供HS2的地址、端口號棚壁、連接的Hive庫杯矩、用戶名和密碼這幾個(gè)必選項(xiàng),示例代碼如下:
Class.forName("org.apache.hive.jdbc.HiveDriver");
Properties info = new Properties();
info.setProperty("user", "user_name");
info.setProperty("password", "passwd");
String JDBC_URL="jdbc:hive2://localhost:10000/default";
Connection conn = DriverManager.getConnection(JDBC_URL, info);
HiveStatement stat = (HiveStatement) conn.createStatement();
...
只要URL袖外、用戶名和密碼正確的話史隆,通過上面的示例代碼,就可以連接到HS2執(zhí)行操作了曼验。但是往往這樣還不夠泌射,如果我們想通過傳遞一些Hive的配置信息,那該怎么辦呢蚣驼?
二魄幕、傳遞參數(shù)
可以通過如下的幾種方式來傳遞參數(shù):
- 類HiveClient方式
使用過Hive客戶端的用戶都知道,如果我們想改變Hive的某一項(xiàng)客戶端配置的話颖杏,可以通過set hive_conf_key=hive_conf_value;
的方式來修改纯陨。由此,很自然的我們會(huì)想到在獲得了一個(gè)JDBC的連接后留储,我們執(zhí)行一下上面的語句不就可以了翼抠。示例代碼如下:
// 我們執(zhí)行一些復(fù)雜的sql的時(shí)候,往往需要制定一個(gè)隊(duì)列获讳,假設(shè)隊(duì)列的名字為"root.hive-server2"
stat.execute("set mapreduce.job.queuename=root.hive-server2");
NOTE:需要注意的是阴颖,execute中的set語句不能包含分號(不能是set mapreduce.job.queuename=root.hive-server2;
),這是和客戶端的區(qū)別丐膝,否則不生效量愧。
- 在JDBC URL中傳遞
對jdbc比較熟悉的用戶,都知道可以在jdbc的連接中傳遞一些參數(shù)帅矗,hive也一樣支持偎肃。對于上面的需求,可以把充分利用JDBC_URL浑此。示例代碼如下:
...
String JDBC_URL="jdbc:hive2://localhost:10000/default?mapreduce.job.queuename=root.hive-server2;hive.cli.print.header=false";
Connection conn = DriverManager.getConnection(JDBC_URL, info);
...
NOTE:細(xì)心的讀者肯定注意到了這里的JDBC_URL和普通的jdbc傳遞參數(shù)不一樣的地方累颂,那就是這里是通過使用分號來分割多個(gè)hive的配置變量的,而不是使用'&'。
NOTE:另外紊馏,這里傳遞hive配置和hive變量還是有區(qū)別的料饥,Hive是通過'#'來分割Hive配置列表和Hive變量列表的。
// 源碼HiveConnection.java有說明
// JDBC URL: jdbc:hive2://<host>:<port>/dbName;sess_var_list?hive_conf_list#hive_var_list
// each list: <key1>=<val1>;<key2>=<val2> and so on
- 通過連接屬性配置
如果需要傳遞的配置數(shù)目比較多朱监,使用上面的方法岸啡,難免有點(diǎn)冗余和負(fù)雜,URL將會(huì)變得特別長赫编。其實(shí)凰狞,我們可以像配置user和password一樣來傳遞配置。區(qū)別于user和password配置方式的地方是沛慢,必須明確指出配置的是一個(gè)hive_conf還是hive_var,否則配置不會(huì)生效达布。示例代碼如下:
Class.forName("org.apache.hive.jdbc.HiveDriver");
Properties info = new Properties();
info.setProperty("user", "user_name");
info.setProperty("password", "passwd");
// 這里傳遞了一個(gè)隊(duì)列的hive_conf
info.setProperty("hiveconf:mapreduce.job.queuename", "root.hive-server2");
String JDBC_URL="jdbc:hive2://localhost:10000/default";
Connection conn = DriverManager.getConnection(JDBC_URL, info);
HiveStatement stat = (HiveStatement) conn.createStatement();
...
好了团甲,這就是我想介紹的幾種連接HiveServer2時(shí)傳遞參數(shù)的方式,希望對大家有所幫助黍聂!謝謝躺苦!