Hadoop Hive の環境構築用にDocker Imageを作成した~ VM上でのテストからlocal のコンテナへ移行
CentOS でHive と Hadoopの環境構築
Hadoop と Hiveについて
前回はHadoopとHiveの環境をVirtual Box上のCentOSで構築し、Hive クエリの練習をするところまではできていました。
実際にやってみると、XMLでうまくEscapeされていない文字がエラーを起こしたりしていて少し大変でした。最近のPRで修正されていたので新しいVersionからは問題が発生しなくなると思います。
VM上にHive と Hadoopの環境を作成する
特にHiveの環境構築は大変だったので、できれば二回目はやりたくないと考えていましたが、
Virtual Boxに作った環境をたぶん間違えて全部削除してしまったのでもう一度作り直すことにしました。 (Macの容量が逼迫していたので大きなデータのものは無意識に消してしまった気がします)
前回まではVirtualBoxにCentOSの設定をして、各種ツールやOSSをマニュアルでダウンロードしていました。
今回は大部分を自動化しようかなと思ってDockerを使っていろいろ練習してみました。
Hive 環境の Docker imageを作成
Docker について
自分の理解では、簡単に言うと環境構築などをDockerfileで全て定義し、それをスナップショットのように保存してみんなと共有できると言う感じです。
これをすることで環境が統一でき、一部のサーバーで発生する謎のエラーみたいな現象が減らせます。
Docker/Kubernetes 実践コンテナ開発入門
Docker/Kubernetes 実践コンテナ開発入門 DockerとKubernetesの解説を初歩的なところから進めているのでかなりわかりやすいです。分量が多めなので必要な部分をその都度、読んでから実際にDockerfileを書いたりしてみると結構良いと思います。Dockerfileの作成とETL
今回作成しようとしているDocker Imageは出来るだけ前回の記事と同じVersionのツールライブラリで揃えようとしましたが、
HiveとHadoopのVersionが見つからなかったため一つ上のVersionを使っています。
おそらく大きな変化はなかったように思います。
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で行けるのなら