Hadoop Hive の環境構築用にDocker Imageを作成した~ VM上でのテストからlocal のコンテナへ移行

f:id:what_a_day:20190209225250p:plain

CentOS でHive と Hadoopの環境構築

Hadoop と Hiveについて

前回はHadoopとHiveの環境をVirtual Box上のCentOSで構築し、Hive クエリの練習をするところまではできていました。

実際にやってみると、XMLでうまくEscapeされていない文字がエラーを起こしたりしていて少し大変でした。最近のPRで修正されていたので新しいVersionからは問題が発生しなくなると思います。

www.what-a-day.net

VM上にHive と Hadoopの環境を作成する

特にHiveの環境構築は大変だったので、できれば二回目はやりたくないと考えていましたが、

Virtual Boxに作った環境をたぶん間違えて全部削除してしまったのでもう一度作り直すことにしました。
(Macの容量が逼迫していたので大きなデータのものは無意識に消してしまった気がします)

www.what-a-day.net

前回まではVirtualBoxにCentOSの設定をして、各種ツールやOSSをマニュアルでダウンロードしていました。

今回は大部分を自動化しようかなと思ってDockerを使っていろいろ練習してみました。

Hive 環境の Docker imageを作成

Docker について

自分の理解では、簡単に言うと環境構築などをDockerfileで全て定義し、それをスナップショットのように保存してみんなと共有できると言う感じです。

これをすることで環境が統一でき、一部のサーバーで発生する謎のエラーみたいな現象が減らせます。

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門
DockerとKubernetesの解説を初歩的なところから進めているのでかなりわかりやすいです。分量が多めなので必要な部分をその都度、読んでから実際にDockerfileを書いたりしてみると結構良いと思います。

Docker/Kubernetes 実践コンテナ開発入門

Dockerfileの作成とETL

今回作成しようとしているDocker Imageは出来るだけ前回の記事と同じVersionのツールライブラリで揃えようとしましたが、

HiveとHadoopのVersionが見つからなかったため一つ上のVersionを使っています。

おそらく大きな変化はなかったように思います。

github.com

Hiveを実行してみる

Docker Buildをする

docker build . -t hive-docker

Dockerfileがある場所で、このコマンドを実行するだけでDocker Buildが完成です。

image はそれなりに大きく、4GBくらいの容量になりました。

docker build . -t hive-docker
docker image ls

このコマンドで hive-dockerが存在するか確認できます。

docker image ls

Docker Commandがない人はたぶん次のコマンドでインストールできるはずです。

brew cask install docker

Docker image ls を行うとIMAGE IDが見れるはずです。それを使ってコンテナに入ります。

docker run -i -t IMAGE_ID /bin/bash

一番最近作ったイメージにはいつもこうやって入っています。

docker run -i -t $(docker images -q | head -1) /bin/bash

コンテナに入った後は hive と打ち込むだけですぐにHiveが起動します。

Hive 簡単なコマンドの実行

DB の作成

CREATE DATABASE db_test;
USE db_test;

Table の作成

CREATE TABLE table_test
(
TEST_ID INT,
TEST_DATE STRING
)
PARTITIONED BY(dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
;

Data を入れる

INSERT INTO table_test partition (dt='2019AAA1') values (1,"TODAY");
INSERT INTO table_test partition (dt='2019AAA2') values (2,"TOMORROW");
INSERT INTO table_test partition (dt='2019AAA3') values (3,"YESTERDAY");

Selectする

select * from table_test where dt like "2019%";

これで動くのが確認できました。

少し気になったのが、次のようなメッセージが出てくることです。

Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions.

Hive2でMap Reduceはできないので他のツールを使えと言うことなんでしょうけど、少し調べる必要がありそうです。

Dockerfileでつまづいたところ

yum -y オプション

RUN yum -y upgrade
Is this ok [y/d/N]: Exiting on user command

このようなメッセージを残して勝手にDocker Buildを止めようとするので-yオプションを付けるようにしようと思いました。

Dockerfileでの環境変数パスの設定

export PATH=…のようなEnvironment Variableを~/.bashrcに直接書き込んでUpdateしようとしていましたが、

ENVコマンドだけで簡単に設定できました。

ENV PATH $PATH:$HIVE_HOME/bin

Java version

RUN yum -y install java-1.8.0-openjdk

JavaのVersionにはあまり詳しくないのですが、今回ダウンロードしたものはjava-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64と長かったです。

イメージしていた処理があったのですが、それはうまく行きませんでした。
x ARG java=rpm -ql java-1.8.0-openjdk | grep jre | head -n 1 としてJavaのVersion名とLocationを変数に入れてPathを通そうとしましたが失敗しました。

普通にPathの名前を固定のものに変更する方針にしました。

エスケープされていない文字の加工

RUN sed -i -e 's///' /usr/hive-3.1.1/conf/hive-site.xml

これはHiveのBugに似ているもので、hive-default.xml.templateをコピーして使用しようとするとIllegal character entity: expansion character エラーが発生します。
このエラーを防ぐために、うまくエスケープされていない文字を見つけて消す必要があります。
今回はbackspaceがエラーを引き起こしているのでこれを消す処理を入れました。

backspace ->  

まとめ

  • Hive 環境をDocker Imageでつくった
  • kubernetes で行う場合についても練習してみたい
  • Hadoop & Hive がDockerで行けるのなら