HiveやPigコマンドをHadoopクラスターで実行するには


Hive CLIでHiveQLを実行したりPigLatinをリモートのHadoopクラスターで実行する場合に必要なクライアント側のHadoop設定についてまとめてみました。
Hadoopは2系、動作の確認はCDH5を利用してしています。

Hive CLIやPigコマンドは、生成したたMapReduceジョブを同じマシンのHadoopクライアントを通してリモートのHadoopクラスタ上に送り実行します。

CoonectHadoopClusterFromHivePigCommand

リモートの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が正常終了したことを確認することができます。

ConfirmHiveJobFinishedOnResourceManagerWebInterface

Apache Pigの例はApache PigチュートリアルをビルドしてHadoopクラスタで動かすを参照ください。

,