Hiveのユーザ変数はhiveconfとhivevar、どちらを使うのが良い?

Hiveで変数を使う時にhiveconfかhivevarかどちらを使うか迷う場合があるのですが、なんとなくユーザ変数の場合はhiveconfを使わない方がいいようです。
LanguageManual VariableSubstitution
公式ドキュメントを読むとユーザ変数は、hivevar、system、envを使うとなってます。

hivevarを使うメリットとしては、namespaceが不要で${var}のみで変数展開できるところでしょうか。hiveconfの場合は${hiveconf:var}となりコードがやや読み辛くなります。

hive (testdb)> set hiveconf:var01=aaa;
hive (testdb)> set hivevar:var01=bbb;
hive (testdb)> select '${var01}';
OK
bbb
Time taken: 0.769 seconds, Fetched: 1 row(s)
hive (testdb)> select '${hiveconf:var01}';
OK
aaa
Time taken: 0.521 seconds, Fetched: 1 row(s)



Hadoopのworkflow(JOB管理)

Hadoopのワークフロー(JOB管理)はClouderaやHortonにdefaultでついてくるOozieを使うようですが、このOozieが異常に使いにくくcronで済ませてしまう場合もあります。
が、バッチジョブなどで込み入ったフローを作成しようとするとcronでは管理しきれず限界に達してしまいます。障害対応も作りこむ必要があります。

そんなこんなで、いろいろなJOB管理をまとめてみました。

workflow 説明
Oozie http://oozie.apache.org/
米Yahooで開発されたJavaで書かれたJOB管理ツール。使い難さ(?)で定評あり。xmlでJOBを定義していく。UTC固定のため日本時間の場合は+9時間する
Falcon http://falcon.apache.org/
使い難いOozieを何とかしようと開発されたFalcon。というのは冗談で、複数Oozieコーディネータの統合管理が可能。しかし中身はOozieのため結局使い難い
Azkaban http://azkaban.github.io/azkaban/docs/latest/
LinkedInにて開発されているJavaで書かれたJOB管理。恐らく一番使いやすいと思われる。設定は独自のKey/Value構文で書くが理解しやすい。OozieとマージしてOozkabanと呼ばれるものもあるらしい(詳細不明)
Luigi https://github.com/spotify/luigi/
Spotifyで開発されており、Python、shで書かれている。Yahoo(恐らくアメリカ)でも利用されている。設定はMySQL等のconfigファイルちっくな構成で作成する
Airflow https://github.com/airbnb/airflow/
最近話題のAirBnBで開発されており、Pythonで書かれている。kerberosにも対応済み。
Pinball https://github.com/pinterest/pinball
Pinterestで開発されており、Python/JavaScriptで書かれている。BUILDするためにはnpmコマンドが必要なためNode.js等の環境が必要になる。JOBはyamlで設定する

ほとんど、MR(yarn)/HIVE/PigのJOBを投げることが可能であり、ローカルのコマンドを叩くことも可能。
また、Plugin拡張できるものもあり、AzkabanやAirflowはHDFS/HIVE metastoreの参照、独自のレポート機能などを持っているものもある。

[HBase] hbase shellのhistory設定

defaultだと入っていない、hbaseのhistoryを設定。hbase shellのクエリにはSQLではなく独自のgetやらputコマンドを使うので履歴が使えないかなり苦労します。

ということで、下記 .irbrc を$HOMEに作成すると .irb_history のヒストリーファイルに履歴が保存される。

$HOME/.irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 200
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history"
Kernel.at_exit do
    IRB.conf[:AT_EXIT].each do |i|
        i.call
    end
end


HIVEのdrop table時のTable metadata not deleted since ~ is not writable エラー

hiveで、CREATE EXTERNAL TABLEで作成したテーブルを削除するときに、参照しているhdfsのディレクトリにwrite権限がないとエラーになる場合の対応方法のメモ。

まず、テーブル作成
hive> create external table tbl_test(col1 STRING, col2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
LOCATION '/user/hdfs/data/';    ← ここにwrite権限がない
OK
Time taken: 1.821 seconds
で、削除してみる
hive> drop table tbl_test;
FAILED: Error in metadata: MetaException(message:Table metadata not deleted since hdfs://hdfs.cdh.com:8020/user/hdfs/data is not writable by user01)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

こういう場合は一旦、locationを自分のtmpフォルダなどに変更する。
hive> alter table tbl_test set location 'hdfs://hdfs.cdh.com:8020/user/user01/tmp/';
create時のpathはhdfsの/(ルート)からのパスを指定すればいいが、alter table set locationの場合は、hdfs urlで指定する。
(hdfs://hdfs.cdh.com は利用しているhadoopのサーバを指定)

で、その後削除。
hive> drop table tbl_test;
OK
Time taken: 0.254 seconds

と、思っていたら、CDH5.0.1に入っているHIVEのバージョンでは上記の問題が解決されている模様。

カテゴリ

Amazon

アクセスランキング

[ジャンルランキング]
コンピュータ
249位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
38位
アクセスランキングを見る>>

RSSリンクの表示

ブロとも申請フォーム

Copyright © nopgm