気まぐれな備忘録(仮)

いちようSEしてるので、プログラミングの備忘録的なものを書いてます

CDH3u2で初めてHiveを使ってみる(初心者向け?)

というわけで、
CDH3u2で初めてHiveを使おうとしたら、
環境まわり(というかほとんどpermission denied)で
何度かはまったので、整理しておく。

なお、CDH3u2自体のインストールは、、忘れた。
このくらいならば、ぐぐればたくさんヒットする。

以下、前提条件として、hdfsユーザで操作を行うものとする。

CDH3u2のhiveをインストールすれば、
hiveコマンドのパスなど、自動で通してくれるので、
後は環境まわりを整理すればよい。

とりあえず、hiveコマンドを実行すると、以下のようなエラーが出力される。

-bash-4.1$ hive
Hive history file=/tmp/hdfs/hive_job_log_hdfs_201112070248_1529599074.txt
Exception in thread "main" java.io.FileNotFoundException: /usr/lib/hadoop-0.20/.hivehistory (Permission denied)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:145)
        at java.io.FileWriter.<init>(FileWriter.java:73)
        at jline.History.setHistoryFile(History.java:45)
        at jline.History.<init>(History.java:37)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:505)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:186)

「/usr/lib/hadoop-0.20/.hivehistory」のアクセス権限がないよ、
と怒られている訳だが、
もちろんhiveを初めて動かすので、「.hivehistory」なるファイルなど存在しない。

しかも、

-bash-4.1$ ll /usr/lib | grep hadoop-0.20
drwxr-xr-x   9 root root    4096 127 02:49 2011 hadoop-0.20

なことで、hdfsユーザじゃあ「/usr/lib/hadoop-0.20/」配下にファイルを作成できない。

なので、ひとまずrootユーザになって、このファイルをカキコできるように設定する。

[root@master conf]# touch /usr/lib/hadoop-0.20/.hivehistory
[root@master conf]# chmod 775 /usr/lib/hadoop-0.20/.hivehistory
[root@master conf]# ll /usr/lib/hadoop-0.20/.hivehistory
-rwxrwxr-x 1 root root 0 127 02:49 2011 /usr/lib/hadoop-0.20/.hivehistory
[root@master conf]# chown hdfs:hadoop /usr/lib/hadoop-0.20/.hivehistory

上記設定が終われば、改めてhdfsユーザになってhiveコマンドを実行する。

-bash-4.1$ hive
Hive history file=/tmp/hdfs/hive_job_log_hdfs_201112070250_1706396861.txt
hive>

無事にhiveコンソールが起動した。

ためしに、何もないのは分かっているものの、テーブル一覧を表示してみる。

hive> show tables;
2011-12-06 17:50:30.812 GMT Thread[main,5,main] java.io.FileNotFoundException: derby.log (Permission denied)
----------------------------------------------------------------
2011-12-06 17:50:31.212 GMT:
 Booting Derby version The Apache Software Foundation - Apache Derby - 10.4.2.0 - (689064): instance a816c00e-0134-147f-8d9f-000000948598
on database directory /var/lib/hive/metastore/metastore_db

Database Class Loader started - derby.database.classpath=''
OK
Time taken: 4.65 seconds

「/usr/lib/hive/conf/hive-site.xml」の設定もそのままなので、
DBのディレクトリは初期値「 /var/lib/hive/metastore/metastore_db」のままとのこと。

え?そんなことより、

2011-12-06 17:50:30.812 GMT Thread[main,5,main] java.io.FileNotFoundException: derby.log (Permission denied)

の方を気にしろって??

ひとまず、現在hiveコマンドを実行しているディレクトリは
「/usr/lib/hadoop-0.20」なので、ここに上記ファイルを作成する。

[root@master hive]# touch derby.log
[root@master hive]# chmod 777 derby.log
[root@master hive]# chown hdfs:hadoop derby.log
[root@master hive]# mv derby.log /usr/lib/hadoop-0.20/

上記設定後、改めてhiveコマンドを実行する。

-bash-4.1$ hive
Hive history file=/tmp/hdfs/hive_job_log_hdfs_201112070330_264158222.txt
hive> show tables;
OK
Time taken: 3.093 seconds

ってなカンジでエラーはでなくなった。


ただ、これが正しい設定なのかは、何とも言い難いが。。。