Docker で分散処理をやってみたTIS 株式会社 安達貴志
* 資料は slideshare に公開しています アカウント名 : atk1234
自己紹介• 名前 安達貴志 ( あだち たかし ) ( 新弟子と呼ばれています )
• 所属 TIS 株式会社 入社1年目• 興味があるもの Zabbix,Docker,Hadoop,Ansible,WebGL, AngularJS,DQN,Machine-Lerning ・・・ 節操がない 某キャラクタといい勝負
ライブラリ
サーバホスト OS
Docker エンジンライブラリ
アプリケーション
アプリケーション
アプリケーション
アプリケーション
アプリケーション
コンテナ毎にカーネルを持たないため・早い・軽い・手軽
牛丼のような特徴がある
一方で、たくさんのコンテナの使い道に困る ライブラリDocker エンジン
ライブラリ
アプリケーションC
アプリケーションA
アプリケーションB
アプリケーションE
アプリケーションD
アプリケーションF
コンテナ間で分散処理をしてみる
Hadoop で分散処理するコンテナC
コンテナA
コンテナB
コンテナEコンテナD
Big Data
新情報!?
Hadoop
やってみたこと
コンテナC
コンテナA
コンテナB
コンテナE
コンテナD
Big Data
新情報!?もしかして :google
Docker でコンテナ立てて、Hadoop で分散処理する
環境
AWS 上の EC2 インスタンス 1台(t2.large)
構築手順環境構築 •Dockerのインストール
•Docker-Composeのインストール
Hadoop •Hadoopを入れたコンテナの作成•コンテナ間の連携(Docker-Compose)
分析 •分析データの入手•分析
環境構築 ~ Docker と Docker-Composeyum で Docker をインストールDocker
curl コマンドでバイナリをダウンロードし、実行権限を付与するDocker-Compose
簡単です
Hadoop ~コンテナの作成とコンテナ間の連携コンテナの作成
コンテナ間の連携Docker-Compose で各コンテナ間にリンクを貼り、クラスタを構築する
Java のインストールHadoop のインストール
分散処理の設定 長いため、詳細は省略
分析 ~データの入手と分析・公開されている 130 万件のパスワード・使われているワードを集計する
データの入手
・パスワードを分割し、各コンテナで集計する・集計後、結果を統合する分析
https://github.com/danielmiessler/SecLists/blob/master/Passwords/10k_most_common.txthttps://github.com/danielmiessler/SecLists/blob/master/Passwords/darkc0de.txthttps://github.com/danielmiessler/SecLists/blob/master/Passwords/Ashley_Madison.txthttp://area51archives.com/index.php?title=Ultimate_Password_List
処理時間の比較と分析結果
順位 ワード1 123456
2 password
3 12345
処理マシン 処理時間 (s)Hadoop 49.6
Python による単独処理
27.9
Hadoop と通常のマシンによる処理時間の比較
処理があまりにも単調だったためジョブの分割に時間がかかり、単独処理のほうが早くなった・・・多く使われていたパスワード TOP3
分析結果
処理時間の比較
まとめ結論• 仮想マシンでクラスタを組むよりも手軽に実施できる -> 開発やテスト環境向けを作るときに楽 -> バージョンをイメージで管理できる次の目標• Spark と連携したい• VM のクラスタの処理時間と比較したい
最後に・・・TIS では、OSS に関するサポートやシステムの設計、構築などを行っています興味がある方はぜひ TIS ブースまでお立ち寄りください
ご清聴ありがとうございました
補足 : 構築方法
構築手順環境構築 • Docker のインストール
• Dokcer-compose のインストール
ファイルの作成と配置• Dockerfile• Docker-compose.yml• Hadoop 用の xml ファイル• Rpm ファイル
イメージの作成
• Hadoop を入れたイメージの作成• 上記のイメージからマスタサーバとスレーブサーバのイメー
ジを作成する
起動とテスト• イメージからマスタサーバとスレーブを立ち上げる• 各初期設定• テスト用プログラムの実行
Docker のインストール① yum –y install docker② service docker start
下記の表示がでれば OK$dockerUsage: docker [OPTIONS] COMMAND [arg...]
A self-sufficient runtime for linux containers.
Options:・・・
Docker-compose のインストール① curl -L
https://github.com/docker/compose/releases/download/1.4.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
② chmod +x /usr/local/bin/docker-compose
下記の表示がでれば OK$docker-compose –versiondocker-compose version: 1.4.2
ファイルの作成と配置
rpm ファイルは以下から事前にダウンロードしておく・ cloudera-cdh-5.0.x86_64.rpmcurl -LO http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
・ oracle jdkcurl -LO -b "oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm
左図のようなファイル構造を作成する
DockerfileFROM centos:latest
USER root
RUN yum -y update
RUN yum -y install sudo wget
ADD rpm /tmp/rpm/
RUN rpm -ivh /tmp/rpm/jdk-7u79-linux-x64.rpm
RUN rm /tmp/rpm/jdk-7u79-linux-x64.rpm
ENV JAVA_HOME /usr/java/default
ENV PATH $PATH:$JAVA_HOME/bin
RUN mv /tmp/rpm/cloudera-cdh-5-0.x86_64.rpm /usr/local/src/
RUN rpm -ivh /usr/local/src/cloudera-cdh-5-0.x86_64.rpm
RUN rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
RUN yum -y install hadoop-conf-pseudo
RUN rm -rf /tmp/rpm
Dockerfile( 続き )
RUN sed -ri 's/Defaults requiretty/#Defaults requiretty/g' /etc/sudoers
ADD xml /tmp/xml/
ENTRYPOINT /sbin/init
EXPOSE 50010 50020 50070 50075 50090EXPOSE 19888EXPOSE 8020 8030 8031 8032 8033 8040 8042 8088EXPOSE 49707 2112
docker-compose.ymlmaster:
build: ./master
hostname: master
ports:
- "50070:50070"
privileged: true
links:
- "slave1"
- "slave2"
slave1:
build: ./slave
hostname: slave1
links:
- "slave2"
privileged: true
slave2:
build: ./slave
hostname: slave2
privileged: true
master/dockerfile
FROM hadoop:1.0
USER rootADD init-master.sh /tmp/init-master.shRUN chown root:root /tmp/init-master.shRUN chmod 700 /tmp/init-master.shCMD ["tmp/init-master.sh","-d"]
master/init-master.sh#!/bin/bash
sudo cp -prL /etc/hadoop/conf /etc/hadoop/conf.distribute.mr1
sudo alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.distribute.mr1 50
sudo mv -f /tmp/xml/core-site.xml /etc/hadoop/conf/core-site.xml
sudo mv -f /tmp/xml/hdfs-site.xml /etc/hadoop/conf/hdfs-site.xml
sudo mv -f /tmp/xml/mapred-site.xml /etc/hadoop/conf/mapred-site.xml
sudo service hadoop-hdfs-namenode start
sudo -u hdfs hdfs namenode -format
sudo useradd hadoop_exec
sudo -u hdfs hadoop fs -mkdir -p /user/hadoop_exec
sudo -u hdfs hadoop fs -chown hadoop_exec /user/hadoop_exec
sudo -u hdfs hadoop fs -chmod -R 777 /
sudo service hadoop-yarn-resourcemanager start
sudo service hadoop-mapreduce-historyserver start
slave/Dockerfile
FROM hadoop:1.0
USER rootADD init-slave.sh /tmp/init-slave.shRUN chown root:root /tmp/init-slave.shRUN chmod 700 /tmp/init-slave.shCMD ["/tmp/init-slave.sh","-d"]
slave/init-slave.sh#!/bin/bash
sudo cp -prL /etc/hadoop/conf /etc/hadoop/conf.distribute.mr1
sudo alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.distribute.mr1 50
sudo mv -f /tmp/xml/core-site.xml /etc/hadoop/conf/core-site.xml
sudo mv -f /tmp/xml/hdfs-site.xml /etc/hadoop/conf/hdfs-site.xml
sudo mv -f /tmp/xml/mapred-site.xml /etc/hadoop/conf/mapred-site.xml
sudo service hadoop-hdfs-datamode start
sudo useradd hadoop_exec
sudo service hadoop-yarn-nodemanager start
xml/core-site.xml ( 変更箇所のみ )
<property> <name>fs.defaultFS</name> <value>hdfs://master:8020</value> </property>
xml/hdfs-site.xml ( 変更箇所のみ ) <property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/var/lib/hadoop-hdfs/cache/${user.name}/dfs/data</value>
</property>
xml/mapred-site.xml ( 変更箇所のみ ) <property>
<name>mapred.job.tracker</name>
<value>master:8021</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
イメージの作成Centos から Hadoop 用イメージを作成する $docker build –t Hadoop:1.0 .
Hadoop イメージからマスタ / スレーブ用のイメージを作成する $docker-compose build
master サーバの設定• docker exec -it XXXX_master_1 /bin/bash
• 初期設定を行う /tmp/init-master.sh
slave サーバの設定 (2 台とも )• docker exec -it XXXX_slave_1 /bin/bash
・初期設定を行う /tmp/init-slave.sh
・ hosts ファイルに、各コンテナの FQDN を記述する・記述後、 datanode を再起動するService Hadoop-hdfs-datanode restart
テスト用プログラムの実行sudo -u hdfs hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.X.X-cdh5.1.2.jar pi 10 300
無事、円周率が表示されれば成功