LoginSignup
24
19

More than 5 years have passed since last update.

WindowsでApache HiveとApache Sparkを動かす

Last updated at Posted at 2015-01-22

気軽に、HiveやSparkで遊ぶのにいいかと思って、MSYS/MinGW で HiveとSparkを動かした。Cygwinを使わずにMSYS (とJDK)だけで動作する。
ここでは、クラスターを作ることは意図せず、シングルノードモードだけで確認しているので、実用性はあまりないかもしれないが、hadoopのバージョンを 2.6.0にすればクラスターも作れる(*)。

Hive 最新バージョンではないが、GREEさんのhive-ruby-scriptingも動作する 0.12.0 を動かす。Spark は、比較的最新の 1.2.0を動かす(**)。

ローカルで手軽に使えるよう、ベースとなる hadoop は簡単にビルドできる古いバージョンで 0.23.11を使う。ギリギリ hadoop2 だが APIが古くて、YARNには期待が持てない。が、ローカルモードは実に簡単に動作して軽快に利用できる。
もともと数年前からWindowsでPigをローカルモードで動かすのにhadoop 0.23を使っていたもので、Hiveを使う機会に、シングルノードモードのHDFSも動作させた(hadoop 0.23.11でのクラスターモードは未確認)。

(*) Hadoopについては、Windows 8.1で Hadoop 2.6.0 をビルドするでビルドした Hadoop 2.6.0 を使えば、まともなYARNで Hiveを使うこともできる。
つまり、気軽にローカルモードで使うにはhadoop 0.23.11が簡単だし、本格的に使うなら、hadoop 2.6.0を選択できる。ここでは、主に hadoop 0.23.11での利用について記述する。

(**) Spark は、より新しい 1.4.0 について、Spark 1.4.0 の SparkR を動かす でビルドから扱っているので、参考にしてほしい。

最後のSparkは、hadoopを使わずにクラスターが組めるはずなので、実用性を持って使える場面があるだろう。

これらをビルド、実行するためのパッチをそれぞれ作成した。

ビルドが面倒な場合、以下から、Hadoop 2.6.0やそれに対応したHiveなども含め、ビルド済みバイナリを入手できる。

(http://sourceforge.jp/projects/win-hadoop/releases/62852)

まずは、Hadoopをビルドする

MSYSとJDKだけで動かすことを目標にしたので、MSYS/MinGWではなくて、msysGitでもよい。ただビルドには、プロトコルバッファコンパイラが必要なので、protoc バージョン2.5.0のバイナリ(https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.5.0-win32.zip) をダウンロードして、C:\Windowsフォルダにでもコピーしておく。

Hadoop 2.6.0を使う場合は、ここでのビルド方法は無視して、こちらを参照すること。Hadoop 2.6.0は、MSYSではなく、Windowsコマンドプロンプトから利用する。

Hadoop Archives (https://archive.apache.org/dist/hadoop/core/hadoop-0.23.11/) からhadoop-0.23.11-src.tar.gzを入手して、展開する。長いパスがあるので、C:\work などのような短い名前の親フォルダにすること。
Hadoop 0.23.11をMSYSでビルドするためのパッチ(https://github.com/qtwi/msys-hadoop-0.23.11/raw/master/patch/hadoop-0.23.11-src-mingw-0002r.patch) を入手して、パッチをあてる。

cd hadoop-0.23.11-src
patch -u -p1 < .../hadoop-0.23.11-src-mingw-0002r.patch

あとは、Mavenでビルドする。

mvn clean package -Pdist -DskipTests

ビルドが終了したら、hadoop-dist/target/hadoop-0.23.11にできあがっているので、適当な場所にコピーする。(例えば、C:\AppsやC:\Apacheなどのような)いろいろ手を抜いているので、すべて、C:ドライブでなければならない。

ローカルモードなら、JAVA_HOMEが正しく(HadoopではJAVA_HOMEに空白文字が使えないので c:/Progra~1/Java/jdk1.7.0_75のようなパスである必要がある)設定されていれば、そのまま動作するはず。
シングルノードモードで利用するときは、etc/hadoop/core-site.xmlに、fs.defaultFSとしてhdfs://localhost:9000を設定する。

  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>

hdfs-site.xml にも dfs.replication を設定する。

  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

通常の場合は、sbin/start-dfs.sh を使うが、今回は利用できないので、ネームノード、データノードをそれぞれ個別のウィンドウで、手作業で起動する。

bin/hdfs namenode -format   # 最初の1回だけHDFSのフォーマット
bin/hdfs namenode
bin/hdfs datanode

もっと簡単に常時起動したいなら、シェルスクリプトを使って、

#!/bin/bash
start bash -c "$HADOOP_HOME/bin/hdfs namenode"
start bash -c "$HADOOP_HOME/bin/hdfs datanode"

のような形で用意すればよいと思う。このほか、終了させるために、kill する必要があるので、pid を保存しておかないといけないけれど。

HDFSの操作は、また別のウィンドウから行うが、MSYSには、奇妙なパス文字列変換特性があり、ルートからのパスを指定するときは、先頭の "/" を二重にする必要がある。

bin/hdfs dfs ls //
bin/hdfs dfs -mkdir -p //user/yourname

# サンプルの実行
bin/hdfs dfs -put etc/hadoop input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.11.jar grep input output 'dfs[a-z.]+'
bin/hdfs dfs -cat output/\*

次に、Hiveをビルドする

Hive 0.12.0もアーカイブからソースをダウンロードする。(https://archive.apache.org/dist/hive/hive-0.12.0/)
Hive 0.12.0 をMSYSでビルドするためのパッチ(https://raw.githubusercontent.com/qtwi/msys-hadoop-0.23.11/master/patch/hive-0.12.0-src-mingw-0002r.patch) を入手して、パッチをあてる。

cd hive-0.12.0/src
patch -u -p1 < .../hive-0.12.0-src-mingw-0002r.patch

Hive 0.12.0は、antでビルドする。

ant clean package

オリジナルの Hive 0.12.0は、デフォルト Hadoop1でビルドされるが、パッチにより、Hadoop 0.23.11でビルドされる。Hadoop 2.6.0に対して、ビルドするには、以下のようにする。

ant clean package -Dhadoop.version=2.6.0 -Dhadoop-0.23.version=2.6.0 -Dhadoop.mr.rev=23

ビルド結果は、build/dist にあるので、適当なフォルダにコピーする。

conf/hive-env.shとconf/hive-site.xml を設定する。
ローカルモードで設定するとき、hive-site.xmlに設定する hive.metastore.warehouse.dir は注意がいる。先頭に "/"をつけた"/"区切りのWindowsフルパスである必要がある。くれぐれも、先頭の "/" を忘れないこと。例えば、

  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/c:/apps/hive-0.12.0/data/user/hive/warehouse</value>
  </property>

シングルノードモードであれば、上記は、特に気にする必要も設定する必要もないが、今度は、HDFS上に、 "/user/hive/warehouse" フォルダと /tmp を作成しておく必要がある。

# hadoop
bin/hdfs dfs -mkdir -p //user/hive/warehouse
bin/hdfs dfs -mkdir //tmp

Hadoop 0.23.11 の場合は、YARNを起動せずに hive を利用できるが、Hadoop 2.6.0 を使う場合は、YARNも起動する必要がある。(Hadoop 2.6.0 は、HDFSもYARNも、管理者権限のWindowsコマンドプロンプトから起動する)

# hadoop 2.6.0
start bin\yarn resourcemanager
start bin\yarn nodemanager

hive-site.xml にメタデータのフォルダを正確に指定しておくとSparkからSparkQLで使うときに設定が、簡単になる。(Sparkから、hiveのデータを読み込んでSparkで処理したり、HiveQLライクなSparkQLで処理できる)

  <property>
    <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:derby:;databaseName=c:/apache/hive-0.12.0/data/metastore_db;create=true</value>
  </property>

サンプルデータをHDFSにおいてから、hiveのコマンドラインで動作を確認する。

# hadoop
bin/hdfs dfs -put ../hive-0.12.0/examples/files/flights_tiny.txt
# hive
bin/hive --service cli

hive> create table flight (departure string, arrive string, year int, month int, day int, delay float, number int);
hive> load data inpath 'flights_tiny.txt' into table flight;
hive> select count(*) from flight;

コマンドラインインターフェイス以外の hwiやhiveserverなども動作するはずなので、試してみてほしい。

hive-ruby-scripting を使うなら、hive-ruby-scripting をビルドして、jarファイルを hiveのlibフォルダにコピーして、JRuby 1.7.4 (http://jruby.org/files/downloads/1.7.4/) をダウンロードして jruby.jar も libフォルダにコピーしておけば、利用が簡単になる。

git clone https://github.com/gree/hive-ruby-scripting
mvn clean package
cp hive-ruby-scripting.jar /c/apache/hive-0.12.0/lib

curl -LO https://s3.amazonaws.com/jruby.org/downloads/1.7.4/jruby-bin-1.7.4.tar.gz
tar xzf jruby-bin-1.7.4.tar.gz
cp jruby-1.7.4/lib/jruby.jar /c/apache/hive-0.12.0/lib

最後に、Apache Spark をビルドする

Spark 1.2.0のソースをダウンロードする。(https://archive.apache.org/dist/spark/spark-1.2.0/spark-1.2.0.tgz)
Spark は、ビルドしたフォルダで、そのまま使うことになるので、hadoopやhiveのバイナリをコピーしたフォルダに展開しておくとよい。
Spark 1.2.0をMSYSで使えるようにするパッチ(https://raw.githubusercontent.com/qtwi/msys-hadoop-0.23.11/master/patch/spark-1.2.0-mingw-0002r.patch) を入手して、パッチをあてる。

cd spark-1.2.0
patch -u -p1 < .../spark-1.2.0-mingw-0002r.patch

Sparkは、少し長めのオプションをつけて、Mavenでビルドする。

export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

mvn package -DskipTests -Phadoop-0.23 -Dhadoop.version=0.23.11 \
  -Pyarn-alpha -Phive -Phive-0.12.0 -Phive-thriftserver

hadoop 2.6.0に対してビルドするには以下のようにする。

mvm package -DskipTests -Phadoop-2.4 -Dhadoop.version=2.6.0 \
  -Pyarn -Phive -Phive-0.12.0 -Phive-thriftserver

ノートPCでのビルドは、30分ぐらいで終了する。

設定は、conf/spark-env.sh にHADOOP_HOMEとHADOOP_CONF_DIRを書く。SparkQLでHiveのデータベースを読み込むなら、HIVE_CONF_DIRを設定するが、hive-site.xml は、Sparkのconfフォルダに作成し、SparkのconfフォルダをHIVE_CONF_DIRに設定する。

export HADOOP_HOME=`cd $SPARK_HOME/../hadoop-0.23.11; pwd`
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"$HADOOP_HOME/etc/hadoop"}

export HIVE_CONF_DIR=$SPARK_HOME/conf

あとは、spark-shell で動作確認をする。

# Spark
bin/spark-shell

scala> val tf = sc.textFile("README.md")
scala> tf.count()

scala> val qc = new org.apache.spark.sql.hive.HiveContext(sc)
scala> qc.sql("SELECT COUNT(*) FROM flight").collect().foreach(println)

まとめ

クラスターを作って、使わないと Hadoopの本来の使い方も性能も期待できないが、純粋に HiveQLやHiveのUDF開発を楽しんだり、あるいは、Sparkを利用するのであれば、Hadoopのように重たいことばかりではないので、単体Windowsでの利用であっても、それなりに実用的な利用方法はあると思う。(まじめにHadoopクラスターを作るには、途中割り込んで記述した、Hadoop 2.6.0を利用すればよい。)

メインをWindows利用しているケースでは、GitのためにmsysGitをインストールしている場合も多いと思うし、Cygwinを使わないことで、かなり気軽にHiveやSparkを利用できると思う。

24
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
19