1、拉取centos8的镜像
在用户目录下:
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
#换源
[root@hadoop-master /]# yum -y install wget
[root@hadoop-master /]# yum makecache
#安装openssh
[root@hadoop-master /]# yum -y install openssh openssh-server openssh-clients
[root@hadoop-master /]# systemctl start sshd
####ssh自动接受新的公钥
####master设置ssh登录自动添加kown_hosts
[root@hadoop-master /]# vi /etc/ssh/ssh_config
将原来的StrictHostKeyChecking ask
设置StrictHostKeyChecking为no
保存
[root@hadoop-master /]# systemctl restart sshd
接着分别对slaves安装openssh
[root@hadoop01 /]# yum -y install wget
[root@hadoop01 /]# yum makecache
#安装openssh
[root@hadoop01 /]#yum -y install openssh openssh-server openssh-clients
[root@hadoop01 /]# 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
#一路回车
[root@cluster-master /]# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
文件生成之后用scp将公钥文件分发到集群slave主机
[root@cluster-master /]# ssh root@cluster-slave1 'mkdir ~/.ssh'
[root@cluster-master /]# scp ~/.ssh/authorized_keys root@cluster-slave1:~/.ssh
[root@cluster-master /]# ssh root@cluster-slave2 'mkdir ~/.ssh'
[root@cluster-master /]# scp ~/.ssh/authorized_keys root@cluster-slave2:~/.ssh
[root@cluster-master /]# ssh root@cluster-slave3 'mkdir ~/.ssh'
[root@cluster-master /]# scp ~/.ssh/authorized_keys root@cluster-slave3:~/.ssh
分发完成之后测试(ssh root@cluster-slave1)是否已经可以免输入密码登录。另外本次实验使用到了root用户,如果在其他用户下使用免密码登录,需要确保用户对~/.ssh/authorized_keys文件有可操作权限。
Ansible安装(负责对从节点进行同步文件操作)
[root@cluster-master /]# yum -y install epel-release
[root@cluster-master /]# 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文件已经被改为需要的内容
[root@cluster-master 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
[root@cluster-master 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,只要你能驾驭的了
[root@cluster-master opt]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
下载完成之后解压安装包,并创建链接文件
[root@cluster-master opt]# tar -xzvf hadoop-2.7.4.tar.gz
[root@cluster-master 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主机
[root@cluster-master 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
并执行
[root@hadoop-master 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下有几个启动和停止的脚本如下:
启动hdfs start-dfs.sh 在任意节点
启动yarn start-yarn.sh 在yarn节点
在master节点执行jsp 只能看到