docker中部署hadoop集羣案例

Docker 是一個開源的應用容器引擎,讓開發者可以快速打包應用以及依賴到一個可移植的容器中,然後發佈到任何流行的Linux機器上,使用docker去安裝hadoop集羣,可以快速的線性擴展機器,可以快速的實現部署。

本文使用docker快速的搭建僞分佈式的Hadoop集羣用於代碼的開發和測試,生產環境的部署需要使用更多的工具或者其它技術實現快速的部署和docker的管理。

第一步:docker的安裝和基礎鏡像的製作

1.1docker的安裝
docker的安裝和部分基礎的操作可以參照,博文https://blog.csdn.net/weixin_40122615/article/details/102746393中的方法進行操作。
docker的命令也可以到菜鳥教程的Docker教程地址去查看:
https://www.runoob.com/docker/docker-tutorial.html
1.2docker基礎鏡像的製作
docker鏡像製作的方式有多種,本文以Dockerfile卷的方式製作基礎的鏡像,也可使用其它的方式。
ssh版本的基礎鏡像

# 新建Dockerfile文件
vi Dockerfile

Dockerfile文件內容:

# 製作的鏡像和版本號
FROM centos:centos6.6
# 作者
MAINTAINER yxb
# 安裝ssh server client
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
# root賬戶密碼
RUN echo "root:hadoop" | 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"]

創建ssh版的新的鏡像 版本centosssh:0.1.0

# 創建鏡像 鏡像版本 Dockerfile文件位置 
docker build -t centosssh:0.1.0 .

注意:電腦要連接網絡,安裝過程會聯網下載部分軟件。
hadoopbase版本的基礎鏡像
Hadoop是Java語言編寫的分佈式文件系統,所以依賴Java的環境,因此要安裝Java。

# 新建Dockerfile文件
vi Dockerfile

Dockerfile文件內容:

# 製作的鏡像和版本號
FROM centosssh:0.1.0
# 作者
MAINTAINER yxb

ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-2.7.5.tar.gz /usr/local
ENV HADOOP_HOME /usr/local/hadoop-2.7.5
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

注意:必須將hadoop和Java的安裝包與Dockerfile文件放在同一目錄下
注意:build 命令最後是Dockerfile文件所在位置,下面的命令是有當前目錄 “.”
創建安裝hadoop和java版本的鏡像,版本號:hadoopbase:0.1.0

# 創建鏡像 鏡像版本 Dockerfile文件位置 當前文件
docker build -t hadoopbase:0.1.0 .

第二步:Hadoop集羣的安裝配置文件

本文搭建僞分佈式的三臺機器的hadoop集羣,用於開發和測試,即一主兩從,節點的佈置參數如下圖:
在這裏插入圖片描述
2.1宿主機中創建自定義的docker網絡
創建自定義的網絡,配置固定的ip地址

# 查看已有的網絡
docker network ls
# 創建自定義名稱爲docker的網絡(網段可以自定義設置)
sudo docker network create --driver=bridge --subnet=192.168.100.1/24 docker
# 查看網絡詳情
sudo docker network inspect docker

2.2hadoop集羣
以hadoopbase鏡像爲基礎,在宿主機中運行容器:

# 運行docker,三臺機器的hadoop
sudo docker run -itd --name master --hostname master -P -p 50070:50070 -p 8088:8088 -p 19888:19888 --net docker --ip 192.168.100.10 hadoopbase:0.1.0 /bin/bash

sudo docker run -itd --name slave01 --hostname slave01 -P --net docker --ip 192.168.100.20 hadoopbase:0.1.0 /bin/bash

sudo docker run -itd --name slave02 --hostname slave02 -P --net docker --ip 192.168.100.30 hadoopbase:0.1.0 /bin/bash
# 參數釋義:
# -i: 交互式操作
# -t: 終端
# --name 容器的命名
# --hostname 主機名
# --ip 設置固定的ip地址
# --net 設置網絡
# -p 指定固定的宿主機和容器的端口映射
# -P 隨機的將容器內部使用的網絡端口映射到宿主機
# -d 後臺運行
# /bin/bash  交互式shell
# hadoopbase:0.1.0 鏡像名稱和版本號

設置與宿主機的時間同步

# 宿主機中拷貝宿主機的本機時間localtime到容器
sudo docker cp /etc/localtime master:/etc/
sudo docker cp /etc/localtime slave01:/etc/
sudo docker cp /etc/localtime slave02:/etc/

進入容器的交互式界面

# 進入交互式的容器中 命令爲
sudo docker exec -it master /bin/bash
sudo docker exec -it slave01 /bin/bash
sudo docker exec -it slave02 /bin/bash

修改三臺機器的主機名和ip的映射關係:

# 打開文件
vi /etc/hosts
# 添加內容
# ip和hostname
192.168.100.10 master
192.168.100.20 slave01
192.168.100.30 slave02

配置三臺機器之間的免密登錄:
三臺機器都要執行的命令

# 啓動sshd服務
service sshd start
# sshd 狀態查看
service sshd status
# 若沒有~/.ssh/目錄,先執行一次ssh localhost
# 查看目錄
cd ~/.ssh/ 
# 生成祕鑰          
ssh-keygen -t rsa
# 複製公鑰
ssh-copy-id master
ssh-copy-id slave01
ssh-copy-id slave02

每臺機器ssh配置的測試,測試能否免密登陸其他的機器:

# 測試本機
ssh localhost
ssh master
ssh slave01
ssh slave02

在master主機中配置hadoop的配置文件參數步驟如下:

# 進入hadoop的配置文件的安裝目錄
cd /usr/local/hadoop-2.7.5/etc/hadoop

對以下的配置文件進行修改:
core-site.xml

<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://master</value>
	</property>
	<property>
	    <!--  臨時文件目錄 -->
		<name>hadoop.tmp.dir</name>
		<value>/usr/local/hadoop-2.7.5/hadoopDatas/tempDatas</value>
	</property>
	<!--  緩衝區大小,實際工作中根據服務器性能動態調整 -->
	<property>
		<name>io.file.buffer.size</name>
		<value>2048</value>
	</property>
	<!--  開啓hdfs的垃圾桶機制,刪除掉的數據可以從垃圾桶中回收,單位分鐘 -->
	<property>
		<name>fs.trash.interval</name>
		<value>10080</value>
	</property>
	<property>
		<name>hadoop.native.lib</name>
		<value>true</value>
	</property>
</configuration>

hdfs-site.xml

<configuration>
	<property>
	 	<name>dfs.namenode.secondary.http-address</name>
	 	<value>master:50090</value>
	</property>
	<property>
		<name>dfs.namenode.http-address</name>
		<value>master:50070</value>
	</property>
	<property>		
	    <!--  定義nameNode數據存儲的節點位置	-->				
		<name>dfs.namenode.name.dir</name>
		<value>file:///usr/local/hadoop-2.7.5/hadoopDatas/namenodeDatas,file:///usr/local/hadoop-2.7.5/hadoopDatas/namenodeDatas2</value>
	</property>
	<!--  定義dataNode數據存儲的節點位置,實際工作中,一般先確定磁盤的掛載目錄,然後多個目錄用,進行分割  -->
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:///usr/local/hadoop-2.7.5/hadoopDatas/datanodeDatas,file:///usr/local/hadoop-2.7.5/hadoopDatas/datanodeDatas2</value>
	</property>			
	<property>
		<name>dfs.namenode.edits.dir</name>
		<value>file:///usr/local/hadoop-2.7.5/hadoopDatas/nn/edits</value>
	</property>
	<property>
		<name>dfs.namenode.checkpoint.dir</name>
		<value>file:///usr/local/hadoop-2.7.5/hadoopDatas/snn/name</value>
	</property>
	<property>
		<name>dfs.namenode.checkpoint.edits.dir</name>
		<value>file:///usr/local/hadoop-2.7.5/hadoopDatas/dfs/snn/edits</value>
	</property>
	<property>
	    <!-- 數據保存的副本數量 -->
		<name>dfs.replication</name>
		<value>1</value>
	</property>
	<property>
		<name>dfs.permissions</name>
		<value>false</value>
	</property>
	<property>
		<!-- 數據塊的大小128M -->
		<name>dfs.blocksize</name>
		<value>134217728</value>
	</property>
</configuration>

yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>master</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>									
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
</configuration>

mapred-site.xml

<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	<property>
		<name>mapreduce.job.ubertask.enable</name>
		<value>true</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>
</configuration>

yarn-env.sh
hadoop-env.sh
mapred-env.sh
以上三個配置文件中加入java的路徑

# java
export JAVA_HOME=/usr/local/jdk1.8.0_221

slaves

# datanode數據存儲節點
master
slave01
slave02

創建配置文件中對應的文件目錄:

# 創建文件夾
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/tempDatas
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/namenodeDatas
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/namenodeDatas2
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/datanodeDatas
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/datanodeDatas2
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/nn/edits
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/snn/name
mkdir -p /usr/local/hadoop-2.7.5/hadoopDatas/dfs/snn/edits

添加hadoop和java環境變量到配置文件

# 打開配置文件
vi /etc/profile
# 添加Java和Hadoop的安裝路徑
export JAVA_HOME=/usr/local/jdk1.8.0_221
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop-2.7.5
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
# 更新配置文件
source /etc/profile

將master主機的hadoop安裝目錄發送到從機:
hadoop文件包發送到從機後,在從機配置java和haoop的環境變量,和上面的環境變量一致

# 發送Hadoop安裝包到從節點
scp -r hadoop-2.7.5/ slave01:/usr/local/
scp -r hadoop-2.7.5/ slave02:/usr/local/

master主機爲namenode節點,因此在master主機初始化NameNode的元數據目錄,格式化文件系統

# 進入到hadoop的bin目錄下,執行命令
hdfs namenode -format

測試hadoop集羣是否安裝成功:

# 進入sbin目錄 開啓
./start-all.sh
#jps查看是否存在相應的進程
jps
# 停止集羣
./stop-all.sh

使用hadoop的命令上傳文件:

# 查看文件
hadoop fs -ls /
# 上傳本地的文件
hadoop fs -put test.txt /

通過瀏覽器的可視化界面查看HDFS的運行情況,,端口號爲:50070(宿主機ip:50070),也可通過8088端口查看hadoop集羣的狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章