たごもりすメモ

コードとかその他の話とか。

hiveserver2 使いはじめのハマりどころの話

いくつかメモる。盛大にハマった。

metastore

hiveserverとmetastore serverとhiveserver2で設定分けられないんだけど、というケース。単に以下の設定があればなんとなく動く。

  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hiveserver.local:9083</value>
  </property>

これがあれば hiveserver も hiveserver2 も metastore server をなんとなく参照してくれるようになるし、metastore serverも起動してくれるようになる。っぽい。

hiveserver2ポート変更

hive.server2.thrift.port を hive-site.xml で指定するか、環境変数で HIVE_SERVER2_THRIFT_PORT を指定する。
https://cwiki.apache.org/confluence/display/Hive/Setting+up+HiveServer2

Thrift Transport/Protocol

hiveserver2 はデフォルトで SASLTransport で立ち上がってる*1。これに対応したクライアントで繋がないといけないけど実装されてる言語があんまない。きつい。
認証いらないなら以下の設定をする。

  <property>
    <name>hive.server2.authentication</name>
    <value>NOSASL</value> <!-- default NONE is for SASLTransport -->
  </property>

これ、wikiにも無い値なので注意。 https://cwiki.apache.org/confluence/display/Hive/Setting+up+HiveServer2

またたぶんついでに以下の設定もしたほうがよい。だって認証しないんでしょ。

  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value> <!-- Execute query as hiveserver2 process user -->
  </property>
あとは頑張る

とりあえず手元で OpenSession には成功した……。

(12/31追記) THandleIdentifierのシリアライズ/デシリアライズ

OpenSessionした後にどの操作にSessionHandleを渡しても invalid と言われてブチ切れていたところ、Thrift IDLで binary 指定されているものを utf-8 で扱っていたため、ということがわかった。
Node.js用のIDLからのコードジェネレータは正式リリースされている Thrift v0.9.1 ではbinaryに対応していないので、これについては開発中のリポジトリからビルドするかどうかしないといけない。ぐぐってみるとPythonでも同様のハマりかたをしていた(英語の)スレッドがあったようだ*2。ので、他の言語でも油断してはいけない感じ。

幸いbinaryフラグが指定されているのはここだけだったので、諦めて生成後のコードをごりっと書き換えて対応した。
Perl用のコードを生成するときにも気をつけないとなあ。

(2014/02/18 追記) beelineについて

beelineで何も考えずドキュメントの例のとおりに接続しようとすると応答が返ってこず、接続できない。

NOSASLの場合は接続時に以下のように指定する必要がある。(CDH4.2, 4.5で確認)

!connect jdbc:hive2://localhost:10001/default;auth=noSasl hiveuser pass org.apache.hive.jdbc.HiveDriver

どこに書いてあんだよって感じだが、ドキュメントは探した限りなかった。以下のチケットのコメントの片隅にあった。
https://issues.apache.org/jira/browse/HIVE-4232

*1:どっかに書いておいてよ!!!!! 通信途中でコネクション切ったらhiveserver2のログに出てるスタックトレースが SaslTransport とかいうクラスを通ってるのを見てようやく気付けたよ

*2:未解決だった……。