OSC Tokyo fall LT~Dockerで分散処理をやってみた

Post on 15-Feb-2017

498 views 6 download

Transcript of OSC Tokyo fall LT~Dockerで分散処理をやってみた

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

無事、円周率が表示されれば成功