前幾天寫了文章“Hadoop 叢集搭建”之後,一個朋友留言說希望介紹下如何使用Docker部署,這個建議很好,Docker不僅在生產環境威力巨大,對於我們在自己電腦中搭建學習實驗環境更是非常便利

搭建一個叢集環境時需要多臺伺服器,對於我們個人,這通常是個門檻,需要使用虛擬機器,安裝作業系統,然後執行起來多個虛機

安裝作業系統是個不太輕鬆的任務,並且執行多個虛機對個人電腦效能也有一定要求,這些門檻影響了很多小夥伴的實踐積極性

使用Docker的話就簡單了,不用安裝作業系統,直接下載一個映象,如centos,這樣作業系統就有了,基於這個系統映象執行多個容器,就相當於起了多個虛機,而且系統性能的消耗要遠小於虛擬機器

假設我們有一個 centos7 映象,啟動多個容器,每個容器都有一個IP,都能通過SSH連線操作,這樣就可以在每個容器中安裝 JAVA Hadoop,從而搭建起叢集環境了

使用Docker搭建Hadoop叢集的過程包括:

  1. 安裝Docker

  2. 獲取centos映象

  3. 安裝SSH

  4. 為容器配置IP

  5. 安裝JAVA和Hadoop

  6. 配置Hadoop

第1步比較簡單,去Docker官網下載安裝就好,第5和第6步與在獨立伺服器中的操作是一樣的,所以這裡就介紹一下2-4步的Docker操作方式

獲取centos7映象

$ docker pull centos

大概是70多M,使用阿里雲等Docker加速器的話很快就能下載完,之後在映象列表中就可以看到

檢視映象列表的命令:

$ docker images

安裝SSH

以centos7映象為基礎,構建一個帶有SSH功能的centos

$ vi Dockerfile

內容:

FROM centos
MAINTAINER dys

RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

RUN echo "root:111111" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

這段內容的大意是:以 centos 映象為基礎,安裝SSH的相關包,設定了root使用者的密碼為 111111,並啟動SSH服務

執行構建映象的命令,新映象命名為 centos7-ssh

$ docker build -t="centos7-ssh" .

執行完成後,可以在映象列表中看到

$ docker images

設定固定IP

需要用到 pipework,他用於給容器設定IP

先下載

$ git clone https://github.com/jpetazzo/pipework.git
$ cp pipework/pipework /usr/local/bin/

安裝bridge-utils

$ yum -y install bridge-utils

建立網路

$ brctl addbr br1
$ ip link set dev br1 up
$ ip addr add 192.168.3.1/24 dev br1

基於 centos7-ssh 這個映象啟動一個容器,名為 centos7.ssh

$ docker run -d --name=centos7.ssh centos7-ssh

設定IP

$ pipework br1 centos7.ssh 192.168.3.20/24

為名為 centos7.ssh 的容器指定了IP 192.168.3.20

分別使用 ping 與 ssh 命令進行驗證,看是否可以ping通和成功登入

$ ping 192.168.3.20
$ ssh 192.168.3.20

ssh成功登入後,就意味著已經準備好了一臺伺服器,再執行2個容器、設定好IP,那麼就相當於有了3臺伺服器

$ docker run -d --name=centos7.ssh2 centos7-ssh
$ docker run -d --name=centos7.ssh3 centos7-ssh

$ pipework br1 centos7.ssh2 192.168.3.22/24
$ pipework br1 centos7.ssh3 192.168.3.23/24

這樣就有了3個可以SSH連線的容器,可以在上面安裝和配置叢集環境了

構建Hadoop映象

上面是運行了3個centos容器,需要在每個容器中單獨安裝Hadoop環境,我們可以像構建SSH映象一樣,構建一個Hadoop映象,然後執行3個Hadoop容器,這樣就更簡單了

$ vi Dockerfile

內容:

FROM centos7-ssh
ADD jdk-8u101-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_101 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-2.7.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

這裡是基於 centos7-ssh 這個映象,把 JAVA 和 Hadoop 的環境都配置好了

前提:在Dockerfile所在目錄下準備好 jdk-8u101-linux-x64.tar.gz 與 hadoop-2.7.3.tar.gz

執行構建命令,新映象命名為 hadoop

$ docker build -t="hadoop" .

執行3個hadoop容器,分別命名為 hadoop0,hadoop1,hadoop2,hadoop0 作為master

$ docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 hadoop
$ docker run --name hadoop1 --hostname hadoop1 -d -P hadoop
$ docker run --name hadoop2 --hostname hadoop2 -d -P hadoop

容器hadoop0啟動時,映射了埠號,50070和8088,是用來在瀏覽器中訪問hadoop WEB介面的

配置IP

$ pipework br1 hadoop0 192.168.3.30/24
$ pipework br1 hadoop1 192.168.3.31/24
$ pipework br1 hadoop2 192.168.3.32/24

配置Hadoop叢集

新開3個終端視窗,分別連線到 hadoop0,hadoop1,hadoop2,便於操作

$ docker exec -it hadoop0 /bin/bash
$ docker exec -it hadoop1 /bin/bash
$ docker exec -it hadoop2 /bin/bash

在各個容器中修改 /etc/hosts,新增:

192.168.3.30    master
192.168.3.31    slave1
192.168.3.32    slave2

接下來就是配置SSH免登入,及hadoop的配置檔案了,方法和之前“Hadoop叢集搭建”中的一樣

這樣就使用Docker實現了Hadoop叢集的搭建