HiveとImpalaのSQLエディタによって、Hueはよく使用されるようになっています:
しかし、クエリの結果はどうなるのでしょうか?それらはどのくらい保持されているのでしょうか?それらはなぜ時々消えているのでしょうか?なぜ一部のImpalaのクエリは、それらが完了した場合でも、まだ「実行中」なのでしょうか?
各クエリでは、ImpalaやHiveServer2のいくつかのリソースを使用しています。ユーザが多くのクエリを投入すると、何も起こらない場合にはサーバを起動してクラッシュします。多くの改善が行われたHue 3 とCDH4.6のHueでは、自動的にすべてのメタデータクエリをクローズするようになりました。これらは微調整することができる最新の設定です:
Impala
Hueは、ユーザが結果ページから移動する際にクエリをクローズしようとします(クエリは一般的に高速なので、それらをすぐにクローズするのはOKです)。しかし、ユーザーがクエリの結果を確認しに戻ってこなかったり、ページをクローズしなかったりした場合、クエリは保持されたままになります。(HUE-2251で)Hue 3.7とC5.2から、Impalaはquery_timeout_sプロパティで10分以上アイドルになると、自動的にクエリが期限切れになります。
[impala]
# If QUERY_TIMEOUT_S > 0, the query will be timed out (i.e. cancelled) if Impala does not do any work (compute or send back results) for that query within QUERY_TIMEOUT_S seconds.
query_timeout_s=600
このバージョンまでの唯一の代替回避策は、すべてのクエリをクローズするためにHue(またはImpala)を再起動することです。
Hive
(いくつかのクエリには数時間処理がかかることがあるように)Hueは、デフォルトではHiveのクエリをクローズすることはありません。クエリの量が少ない(例えば、一日に数百未満)、かつ毎週HiveServer2を再起動する場合にはおそらく影響ありません。Impalaと同じ振る舞い(およびユーザーがページを離れたときに、クエリをクローズする)を得るには、hue.iniでオンに切り替えます:
[beeswax]
# Hue will try to close the Hive query when the user leaves the editor page.
#This will free all the query resources in HiveServer2, but also make its results inaccessible.
close_queries=true
CDH5と(HiveServer2のある)CDH4.6から、Hueにはいくつかのclose_queryとclose_sessionコマンドが追加されました。
build/env/bin/hue close_queries --help
Usage: build/env/bin/hue close_queries [options] <age_in_days> (default is 7)
7日以上古い実行されていないクエリをクローズします。
export HUE_CONF_DIR="/var/run/cloudera-scm-agent/process/`ls -alrt /var/run/cloudera-scm-agent/process | grep HUE | tail -1 | awk '{print $9}'`"
./build/env/bin/hue close_queries 0
Closing (all=False) HiveServer2 queries older than 0 days...
1 queries closed.
./build/env/bin/hue close_sessions 0 hive
Closing (all=False) HiveServer2 sessions older than 0 days...
1 sessions closed.
その後crontabにこのコマンドを追加して、N日以上経過したクエリを期限切れにすることができます。
備考
Kerberosを使用する際にも必要です:
export HIVE_CONF_DIR="/var/run/cloudera-scm-agent/process/`ls -alrt /var/run/cloudera-scm-agent/process | grep HUE | tail -1 | awk '{print $9}'`/hive-conf"
(Hive 0.14またはC5.2で利用可能になる)HIVE-5799の「クリーナー」ソリューションがあります。Impalaのように、これでHiveServer2は自動的にクエリを期限切れにすることができます。hive-site.xmlを少し編集します:
<property>
<name>hive.server2.session.check.interval</name>
<value>3000</value>
<description>The check interval for session/operation timeout, which can be disabled by setting to zero or negative value.</description>
</property>
<property>
<name>hive.server2.idle.session.timeout</name>
<value>0</value>
<description>Session will be closed when it's not accessed for this duration, which can be disabled by setting to zero or negative value.</description>
</property>
<property>
<name>hive.server2.idle.operation.timeout</name>
<value>0</value>
<description>Operation will be closed when it's not accessed for this duration of time, which can be disabled by setting to zero value. With positive value, it's checked for operations in terminal state only (FINISHED, CANCELED, CLOSED, ERROR). With negative value, it's checked for all of the operations regardless of state.</description>
</property>
備考
これはHiveのために推奨されるソリューションです。ユーザーが長く結果を保持したいと思う場合、CREATE TABLE AS SELECT… またはHueで結果をエクスポートすることができます。
総括
リソースが無限に増えていく必要がないので、クエリサーバーは、これらの変更によりはるかに安定してきています。トレードオフの一つは、ユーザーが一定時間後にクエリの結果を失うことになるということです。経験をより良いものにするために、自動的に結果セットのN行をダウンロードし、より長くそれらを保つように、いくつかのアイデアでが調査されています。