23 Nisan 2018 Pazartesi

linux ortamında hadoop'u docker container'ı içinde çalıştırma - (Hadoop Multinode Cluster with Docker)

Merhaba,
bu yazımda sizlere yine bir hadoop kurulumu paylaşacağım. Hadoop'u dağıtık(multi node) olarak kuracağım.  Bildiğiniz üzere daha önceden hadoop kurulumunu analatan  bir yazı paylaşmıştım.  Ancak bu yazımda hadoop'u docker kullanarak kurup  her bir node'u docker container'ı olarak çalıştıracağım. Dolayısıyla multi node hadoop kurulumu yaptığınızda tek tek sanal makine kopyalamak durumunda kalmayacaksınız. Bu sayede hem zaman hem de yer(disk) kazanımında bulunmuş olacağız.

Yeri gelmişken bir not düşerek tekrar bir hatırlatma yapayım; hadoop'u single node ve multi node olarak kurabiliyorsunuz. Single node da task tracker, data node, job tracker ve name node ların tamamı tek bir bilgisayar üzerindedir.  Ancak multi node yapısında ise bu birimleri farklı bilgisayarlar üzerinde çalıştırmak amaçlanmıştır. Bu sayede çok büyük verilerin analizi daha da kolaylaşmıştır.

Yazının devamında yapılacak işlemleri özetlemek gerekirse;
- içinde docker ve java kurulmuş olan bir docker image'ı oluşturacağız.
- Bu image dan 1 adet master docker container'ı oluşturacağız.
- Yine aynı docker image'ından N tane slave container oluşturacağız.

1 adet master ve N tane slave node oluşturacak yapıyı kurmak için aşağıdaki adımları takip ederek uygulayın.

Oluşturacağımız docker container ların birbirleriyle haberleşebilmesi için tüm bu containerlar aynı ağda olmalıdır. Dolayısıyla ilk olarak terminali açarak  docker ile bir ağ(network) oluşturun. 

 $ docker network create -d bridge   --subnet 172.25.0.0/16  hadoopNetwork

Bulunduğunuz dizinde Dockerfile adında bir dosya oluşturarak aşağıdaki içeriği bu dosyaya ekleyin. 

FROM ubuntu:16.04
MAINTAINER Levent YILDIZ <dev.levent.yildiz@gmail.com>

RUN apt-get update
RUN apt-get install openjdk-8-jdk -y
RUN apt-get install -y wget
RUN apt-get install -y openssh-server
RUN wget https://archive.apache.org/dist/hadoop/core/hadoop-2.7.5/hadoop-2.7.5.tar.gz -P ~/Downloads
RUN tar zxvf ~/Downloads/hadoop-2.7.5.tar.gz  -C /usr/local
RUN mv /usr/local/hadoop-* /usr/local/hadoop

RUN mkdir /var/hadoop

ENV  JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre/
ENV  PATH $PATH:$JAVA_HOME/bin
ENV  HADOOP_HOME /usr/local/hadoop
ENV  PATH $PATH:$HADOOP_HOME/bin
ENV  HADOOP_CONF_DIR /usr/local/hadoop/etc/hadoop

RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

COPY conf/* /tmp/

RUN mv /tmp/ssh_config ~/.ssh/config
RUN mv /tmp/core-site.xml /usr/local/hadoop/etc/hadoop/core-site.xml
RUN mv /tmp/mapred-site.xml /usr/local/hadoop/etc/hadoop/mapred-site.xml
RUN mv /tmp/hdfs-site.xml /usr/local/hadoop/etc/hadoop/hdfs-site.xml
RUN mv /tmp/masters /usr/local/hadoop/etc/hadoop/masters
RUN mv /tmp/slaves /usr/local/hadoop/etc/hadoop/slaves

RUN /tmp/env.sh

CMD [ "sh", "-c", "service ssh start; bash"] 

Dockerfile ile kopyalanan conf dosyalarının içeriğini github üzerinden indirebilirsiniz.

Üstte oluşturduğumuz Dockerfile ile bir hadoop image'ı oluşturun. 

 $ docker build -t base-hadoop:1.0 .

Burada oluşturduğumuz içinde hadoop kurulu olan  image dan hem master hemde slave nodelar çalıştırmak için birer container oluşturacağız. Yani yazının en başında da belirttiğim gibi  bütün container lar tek bir image dan oluşacak.

ilk olarak base-hadoop image'ındadan master container oluşturun  

$ docker run -itd  --network="hadoopNetwork"  --ip 172.25.0.100  -p 50070:50070  -p 8088:8088 --name master --hostname master  base-hadoop:1.0 


ikinci olarak ta bir for-loop ile istenilen sayı kadar slave container oluşturun. Aşağıda ( c=1; c<=3; c++ ) ifadesiyle 3 tane slave container oluşturulacak. 

for (( c=1; c<=3; c++ ))
do
    tmpName="slave$c"
    docker run -itd  --network="hadoopNetwork"  --ip "172.25.0.10$c" --name $tmpName --hostname $tmpName  base-hadoop:1.0
done 

Döngü ile oluşturulan container ların IP adresi , adı ve hostname'i
172.25.0.101 : slave1
172.25.0.102 : slave2
172.25.0.103 : slave3
şeklinde olacaktır.

172.25.0.100  adresi ise master container'ın IP adresi olacaktır.

Master container da hadoop'u ayağa kaldırmak için aşağıdaki komutları çalıştırın  

 $ docker exec -ti master bash
$ hadoop namenode -format && /usr/local/hadoop/sbin/start-dfs.sh && /usr/local/hadoop/sbin/start-yarn.sh


son olarak aşağıdaki adresleri ziyaret ederk kurulum kontrolü yapabilirsiniz.
http://localhost:50070/dfshealth.html#tab-datanode
http://localhost:8088/cluster/nodes


Üsteki yapılan işlemleri bir script içinde toplayarak git hesabımdan paylaştım. Bu adımların uygulanmasını incelemek için github üzerindeki ilgili  repo'yu ziyaret edebilirsiniz.  Repoyu lokal bilgisayarınıza indirerek te yine üstteki adımların uygulanmış halini otomotik olarak çalıştırabilirsiniz.

 Üsteki adımları daha hızlı uygulamak için github tan belirttiğim repo'yu indirin. 

 $ git clone https://github.com/lvntyldz/docker-multinode-hadoop.git &&  cd docker-multinode-hadoop

run.sh scripti otomotik olarak 1 adet master container oluşturacak şekilde hazırlanmıştır. Ancak slave container sayısı kullanıcıdan beklenmektedir.  Oluşturmak istediğiniz slave container sayısını parametere olarak run.sh scriptine vererek kurulumu tamamlayın  

 $ ./run.sh <SLAVE_CONTAINER_COUNT>

ÖRN: 2 slave container için  

 $ ./run.sh 2


Hiç yorum yok:

Yorum Gönder