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