Hiveのユーザ変数はhiveconfとhivevar、どちらを使うのが良い?
- Sun
- 22:32
- hadoop関連
Hiveで変数を使う時にhiveconfかhivevarかどちらを使うか迷う場合があるのですが、なんとなくユーザ変数の場合はhiveconfを使わない方がいいようです。
LanguageManual VariableSubstitution
公式ドキュメントを読むとユーザ変数は、hivevar、system、envを使うとなってます。
hivevarを使うメリットとしては、namespaceが不要で${var}のみで変数展開できるところでしょうか。hiveconfの場合は${hiveconf:var}となりコードがやや読み辛くなります。
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管理)
- Sun
- 21:17
- hadoop関連
Hadoopのワークフロー(JOB管理)はClouderaやHortonにdefaultでついてくるOozieを使うようですが、このOozieが異常に使いにくくcronで済ませてしまう場合もあります。
が、バッチジョブなどで込み入ったフローを作成しようとするとcronでは管理しきれず限界に達してしまいます。障害対応も作りこむ必要があります。
そんなこんなで、いろいろなJOB管理をまとめてみました。
ほとんど、MR(yarn)/HIVE/PigのJOBを投げることが可能であり、ローカルのコマンドを叩くことも可能。
また、Plugin拡張できるものもあり、AzkabanやAirflowはHDFS/HIVE metastoreの参照、独自のレポート機能などを持っているものもある。
が、バッチジョブなどで込み入ったフローを作成しようとすると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設定
- Sun
- 21:17
- hadoop関連
defaultだと入っていない、hbaseのhistoryを設定。hbase shellのクエリにはSQLではなく独自のgetやらputコマンドを使うので履歴が使えないかなり苦労します。
ということで、下記 .irbrc を$HOMEに作成すると .irb_history のヒストリーファイルに履歴が保存される。
$HOME/.irbrc
ということで、下記 .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 エラー
- Mon
- 23:31
- hadoop関連
hiveで、CREATE EXTERNAL TABLEで作成したテーブルを削除するときに、参照しているhdfsのディレクトリにwrite権限がないとエラーになる場合の対応方法のメモ。
まず、テーブル作成
こういう場合は一旦、locationを自分のtmpフォルダなどに変更する。
(hdfs://hdfs.cdh.com は利用しているhadoopのサーバを指定)
で、その後削除。
と、思っていたら、CDH5.0.1に入っているHIVEのバージョンでは上記の問題が解決されている模様。
まず、テーブル作成
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のバージョンでは上記の問題が解決されている模様。