highlight

2017年3月11日土曜日

Apache Tez を Ubuntu 16.10 にインストールする

Hive on Spark をセットアップしてみようと思ったが、上手くいかなかった。生(MapReduce) Hive で良いかと思ってたが、hive を使っていると相変わらず、hive 2 を使うなら on Spark か Tez を使え。嫌なら Hive 1 にしとけ、と警告が出てくる。じゃあ Hive on Tez を使うか、という事で Tez をインストールする。

まず、Hive on Spark が動かない原因について。 Hive から Spark のタスクを起動しようとするときに、JavaSparkListener クラスが無いという例外が発生する。 Hive のバグレポートにも挙がっているが、現在の Spark では SparkListener クラスを使うようになっていて、JavaSparkListener は Spark 2.0 では deprecated どころか、削除されてしまったらしく、これを使っている現行 Hive 2.1.1 では Spark 2 が使えない。Hive のソースリポジトリの trunk だと、既に SparkListener を使うようになっていたので、checkout してビルドしてみようとも思ったが、metastore のスキーマバージョンが変わったりするし、spark は開発が活発過ぎて、尖った変更がさらっと入ったりする。それがまあ魅力でもあったりする訳だが、この先も互換性が取れなって苦戦するケースがあり得そうだし、ということで、ここでは Tez を使うことにした。Hive on Spark 2 は、Hive 2.2 がリリースされたら、また試してみる事にしよう。

インストール

Tez はバイナリでの配布も行っているようだが、基本的には自分でビルドせよという方針のようだ。ソースを取ってきて、pom.xml を見ると Hadoop 2.6 用にビルドされたものの様だし、バイナリパッケージを展開しても多分動くんだろうけど、ここはひとつ自前でビルドしてみよう。mvn を実行してみたところ、エラーになったので原因を探ると、protocol buffers 2.5 コンパイラ、git npm が必要のようなので、インストールしておく。protocol buffers 2.5 パッケージとして用意されておらず、旧バージョンなので、ホームディレクトリの ~/proto-2.5 にインストールする方針。tags のページから直接 tar.gz がダウンロード出来るが、こちらは configure スクリプトが入ってなかったので、v2.5.0 のページからダウンロードする事をお勧めする。だが敢えて configure を aclocal, autoconf で生成しても罰は当たらない。

apt install maven git npm
mkdir ~/proto-2.5
cd 適当な作業ディレクトリ
tar xvzf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=<ホームディレクトリ>/proto-2.5/   # prefix の値は絶対PATH指定でないとエラーになる。
make install
export PATH=~/proto-2.5/bin:$PATH
cd ..
tar xvzf ~/download/apache-tez-0.8.4-src.tar.gz
cd apache-tez-0.8.4-src
vi pom.xml # hadoop.version, pig.version, javac.version だけ、それぞれ 2.7.3, 0.16.0, 1.8 に変更した。
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true

ビルドが成功したら配備する。因みに最初にビルドしたときにはエラー終了したが、その時はもう眠かったので諦めた。翌日原因を調べようと思って同じコマンドを実行したら成功した。原因不明だが深くは追求しない。

cd /opt
mkdir apache-tez-0.8.4
ln -sf apache-tez-0.8.4 tez
cd tez
mkdir jars conf share
cp <tezをビルドしたディレクトリ>/tez-dist/target/tez-0.8.4.tar.gz share
cp <tezをビルドしたディレクトリ>/tez-api/src/test/resources/tez-site.xml conf
vi conf/tez-site.xml  # 下記参照
cd jars
tar xvzf <tezをビルドしたディレクトリ>/tez-dist/target/tez-0.8.4-minimal.tar.gz
su - hadoop
cd /opt/tez
hdfs dfs -mkdir /share/tez
hdfs dfs -put share/tez-0.8.4.tar.gz /share/tez

conf/tez-site.xml は以下のプロパティを設定する。

<property>
  <name>tez.lib.uris</name>
  <value>${fs.defaultFS}/share/tez/tez-0.8.4.tar.gz</value>
</property>

/etc/hadoop/hadoop-env.sh の HADOOP_CLASSPATH を設定している後ろあたりに、以下のような設定を追加する。

TEZ_JARS=/opt/tez/jars
export TEZ_CONF_DIR=/opt/tez/conf
export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:${TEZ_CONF_DIR}:${TEZ_JARS}/*:${TEZ_JARS}/lib/*

/etc/hadoop/mapred-site.xml の mapreduce.framework.name プロパティの値は、yarn-tez に変更する。この段階で yarn を再起動して、mapreduce してみる。

systemctl restart yarn.service
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar pi 10 1000

ここでエラーが出たら、メッセージに応じて対処する。web ブラウザで、localhost:8088 にアクセスして、Finished Applications 画面を開き、Application Type が TEZ になっているアプリケーションがあれば、TEZ が使われている。

Hive の設定

/opt/hive/conf/hive-site.xml に以下のプロパティを設定する。

<property>
  <name>hive.execution.engine</name>
  <value>tez</value>
</property>

hive のサービスを再起動する。

systemctl restart hive-metastore.service
systemctl restart hiveserver2.service

hive で何か count(*) とか MapReduce が発生するクエリで動作確認する。

SLF4J: Class path contains multiple SLF4J bindings.

こういう警告が出たら、slf4j-log4j の jar が他と被っているという事なので、/opt/hadoop 以下の jar を使うことにして、他のディレクトリにあるこの jar は rm しておけばいい。多分。

後始末

大体の動作確認が出来たら、ビルドディレクトリ等は削除しても構わない。普段 java でビルドを行うホストで無いなら、maven リポジトリも削除して良いだろう。

rm -rf ~/proto-2.5 <protocol buffers をビルドしたディレクトリ> <tez をビルドしたディレクトリ>
rm -rf ~/.m2/repository

0 件のコメント:

コメントを投稿

スパムフィルタが機能しないようなので、コメント不可にしました。

注: コメントを投稿できるのは、このブログのメンバーだけです。