1、拉取centos8的鏡像
在使用者目錄下:

docker拉取centos
2、建構叢集子網
按照叢集的架構,建立容器時需要設定固定IP,是以先要在docker使用如下指令建立固定IP的子網
docker network create --subnet=172.18.0.0/16 netgroup
對各個節點指定好功能 maseter為主節點,hadoop01 為從節點和datanode hadoop02 為yarn主節點負責各個節點的資源排程,
hadoop02,hadoop03為datanode節點
OS
hostname
IP
Centos8
hadoop-master
172.18.0.2
namenode
Centos8
hadoop01
172.18.0.3
secondnamenode datanode
Centos8
hadoop02
172.18.0.4
Yarn resourcemanger datanode
Centos8
hadoop03
172.18.0.5
datanode
3、啟動容器(注意要開放的端口提前在這裡配置好)
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop_master -h hadoop-master --net netgroup --ip 172.18.0.2 -P -p 50070:50070 -p 8088:8088 centos:centos8-hadoop-master /usr/sbin/init
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-01 -h hadoop01 --net netgroup --ip 172.18.0.3 -P centos:centos8-hadoop01 /usr/sbin/init
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-02 -h hadoop02 --net netgroup --ip 172.18.0.4 -P centos:centos8-hadoop02 /usr/sbin/init
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-03 -h hadoop03 --net netgroup --ip 172.18.0.5 -P centos:centos8-hadoop03 /usr/sbin/init
4、在每一容器上部署Openssh
#cluster-master需要修改配置檔案(特殊)
#cluster-master
#換源
[[email protected] /]# yum -y install wget
[[email protected] /]# yum makecache
#安裝openssh
[[email protected] /]# yum -y install openssh openssh-server openssh-clients
[[email protected] /]# systemctl start sshd
####ssh自動接受新的公鑰
####master設定ssh登入自動添加kown_hosts
[[email protected] /]# vi /etc/ssh/ssh_config
将原來的StrictHostKeyChecking ask
設定StrictHostKeyChecking為no
儲存
[[email protected] /]# systemctl restart sshd
接着分别對slaves安裝openssh
[[email protected] /]# yum -y install wget
[[email protected] /]# yum makecache
#安裝openssh
[[email protected] /]#yum -y install openssh openssh-server openssh-clients
[[email protected] /]# systemctl start sshd
分别在hadoop02,hadoop03重複以上步驟,
cluster-master公鑰分發
在master機上執行ssh-keygen -t rsa并一路回車,完成之後會生成~/.ssh目錄,目錄下有id_rsa(私鑰檔案)和id_rsa.pub(公鑰檔案),再将id_rsa.pub重定向到檔案authorized_keys
ssh-keygen -t rsa
#一路回車
[[email protected] /]# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
檔案生成之後用scp将公鑰檔案分發到叢集slave主機
[[email protected] /]# ssh [email protected] 'mkdir ~/.ssh'
[[email protected] /]# scp ~/.ssh/authorized_keys [email protected]:~/.ssh
[[email protected] /]# ssh [email protected] 'mkdir ~/.ssh'
[[email protected] /]# scp ~/.ssh/authorized_keys [email protected]:~/.ssh
[[email protected] /]# ssh [email protected] 'mkdir ~/.ssh'
[[email protected] /]# scp ~/.ssh/authorized_keys [email protected]:~/.ssh
分發完成之後測試(ssh [email protected])是否已經可以免輸入密碼登入。另外本次實驗使用到了root使用者,如果在其他使用者下使用免密碼登入,需要確定使用者對~/.ssh/authorized_keys檔案有可操作權限。
Ansible安裝(負責對從節點進行同步檔案操作)
[[email protected] /]# yum -y install epel-release
[[email protected] /]# yum -y install ansible
#這樣的話ansible會被安裝到/etc/ansible目錄下
此時我們再去編輯ansible的hosts檔案
vi /etc/ansible/hosts
hosts檔案内容如下
[cluster]
hadoop-master
hadoop01
hadoop02
hadoop03
[master]
hadoop-master
[slaves]
hadoop01
hadoop02
hadoop03
進入master節點機器
docker exec -it hadoop_master /bin/bash
配置docker容器hosts
由于/etc/hosts檔案在容器啟動時被重寫,直接修改内容在容器重新開機後不能保留,為了讓容器在重新開機之後擷取叢集hosts,使用了一種啟動容器後重寫hosts的方法。
需要在~/.bashrc中追加以下指令
:>/etc/hosts
cat >>/etc/hosts<
127.0.0.1 localhost
172.18.0.2 cluster-master
172.18.0.3 cluster-slave1
172.18.0.4 cluster-slave2
172.18.0.5 cluster-slave3
EOF
source ~/.bashrc
使配置檔案生效,可以看到/etc/hosts檔案已經被改為需要的内容
[[email protected] ansible]# cat /etc/hosts
127.0.0.1 localhost
172.18.0.2 cluster-master
172.18.0.3 cluster-slave1
172.18.0.4 cluster-slave2
172.18.0.5 cluster-slave3
用ansible分發.bashrc至叢集slave下
ansible cluster -m copy -a "src=~/.bashrc dest=~/"
到這裡好不容易到了搭建Hadoop這個步驟,感覺部落客了解的東西真的是好多啊從docker一直到ansible-playbook,真是不容易啊.
Hadoop
在叢集中安裝openjdk
使用ansible在在叢集中安裝openjdk
[[email protected] ansible]# ansible cluster -m yum -a "name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=latest"
在cluster-master上安裝hadoop
将hadoop安裝包下載下傳至/opt目錄下
這裡采用Hadoop 2.x系列最穩定的stable版本2.7.4 你可以選擇更新成hadoop-3.x beta版本 或者 hadoop 2.8.2,隻要你能駕馭的了
[[email protected] opt]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
下載下傳完成之後解壓安裝包,并建立連結檔案
[[email protected] opt]# tar -xzvf hadoop-2.7.4.tar.gz
[[email protected] opt]# ln -s hadoop-2.7.4 hadoop
設定java和hadoop環境變量(.bashrc)
# hadoop
export HADOOP_HOME=/opt/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
#java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/
export PATH=$JAVA_HOME/bin:$PATH
注意一下,這裡的JAVA_HOME的版本java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/需要以實際情況為準,你可以打開你的/usr/lib/jvm/目錄進行自行确認,此處為實際設定。
修改hadoop運作所需配置檔案
掌握過Hadoop的朋友都知道,Hadoop叢集搭建需要修改幾個必要的配置檔案以及xml參數設定,此處不深究.
進入hadoop的安裝目錄
cd $HADOOP_HOME/etc/hadoop/
首先我們修改**core-site.xml**這個檔案:
vi core-site.xml
hadoop.tmp.dir
/home/hadoop/tmp
A base for other temporary directories.
fs.default.name
hdfs://hadoop-master:9000
fs.trash.interval
4320
hdfs-site.xml
dfs.namenode.name.dir
/home/hadoop/tmp/dfs/name
dfs.datanode.data.dir
/home/hadoop/data
dfs.replication
3
dfs.secondary.http.address
hadoop01:50090
secondarynamenode運作節點的資訊 和namenode不同節點
mapred-site.xml
mapreduce.framework.name
yarn
yarn-site.xml
yarn.resourcemanager.hostname
hadoop02
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
打包hadoop檔案
将hadoop連結檔案和hadoop-2.7.4打包成一個檔案友善ansible分發到slave主機
[[email protected] opt]# tar -cvf hadoop-dis.tar hadoop hadoop-2.7.4
使用ansible-playbook分發.bashrc和hadoop-dis.tar至slave主機
建立 hadoop-dis.yaml,内容如下:
分發檔案
---
- hosts: cluster
tasks:
- name: copy .bashrc to slaves
copy: src=~/.bashrc dest=~/
notify:
- exec source
- name: copy hadoop-dis.tar to slaves
unarchive: src=/opt/hadoop-dis.tar dest=/opt
handlers:
- name: exec source
shell: source ~/.bashrc
并執行
[[email protected] opt]# ansible-playbook hadoop-dis.yaml
hadoop-dis.tar會自動解壓到slave主機的/opt目錄下
格式化hdfs
hadoop namenode -format
此時如果你看到return 0 ;Sucessfully formatted等字樣說明HDFS叢集格式化成功了.如有不成功,可先自行查找錯誤
啟動hadoop叢集
到這一步已經可以開始hadoop之旅了,啟動比較簡單,在$HADOOP_HOME/sbin下有幾個啟動和停止的腳本如下:
hadoop啟動相關指令
啟動hdfs start-dfs.sh 在任意節點
啟動yarn start-yarn.sh 在yarn節點
在master節點執行jsp 隻能看到