RBHiveクライアントを使ってHiveServer2経由でクエリを実行しようとしたところ,上手くいかずハマってしまった。
以下のようなコードを実行しようとしたところ,エラーで実行できない。
1 2 3 4 5 6 7 8 9 |
require "rbhive" RBHive.tcli_connect("hadoop11", 10000, { hive_version: :cdh5, logger: Logger.new(STDOUT), }) do |connection| connection.fetch "show tables" end.each do |row| puts row end |
HiveServer2でのエラーは以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ERROR org.apache.thrift.server.TThreadPoolServer: Error occurred during processing of message. java.lang.RuntimeException: org.apache.thrift.transport.TTransportException: Invalid status -128 at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219) at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:227) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.thrift.transport.TTransportException: Invalid status -128 at org.apache.thrift.transport.TSaslTransport.sendAndThrowMessage(TSaslTransport.java:230) at org.apache.thrift.transport.TSaslTransport.receiveSaslMessage(TSaslTransport.java:184) at org.apache.thrift.transport.TSaslServerTransport.handleSaslStartMessage(TSaslServerTransport.java:125) at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:262) at org.apache.thrift.transport.TSaslServerTransport.open(TSaslServerTransport.java:41) at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:216) ... 4 more |
RBHiveのREADME.mdにも書かれているように,以下のオプションを設定したが,これだけでは上手くいかない。(ちなみに,HiveWikiによると以下のオプションはデフォルトではtrue
になっている。)
1 2 3 4 |
<property> <name>hive.server2.enable.doAs</name> <value>false</value> </property> |
どうも,hive.server2.authentication
のオプションも変更しないといけない。デフォルトでは,NONE
になっているもよう。Saslを使わない場合は,以下のようにする。
1 2 3 4 |
<property> <name>hive.server2.authentication</name> <value>NOSASL</value> </property> |
この場合,jdbcのuriは,;auto=noSasl
をつける形となる。
なお,RBHiveで上記2つの設定を変更せずそのまま設定で実行する場合は,以下のようにすると上手くいった。sasl_paramsがなくとも,空のオプションを渡さないとエラーになる。
1 2 3 4 5 6 7 8 9 10 11 |
require "rbhive" RBHive.tcli_connect("hadoop11", 10000, { hive_version: :cdh5, transport: :sasl, logger: Logger.new(STDOUT), sasl_params: {} }) do |connection| connection.fetch "show tables" end.each do |row| puts row end |
参考
- https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2
- http://tagomoris.hatenablog.com/entry/20131226/1388044783
コメント