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<<EOF
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
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop-master:9000</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>4320</value>
</property>
</configuration>
hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop01:50090</value>
<description>secondarynamenode运行节点的信息 和namenode不同节点</description>
</property>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
打包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 只能看到