Run query on HiveServer2 by thrift

RBHiveクライアントを使ってHiveServer2経由でクエリを実行しようとしたところ,上手くいかずハマってしまった。

以下のようなコードを実行しようとしたところ,エラーで実行できない。

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でのエラーは以下。

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になっている。)

<property>
  <name>hive.server2.enable.doAs</name>
  <value>false</value>
</property>

どうも,hive.server2.authenticationのオプションも変更しないといけない。デフォルトでは,NONEになっているもよう。Saslを使わない場合は,以下のようにする。

<property>
  <name>hive.server2.authentication</name>
  <value>NOSASL</value>
</property>

この場合,jdbcのuriは,;auto=noSaslをつける形となる。

なお,RBHiveで上記2つの設定を変更せずそのまま設定で実行する場合は,以下のようにすると上手くいった。sasl_paramsがなくとも,空のオプションを渡さないとエラーになる。

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

参考

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

Translate »