Hive CLIでHiveQLを実行したりPigLatinをリモートのHadoopクラスターで実行する場合に必要なクライアント側のHadoop設定についてまとめてみました。
Hadoopは2系、動作の確認はCDH5を利用してしています。
Hive CLIやPigコマンドは、生成したたMapReduceジョブを同じマシンのHadoopクライアントを通してリモートのHadoopクラスタ上に送り実行します。
リモートのHadoopクラスタの情報は、HiveやPigを実行するサーバー上のHadoopクライアントが参照する以下の3つのHadoopの設定ファイルに
設定します。
- core-site.xml
- yarn-site.xml
- mapred-site.xml
これらのファイルは、Hadoopクラスタからクライアントの$HADOOP_HADOOP_CONFディレクトリ(CDH5の場合は/etc/hadoop/conf)にコピーすれば良いのですが、以下最低限の設定についてメモしておきます。
core-site.xml
core-site.xmlには、HDFSのマスターであるNameNodeを指定します。
<!-- core-site.xml -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://<NameNodeのホスト名>:8020</value>
</property>
</configuration>
fs.default.nameにNameNodeをhdfs://<ホスト名:ポート名>の形式で設定します。
上記のポート8020はCDH5のデフォルトです。Apache Hadoopのデフォルトは9000です。
yarn-site.xml
Hadoop 2系はYARN上でジョブが実行されるのでyarn-site.xmlにResourceMangerのホストを指定します。
<!-- yarn-site.xml -->
<configuration>
...
<property>
<name>yarn.resourcemanager.hostname</name>
<value><ResourceManagerのホスト名></value>
</property>
...
</configuration>
yarn.resourcemanager.hostnameにホスト名を設定します。
mapred-site.xml
Job実行のマスターはyarn-site.xmlで指定しますが、JobHistoryServerの場所をmapred-site.xmlに設定する必要があります。
<!-- mapred-siete.xml -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value><JobHistoryServerのホスト名>:10020</value>
</property>
</configuration>
JobHisoryServerのポートは、CDHもApache版も同じく10020です。
Cloudera版のHiveをインストールしてリモートクラスタ上でジョブを実行する
Cloudera版のHiveをUbuntu 12.04にインストールし、構築済みのHadoopクラスタで実行させて見るまでの手順をまとめてみます。
データは、MovieLens | GroupLens (http://grouplens.org/datasets/movielens/) の映画評価100万件のサンプルml-1m.zipを利用します。
Hiveにテーブルを定義してデータをロードし、countを取ります。
まずは、Javaをインストール
$ sudo apt-get install default-jdk
$ sudo echo "export JAVA_HOME=/usr/lib/jvm/default-java" > /etc/profile.d/java.sh
$ sudo echo "PATH=$PATH:$JAVA_HOME/bin" >> /etc/profile.d/java.sh
$ . /etc/profile
$ echo $JAVA_HOME
/usr/lib/jvm/default-java
$ java -version
java version "1.6.0_33"
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.12.04)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
※Javaは、本来ディストリビューションが指定するバージョンのOracle Javaで動かすべきですが、トライアルなのでとりあえずOpenJDKをインストールしています
続いてHiveをインストール
$ wget http://archive.cloudera.com/cdh5/one-click-install/precise/amd64/cdh5-repository_1.0_all.deb
$ sudo dpkg -i cdh5-repository_1.0_all.deb
$ sudo apt-get update
$ sudo apt-get install hive
以下の3つのファイルを上記の通り設定します。
/etc/hadoop/conf/core-site.xml
/etc/hadoop/conf/yarn-site.xml
/etc/hadoop/conf/mapred-site.xml
映画評価のデータをダウンロードして解凍してます。
headで内容を確認すると4カラムのTSV形式のデータになっています。
$ wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
$ unzip ml-100k.zip
# head ml-100k/u.data
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
115 265 2 881171488
253 465 5 891628467
305 451 3 886324817
6 86 3 883603013
テーブルを定義して、ファイルをローカルディスクからロードします。
$ hive
hive> CREATE TABLE u_data (
> userid INT,
> movieid INT,
> rating INT,
> unixtime STRING)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
OK
Time taken: 2.643 seconds
hive> LOAD DATA LOCAL INPATH '/root/ml-100k/u.data' OVERWRITE INTO TABLE u_data;
Copying data from file:/root/ml-100k/u.data
Copying file: file:/root/ml-100k/u.data
Loading data to table default.u_data
Table default.u_data stats: [numFiles=1, numRows=0, totalSize=1979173, rawDataSize=0]
OK
Time taken: 0.921 seconds
ここでHadoopクラスタのHDFS上のパス/user/hive/warehouse/を確認するとu.dataがアップされていることが確認できます。
$ hadoop fs -ls /user/hive/warehouse/u_data
Found 1 items
-rwxrwxrwt 3 root supergroup 1979173 2014-11-22 23:04 /user/hive/warehouse/u_data/u.data
select countするとリモートのクラスタ上でMapReduceジョブが実行されます。
hive> select count(*) from u_data;
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1415017415196_0007, Tracking URL = http://ubuntu:8088/proxy/application_1415017415196_0007/
Kill Command = /usr/lib/hadoop/bin/hadoop job -kill job_1415017415196_0007
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2014-11-22 23:09:01,043 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 4.82 sec
MapReduce Total cumulative CPU time: 4 seconds 820 msec
Ended Job = job_1415017415196_0007
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 4.82 sec HDFS Read: 1979385 HDFS Write: 7 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 820 msec
OK
100000
Time taken: 40.976 seconds, Fetched: 1 row(s)
ResourceManagerのWebインタフェースで実行したHive Jobが正常終了したことを確認することができます。
Apache Pigの例はApache PigチュートリアルをビルドしてHadoopクラスタで動かすを参照ください。