Hive Server 2 調研,安裝和部署

來源:互聯網
上載者:User

背景

      我們使用Hive Server 1已經很長時間了,使用者ad-hoc query,hive-web, wormhole,運營工具等都是通過hive server來提交語句。但是hive server極其不穩定,經常會莫名奇妙假死,導致client端所有的connection都被block住了。對此我們不得不配置一個crontab檢查指令碼,會不斷執行"show tables"語句來檢測server是否假死,如果假死,只能殺死daemon進程重啟。另外Hive Server 1的concurrency支援不好,如果一個使用者在串連中設定了一些環境變數,綁定到一個thrift worker thread, 使用者中斷連線,另一個使用者也建立了一個串連,他有可能也被分配到之前的worker thread,會複用之前的配置。這是因為thrift不支援檢測client是否取消連結,它也就無法清除session狀態資訊。同時session綁定到worker thread的方式很難做HA。Hive Server 2中已經完美支援了session, client端每次RPC call的時候會帶上一個SessionID, Server端會mapping到儲存狀態資訊的Session State,使得任何一個worker thread都可以執行同一個Session的不同語句,而不會綁死在同一個上。

      Hive 0.11 包含了Hive Server 1 和 Hive Server 2,還包含1的原因是為了做到向下相容性。從長遠來看都會以Hive Server 2作為首選。


配置

1. 配置hive server監聽連接埠和Host

<property>  <name>hive.server2.thrift.port</name>  <value>10000</value></property><property>  <name>hive.server2.thrift.bind.host</name>  <value>test84.hadoop</value></property>

2. 配置kerberos認證,這樣thrift client與hive server 2, hive server 2與hdfs互動 都由kerberos作認證
<property>  <name>hive.server2.authentication</name>  <value>KERBEROS</value>  <description>    Client authentication types.       NONE: no authentication check       LDAP: LDAP/AD based authentication       KERBEROS: Kerberos/GSSAPI authentication       CUSTOM: Custom authentication provider               (Use with property hive.server2.custom.authentication.class)  </description></property><property>  <name>hive.server2.authentication.kerberos.principal</name>  <value>hadoop/_HOST@DIANPING.COM</value></property><property>  <name>hive.server2.authentication.kerberos.keytab</name>  <value>/etc/hadoop.keytab</value></property>

3. 設定impersonation,這樣hive server會以提交使用者的身份去執行語句,如果設定為false,則會以起hive server daemon的admin user來執行語句
<property>  <name>hive.server2.enable.doAs</name>  <value>true</value></property>

執行命令$HIVE_HOME/bin/hive --service hiveserver2或者 $HIVE_HOME/bin/hiveserver2 會調用org.apache.hive.service.server.HiveServer2的main方法來啟動
hive log中輸出日誌資訊如下:
2013-09-17 14:59:21,081 INFO  server.HiveServer2 (HiveStringUtils.java:startupShutdownMessage(604)) - STARTUP_MSG: /************************************************************STARTUP_MSG: Starting HiveServer2STARTUP_MSG:   host = test84.hadoop/10.1.77.84STARTUP_MSG:   args = []STARTUP_MSG:   version = 0.11.0STARTUP_MSG:   classpath = 略.................2013-09-17 14:59:21,957 INFO  security.UserGroupInformation (UserGroupInformation.java:loginUserFromKeytab(633)) - Login successful for user hadoop/test84.hadoop@DIANPING.COM using keytab file /etc/hadoop.keytab2013-09-17 14:59:21,958 INFO  service.AbstractService (AbstractService.java:init(89)) - Service:OperationManager is inited.2013-09-17 14:59:21,958 INFO  service.AbstractService (AbstractService.java:init(89)) - Service:SessionManager is inited.2013-09-17 14:59:21,958 INFO  service.AbstractService (AbstractService.java:init(89)) - Service:CLIService is inited.2013-09-17 14:59:21,959 INFO  service.AbstractService (AbstractService.java:init(89)) - Service:ThriftCLIService is inited.2013-09-17 14:59:21,959 INFO  service.AbstractService (AbstractService.java:init(89)) - Service:HiveServer2 is inited.2013-09-17 14:59:21,959 INFO  service.AbstractService (AbstractService.java:start(104)) - Service:OperationManager is started.2013-09-17 14:59:21,960 INFO  service.AbstractService (AbstractService.java:start(104)) - Service:SessionManager is started.2013-09-17 14:59:21,960 INFO  service.AbstractService (AbstractService.java:start(104)) - Service:CLIService is started.2013-09-17 14:59:22,007 INFO  metastore.HiveMetaStore (HiveMetaStore.java:newRawStore(409)) - 0: Opening raw store with implemenation class:org.apache.hadoop.hive.metastore.ObjectStore2013-09-17 14:59:22,032 INFO  metastore.ObjectStore (ObjectStore.java:initialize(222)) - ObjectStore, initialize called2013-09-17 14:59:22,955 INFO  metastore.ObjectStore (ObjectStore.java:getPMF(267)) - Setting MetaStore object pin classes with hive.metastore.cache.pinobjtypes="Table,StorageDescriptor,SerDeInfo,Partition,Database,Type,FieldSchema,Order"2013-09-17 14:59:23,000 INFO  metastore.ObjectStore (ObjectStore.java:setConf(205)) - Initialized ObjectStore2013-09-17 14:59:23,909 INFO  metastore.HiveMetaStore (HiveMetaStore.java:logInfo(452)) - 0: get_databases: default2013-09-17 14:59:23,912 INFO  HiveMetaStore.audit (HiveMetaStore.java:logAuditEvent(238)) - ugi=hadoop/test84.hadoop@DIANPING.COM ip=unknown-ip-addr cmd=get_databases: default 2013-09-17 14:59:23,933 INFO  service.AbstractService (AbstractService.java:start(104)) - Service:ThriftCLIService is started.2013-09-17 14:59:23,948 INFO  service.AbstractService (AbstractService.java:start(104)) - Service:HiveServer2 is started.2013-09-17 14:59:24,025 INFO  security.UserGroupInformation (UserGroupInformation.java:loginUserFromKeytab(633)) - Login successful for user hadoop/test84.hadoop@DIANPING.COM using keytab file /etc/hadoop.keytab2013-09-17 14:59:24,047 INFO  thrift.ThriftCLIService (ThriftCLIService.java:run(435)) - ThriftCLIService listening on test84.hadoop/10.1.77.84:10000
可以看到在HiveServer2已經變成一個Compisite Service了,它包含了一組service,包括OperationManager,SessionManager,CLIService,ThriftCLIService。並且在初始化的時候會建立HiveMetaStore串連,並調用get_databases命令來測試。最後啟動thrift server(實際上是一個TThreadPool),監聽在test84.hadoop/10.1.77.84:10000連接埠上
另外Hadoop FileSystem Cache會以uri schema, authority, ugi(CurrentUser)和unique的組合作為Key來快取檔案系統對象。但是這會導致hive server memory leak,通過"jmap -histo pid"可以看出filesystem對象數量和所佔空間非常大,所以需要在啟動hive server的時候加上disable file system cache的參數。
$HIVE_HOME/bin/hive --service hiveserver2 --hiveconf fs.hdfs.impl.disable.cache=true --hiveconf fs.file.impl.disable.cache=true

1. Beeline訪問hive server 2 Beeline是hive 0.11引入的新的互動式CLI,它基於SQLLine,可以作為Hive JDBC Client端訪問Hive Server 2,啟動一個beeline就是維護了一個session。 由於採用了kerberos認證方式,所以需要在本地有kerberos ticket,並且在connection url中指定hive server 2的service principal,此處為principal=hadoop/test84.hadoop@DIANPING.COM,另外使用者名稱和密碼可以不用填寫,之後的語句會以當前ticket cache中principal的使用者身份來執行。
-dpsh-3.2$ bin/beeline Beeline version 0.11.0 by Apache Hivebeeline> !connect jdbc:hive2://test84.hadoop:10000/default;principal=hadoop/test84.hadoop@DIANPING.COMscan complete in 2msConnecting to jdbc:hive2://test84.hadoop:10000/default;principal=hadoop/test84.hadoop@DIANPING.COMEnter username for jdbc:hive2://test84.hadoop:10000/default;principal=hadoop/test84.hadoop@DIANPING.COM: Enter password for jdbc:hive2://test84.hadoop:10000/default;principal=hadoop/test84.hadoop@DIANPING.COM: Connected to: Hive (version 0.11.0)Driver: Hive (version 0.11.0)Transaction isolation: TRANSACTION_REPEATABLE_READ0: jdbc:hive2://test84.hadoop:10000/default> select count(1) from abc;+------+| _c0  |+------+| 0    |+------+1 row selected (29.277 seconds)0: jdbc:hive2://test84.hadoop:10000/default> !qClosing: org.apache.hive.jdbc.HiveConnection
thrift client和server會建立一個session handler,有唯一的HandleIdentifier(SessionID),由CLIService中的SessionManager統一管理(維護了SessionHandle對HiveSession的mapping關係),HiveSession維護了SessionConf和HiveConf資訊,使用者的每次執行語句會建立一個driver,將hiveconf傳進去後再執行語句,這也就是Hive server 2支援concurrency的方式。每次操作(會有不同的opType,比如EXECUTE_STATEMEN)會產生獨立的OperationHandle,也有各自的HandleIdentifier。使用者在beeline中輸入"!q"會銷毀該session,並且銷毀相應的資源。
ps : 用下來有點不太爽的是執行mapreduce job時候沒有執行過程資訊,如果是一個執行時間很長的語句,會等很久而沒有任何資訊反饋。
2. JDBC方式 hive server 1的driver classname是org.apache.hadoop.hive.jdbc.HiveDriver,Hive Server 2的是org.apache.hive.jdbc.HiveDriver,這兩個容易混淆。 另外可以在connectionUrl中指定HiveConf param和變數,params之間用';'分割,params和variables用'#'來隔開。這些都是session層級的,hive在建立完session後,會首先執行set hiveconf key value語句。 比如: 1. 帶hiveconf和variables: jdbc:hive2://test84.hadoop:10000/default?hive.cli.conf.printheader=true#stab=salesTable;icol=customerID
2. 帶variables:  jdbc:hive2://test84.hadoop:10000/default;user=foo;password=bar
範例程式碼:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class HiveTest {public static void main(String[] args) throws SQLException {try {Class.forName("org.apache.hive.jdbc.HiveDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}Connection conn = DriverManager.getConnection("jdbc:hive2://test84.hadoop:10000/default;principal=hadoop/test84.hadoop@DIANPING.COM","", "");Statement stmt = conn.createStatement();String sql = "select * from abc";System.out.println("Running: " + sql);ResultSet res = stmt.executeQuery(sql);ResultSetMetaData rsmd = res.getMetaData();int columnCount = rsmd.getColumnCount();for (int i = 1; i <= columnCount; i++) {System.out.println(rsmd.getColumnTypeName(i) + ":"+ rsmd.getColumnName(i));}while (res.next()) {System.out.println(String.valueOf(res.getInt(1)) + "\t"+ res.getString(2));}}}
HiveStatement現在支援取消語句,調用Statement.cancel()會終止並銷毀正在執行中的driver

註:如果kerberos認證有問題的話,可以在起client jvm時候增加JVM option "-Dsun.security.krb5.debug=true"來查看詳細資料

參考連結: https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Thrift+API https://cwiki.apache.org/confluence/display/Hive/Setting+up+HiveServer2 https://github.com/apache/hive/blob/trunk/service/if/TCLIService.thrift http://blog.cloudera.com/blog/2013/07/how-hiveserver2-brings-security-and-concurrency-to-apache-hive/

本文連結http://blog.csdn.net/lalaguozhe/article/details/11776055,轉載請註明

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.