Docker+Hadoop構(gòu)建偽集群

目的:
利用docker容器構(gòu)建3臺虛擬主機,一臺為管理節(jié)點兩臺為數(shù)據(jù)節(jié)點以此來構(gòu)建hadoop偽集群,三臺虛擬主機之間使用SSH進行連接

因此整體思路為安裝Centos鏡像,為鏡像安裝SSH,Hadoop,Java,根據(jù)鏡像創(chuàng)建三個容器,這樣每個容器其實就相當(dāng)于一臺運行著Centos的主機,選擇一個為管理節(jié)點配置Hadoop

文章很長,請耐心閱讀

操作系統(tǒng)Centos7,安裝時最好選擇安裝GNOME桌面

下載Docker CE[1]
刪除舊版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

配置Docker倉庫

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安裝Docker CE

$ sudo yum install docker-ce

啟動Docker CE

$ sudo systemctl enable docker
$ sudo systemctl start docker

為Docker創(chuàng)建新的工作組

$ sudo usermod -aG docker $USER

切換至root用戶

$ ru test

測試Docker是否正常工作

$ docker run hello-world
Hello World
$ docker images
docker images

拉取Centos鏡像

$ docker pull centos
$ docker images

拉取的鏡像


centos

為拉取的鏡像安裝SSH

$ mkdir DockerFile
$ cd DockerFile
$ mkdir CentOS7_SSH
$ cd CentOS7_SSH
$ vi Dockerfile

Dockerfile

FROM centos

MAINTAINER codingstory
#安裝SSH
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

#添加用戶名為hadoop用戶密碼為hadoop的用戶
RUN useradd hadoop
RUN echo "hadoop:hadoop" | chpasswd

#提升hadoop用戶的權(quán)限
RUN echo "hadoop   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

#開啟SSH服務(wù)端口為22
RUN mkdir /var/run/sshd

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

安裝

$ docker build -t centos7_ssh .

安裝過程中會出現(xiàn)紅色警報可以不用管


centos7_ssh

有了centos7_hadoop鏡像

構(gòu)建網(wǎng)絡(luò)環(huán)境

$ docker network create -d bridge hadoop-network
$ docker network ls
network

測試SSH功能
建立一個容器(此時的容器已經(jīng)有操作系統(tǒng)和網(wǎng)路了相當(dāng)于一臺虛擬主機了)

$ docker run --network=hadoop-network -itd --name=hadoop_ssh
centos7_ssh
$ docker network inspect hadoop-network
容器已經(jīng)有IP地址了

測試SSH連接

$ ssh 172.18.0.2 -l hadoop

ssh連接

解釋一下命令的含義172.18.0.2代表了我們剛剛創(chuàng)建的容器(虛擬主機)的IP地址,hadoop代表了我們要連接到容器(虛擬主機)中名為hadoop的用戶

SSH連接測試成功后,要為鏡像安裝Hadoop和Java
進入到DockerFile文件夾中建立一個新的文件夾

$ mkdir CentOS7_Hadoop
$ cd CentOS7_Hadoop
$ vi Dockerfile

Dockerfile

FROM centos7_ssh
#解壓下載的java文件
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
# 更改文件夾名字
RUN mv /usr/local/jdk1.8.0_191 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
# 解壓下載的Hadoop文件
ADD hadoop-2.8.5.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.8.5 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

進入Hadoop官網(wǎng)下載hadoop-2.8.5.tar.gz的二進制文件
進入Java官網(wǎng)下載Linux x64 jdk-8u191-linux-x64.tar.gz

把下載的文件放入DockerFile/CentOS7_Hadoop目錄下

安裝Hadoop、Java

執(zhí)行Dockerfile

$ docker build -t centos7_hadoop .
安裝Hadoop、Java
$ docker images
有了centos_hadoop鏡像

現(xiàn)在我們的鏡像已經(jīng)安裝了SSH、Hadoop、Java
再根據(jù)鏡像創(chuàng)建三個容器

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

對于hadoop0來說,我們希望它能作為管理員,因此把它的端口500708088映射到我們自己的主機中

三個容器

打開三個命令行分別進入三個容器

$ docker exec -it hadoop0 /bin/bash
$ docker exec -it hadoop1 /bin/bash
$ docker exec -it hadoop2 /bin/bash
可以看到命令行頂部已經(jīng)改變,分別為hadoop0、hadoop1、hadoop2

在三個命令行中全部切換為hadoop用戶

$ su hadoop

都生成用于SSH連接的公鑰和私鑰

$ ssh-keygen

都將自己的公鑰復(fù)制給其它容器

$ ssh-copy-id -i ~/.ssh/id_rsa -p 22 hadoop@hadoop0
$ ssh-copy-id -i ~/.ssh/id_rsa -p 22 hadoop@hadoop1
$ ssh-copy-id -i ~/.ssh/id_rsa -p 22 hadoop@hadoop2 

這樣我們就可以不需要密碼就可以訪問其它容器,假設(shè)我們現(xiàn)在處于hadoop0容器
我們可以使用

$ ssh -p '22' 'hadoop@hadoop2'

訪問hadoop2容器
訪問之前


訪問之前

訪問之后


訪問之后

下面進行Hadoop的配置
進入hadoop0容器
$ sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml

將下面的代碼configuration部分復(fù)制到core-site.xml文件中的configuration部分

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://hadoop0:9000</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/${user.name}/tmp</value>
        <description>A base for other temporary directories.</description>
    </property>
    <property>
        <name>hadoop.proxyuser.hduser.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hduser.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>
</configuration>
$ sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

將下面的代碼configuration部分復(fù)制到hdfs-site.xml文件中的configuration部分

<configuration>
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:/usr/local/hadoop/hdfs/name</value>
</property>
<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:/usr/local/hadoop/hdfs/data</value>
</property>
<property>
  <name>dfs.replication</name>
  <value>2</value>
</property>
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop0:9001</value>
</property>
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>
</configuration>

切入到hadoop目錄下

 $ cd /usr/local/hadoop/etc/hadoop
 $ sudo cp mapred-site.xml.template mapred-site.xml

將下面的代碼configuration部分復(fù)制到mapred-site.xml文件中的configuration部分

<configuration>
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop0:10020</value>
</property>
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop0:19888</value>
</property>

</configuration>
$ sudo vi yarn-site.xml

將下面的代碼configuration部分復(fù)制到y(tǒng)arn-site.xml文件中的configuration部分

<configuration>

<!-- Site specific YARN configuration properties -->
 <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>hadoop0:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>hadoop0:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>hadoop0:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>hadoop0:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hadoop0:8088</value>
    </property>

</configuration>
$ sudo vi slaves

刪除原來的內(nèi)容加入

hadoop1
hadoop2

查看JAVA_HOME路徑

$ echo $JAVA_HOME
$ sudo vi hadoop-env.sh

找到

export JAVA_HOME=${JAVA_HOME}

將其更改為JAVA_HOME路徑,例如

export JAVA_HOME=/usr/local/jdk1.8

現(xiàn)在將修改過后的hadoop文件發(fā)送給hadoop1和hadoop2容器[2]

$ sudo scp -r /usr/local/hadoop hadoop@hadoop1:/tmp
$ sudo scp -r /usr/local/hadoop hadoop@hadoop1:/tmp

進入hadoop1和hadoop2刪除原來的hadoop文件

$ rm -rf /usr/local/hadoop

/tmp文件夾將hadoop復(fù)制到/usr/local/hadoop里面

$ sudo cp -rf /tmp/hadoop /usr/local/hadoop

三個容器中都要增加Hadoop環(huán)境變量

$ sudo vi ~/.bashrc

增加環(huán)境變量

export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

執(zhí)行以下命令,使剛添加的環(huán)境變量有效

$ source ~/.bashrc

這樣配置就完成了

下面開始啟動Hadoop
進入hadoop0容器

$ hdfs namenode -format -force

會出現(xiàn)下面這樣的結(jié)果

啟動

三個容器中都要提升hadoop對hadoop文件夾權(quán)限[3]:

$ sudo chown -R hadoop /usr/local/hadoop/

之后在hadoop0容器中運行

$ start-dfs.sh
運行成功示例
$ start-yarn.sh
運行成功示例
$ mr-jobhistory-daemon.sh start historyserver
狀態(tài)成功示例

檢查啟動狀態(tài)

$ hadoop dfsadmin -report

狀態(tài)成功示例

打開http://localhost:50070http://localhost:8088查看是否正確
http://localhost:50070

http://localhost:8088

創(chuàng)建一個文件試試

$ hdfs dfs -mkdir -p /home/hadoop/input
文件創(chuàng)建成功

至此就完成了Docker+Hadoop構(gòu)建的偽集群


  1. Docker在Centos上安裝--官方文檔 ?

  2. ssh使用scp: /目錄: Permission denied ?

  3. “Permission denied” errors whe starting a single node cluster in Hadoop ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容