とりあえずはじめよう!


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

HIVE


できあがってるHIVEのインストール方法

ダウンロードを行う。
ダウンロード元 - http://hive.apache.org/releases.html

まず展開。
$ tar -xzvf hive-x.y.z.tar.gz
HIVEの環境変数の設定。
$ cd hive-x.y.z
$ export HIVE_HOME=`pwd`
PATHを通す。
$ export PATH=$HIVE_HOME/bin:$PATH

ソースからのHIVEのビルド

Subversionからチェックアウト
 $ svn co http://svn.apache.org/repos/asf/hive/trunk hive
 $ cd hive
 $ ant clean package
 $ cd build/dist
 $ ls
 README.txt
 bin/ (all the shell scripts)
 lib/ (required jar files)
 conf/ (configuration files)
 examples/ (sample input and query files)

HIVEの実行

Hadoopのインストールパスを環境変数に設定
$ whereis hadoop

$ export HADOOP_HOME=
/tmp と /user/hive/warehouse を作成。そしてGroupのwrite権限を作成。
 $ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
 $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
 $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
 $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse
HIVEが立ち上がるかテスト。
 $ $HIVE_HOME/bin/hive

実行中の設定について

  • HiveのクエリーはMapReduce処理を実行することで実現されます。ですので、クエリーの振る舞いはHadoop設定変数によって制御できます。
  • SET コマンドを使えばHadoop設定用変数(Hive設定用変数も)セットできます。たとえば、
   hive> SET mapred.job.tracker=myhost.mycompany.com:50030;
   hive> SET -v;

Hive, Map-Reduce、ローカルモード

Hiveのコンパイラは(ほぼ)全クエリーに対してMap-Reduce の ジョブを生成します。これらのジョブは、以下の変数で指定したMap-Reduceのクラスタに送られます。
 mapred.job.tracker
この変数には、大抵複数ノードを持つMap-Reduceクラスタを指定しますが、Hadoopはユーザの実行環境内でローカルでジョブを実行するための便利なオプションを用意しています。
小さいデータセットに対してクエリーを実行する際に非常に便利に使える。こんな場合、ローカルモードでの実行は、大規模クラスタにジョブを送信するよりも、普通めっち処理速度が上がる。
データはHDFSに透過的にアクセスします。逆に、ローカルモードはReducerを1個しか使わないので、大きなデータを扱おうとするとめっちゃ遅いです。

Version0.7からHIVEもローカルモードの実行をサポートしています。こんな感じで実行します。
 hive> SET mapred.job.tracker=local;
また、 mapred.local.dirにはローカルでのパスを指定する必要があります。(そうしないとエラー発生するよ。)

Version0.7からHIVEでは自動的にローカルモードで実行してくれるモードをサポートしてます。こんな感じで設定。
 hive> SET hive.exec.mode.local.auto=true;

このオプションはデフォルトではfalseになっています。もしtrueにしたら、Hiveはクエリー内のMap-Reduce処理を解析して、以下の条件に該当した場合に自動でローカルモードで実行します。
  • ジョブのインプットサイズが次の値以下。 hive.exec.mode.local.auto.inputbytes.max (128MB by default)
  • mapタスクの数が次の値以下。 hive.exec.mode.local.auto.tasks.max (4 by default)
  • reduceタスクの数が1 または 0。

小さいデータセットに対するクエリーや、複数のMap-Reduce処理をもつクエリーに後続するジョブのインプットは実際小さくなっていくので、ジョブはローカルで行われるかもしれません。

HadoopサーバのノードやHadoopクライアントの実行環境の差異があることには注意が必要です。
これはローカルモードでの実行の差異を引き起こすことがあります。別々のJVMで実行されますからね。もしやりたいなら、hive.mapred.local.memで最大メモリ数を決めた方がいいよ。

エラーログ


Hiveはlog4jを使ってログを出してます。デフォルトではコンソール上にエラーはでません。デフォルトのログレベルはWARNで、以下のファイルに出力されます。
  • /tmp/{user.name/hive.log}
コンソールにログを出したいなら、以下のように設定しましょう。
  • bin/hive -hiveconf hive.root.logger=INFO,console
また、以下を実行するだけでログレベルを変えられます。
  • bin/hive -hiveconf hive.root.logger=INFO,DRFA
SET構文を使ってhive.root.loggerじゃセットできないから注意。これ初期化時に決めるからダメなんだ。

HadoopクラスタでのHIVE実行ログは、Hadoop設定で制御します。大抵、Hadoopはタスクが実行されたクラスタが持っているMap-Reduce処理1つに対して1つのログファイルを作ります。このログファイルは、Hadoop Job Tracker のWEB UI のTask Detail ページでクリックすると見れます。

ローカルモードで実行してるときは、クライアントマシン内にログができます。Ver0.6からはHiveはhive-exec-log4j.propertiesでデフォルトのログ出力先を決めます。デフォルトの設定ファイルは、ローカルモードで実行されたクエリーに対して1つのログが作られ、/tmp/{user.name}に出力されます。個別の設定ファイルにしている理由は、必要に応じて実行ログの集中管理を可能とすることです。実行ログは実行時のエラーをデバッグするための貴重な記録です。

DDL操作

 hive> CREATE TABLE pokes (foo INT, bar STRING);  
一方はinteger、もう一方はStringの型をもつ2つのカラムがあるpokesテーブルを作成。
 hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);  
2つのカラムを持っていて、1つのパーティションカラムdsをもつpokesテーブルを作成。パーティションカラムは、仮想的なカラムです。これ自体はデータの一部ではありませんが、特定のデータセットから読み込まれていたものの一部から派生しています。

デフォルトでは、テーブルはテキスト形式で^A(ctrl-a)区切りとなっているはずです。
 hive> SHOW TABLES;
テーブル一覧の表示してます。
 hive> SHOW TABLES '.*s';
sで終わるテーブル一覧を表示してます。ここの正規表現はJavaの正規表現に則っています。
 hive> DESCRIBE invites;
カラムの一覧を表示してます。

テーブルを作成後に、テーブル名を変更したり、カラム追加をするには以下。
 hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
 hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
 hive> ALTER TABLE events RENAME TO 3koobecaf;
テーブル削除は以下。
 hive> DROP TABLE pokes;

メタデータ


メタデータは、derbyデータベースに登録されます。このDBのディスクストレージ位置は、javax.jdo.option.ConnectionURL変数にて指定します。
デフォルトでは(conf/hive-default.xml)、./metastore_db になっています。

現在、デフォルトの設定では1人Userにしかみられることができません。

メタデータは、JPOXをサポートしてるDBならなんだってOKです。ロケーションとRDBの型については次の2つの変数によりコントロールしています。javax.jdo.option.ConnectionURLjavax.jdo.option.ConnectionDriverName です。サポートしてるDBの詳細については、JDOまたはJPOXのドキュメントを参照してください。DBのスキーマは、src/contrib/hive/metastore/src/model にある package.jdo で定義されています。

将来、メタデータはそれだけでスタンドアロンのサーバになるでしょう。

もしメタデータをネットワークサーバとして扱いたかったから、HiveDerbyServerMode を複数ノードで試してみるといいかも。

DML操作


普通のファイルからHIVEにデータをロード。
  hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes; 

Ctrl-Aによって分割された2つのカラム値をもったファイルをHIVEへロードしています。'local'はファイルがローカルにあることを示しています。もし'local' を抜いたら、HDFS上を探すことになります。

'overwrite' は、テーブルにもともと存在していたデータが削除されることを示します。もし'overwrite' がなければ、もともとあったデータの後にappendすることになります。

注意:
  • LOADコマンドでは、スキーマ定義とデータがあっているかの検証は行いません。
  • ファイルがHDFS上にある場合、HIVEのファイルスペースに移動されます。
HIVEディレクトリのルートは、hive.metastore.warehouse.dirオプションで指定されます。hive-default.xmlにあるよ。だからHIVEでテーブル作る前にまず、HDFS上にこれ作っておいたほうがいいよ。

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
 hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
2つのデータは、テーブルのパーティションごとに挿入されています。テーブルは、dsによってパーティションが切られてないといけませんよ。

 hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
上記コマンドはHDFS上のファイルからデータ投入していますね。そのファイル、ディレクトリが移動してしまうことには注意が必要です。また結果として、こっちの方がはやいっす。