目的:
利用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
$ docker images
拉取Centos鏡像
$ docker pull centos
$ docker images
拉取的鏡像
為拉取的鏡像安裝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)紅色警報可以不用管
構(gòu)建網(wǎng)絡(luò)環(huán)境
$ docker network create -d bridge hadoop-network
$ docker network ls
測試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
測試SSH連接
$ ssh 172.18.0.2 -l hadoop
解釋一下命令的含義
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目錄下
執(zhí)行Dockerfile
$ docker build -t centos7_hadoop .
$ docker images
現(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來說,我們希望它能作為管理員,因此把它的端口50070和8088映射到我們自己的主機中
打開三個命令行分別進入三個容器
$ docker exec -it hadoop0 /bin/bash
$ docker exec -it hadoop1 /bin/bash
$ docker exec -it hadoop2 /bin/bash
在三個命令行中全部切換為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)
$ hadoop dfsadmin -report
打開http://localhost:50070和http://localhost:8088查看是否正確


創(chuàng)建一個文件試試
$ hdfs dfs -mkdir -p /home/hadoop/input

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