Docker中Hadoop集群搭建
环境网络设置安装docker安装OpenSSH免密登录Ansible安装软件环境配置配置hadoop运行所需配置文件Hadoop 启动问题
Docker中Hadoop集群搭建 环境1、操作系统: CentOS 7 64位
网络设置| hostname | IP |
|---|---|
| cluster-master | 172.20.0.2 |
| cluster-slave1 | 172.20.0.3 |
| cluster-slave2 | 172.20.0.4 |
| cluster-slave3 | 172.20.0.5 |
安装后拉去Centos镜像
$ docker pull daocloud.io/library/centos:7
按照集群的架构,创建容器时需要设置固定IP,所以先要在docker使用如下命令创建固定IP的子网
$ docker network create --subnet=172.20.0.0/16 netgroup
docker的子网创建完成之后就可以创建固定IP的容器了
#cluster-master #-p 设置docker映射到容器的端口 后续查看web管理页面使用 docker run -d --privileged -ti --name cluster-master -h cluster-master -p 18088:18088 -p 9870:9870 --net netgroup --ip 172.20.0.2 daocloud.io/library/centos:7 /usr/sbin/init #cluster-slaves docker run -d --privileged -ti --name cluster-slave1 -h cluster-slave1 --net netgroup --ip 172.20.0.3 daocloud.io/library/centos:7 /usr/sbin/init docker run -d --privileged -ti --name cluster-slave2 -h cluster-slave2 --net netgroup --ip 172.20.0.4 daocloud.io/library/centos:7 /usr/sbin/init docker run -d --privileged -ti --name cluster-slave3 -h cluster-slave3 --net netgroup --ip 172.20.0.5 daocloud.io/library/centos:7 /usr/sbin/init
启动控制台并进入docker容器中:
docker exec -it cluster-master /bin/bash安装OpenSSH免密登录
1、cluster-master安装:
#cluster-master需要修改配置文件(特殊) #cluster-master #安装openssh $ yum -y install openssh openssh-server openssh-clients $ systemctl start sshd ####ssh自动接受新的公钥 ####master设置ssh登录自动添加kown_hosts $ vi /etc/ssh/ssh_config #将原来的StrictHostKeyChecking ask #设置StrictHostKeyChecking为no #保存 $ systemctl restart sshd
2、分别对slaves安装OpenSSH
#安装openssh $ yum -y install openssh openssh-server openssh-clients $ systemctl start sshd
3、cluster-master公钥分发
在master机上执行ssh-keygen -t rsa并一路回车,完成之后会生成~/.ssh目录,目录下有id_rsa(私钥文件)和id_rsa.pub(公钥文件),再将id_rsa.pub重定向到文件authorized_keys
$ ssh-keygen -t rsa #一路回车 $ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
需要先设置slave服务器密码
$ passwd root
文件生成之后用scp将公钥文件分发到集群slave主机
$ ssh root@cluster-slave1 'mkdir ~/.ssh' $ scp ~/.ssh/authorized_keys root@cluster-slave1:~/.ssh $ ssh root@cluster-slave2 'mkdir ~/.ssh' $ scp ~/.ssh/authorized_keys root@cluster-slave2:~/.ssh $ ssh root@cluster-slave3 'mkdir ~/.ssh' $ scp ~/.ssh/authorized_keys root@cluster-slave3:~/.ssh
分发完成之后测试是否已经可以免输入密码登录
[root@cluster-master /]# ssh root@cluster-slave1 [root@cluster-slave1 ~]# exit logoutAnsible安装
[root@cluster-master /]# yum -y install epel-release [root@cluster-master /]# yum -y install ansible #这样的话ansible会被安装到/etc/ansible目录下
此时我们再去编辑ansible的hosts文件
$ vi /etc/ansible/hosts [cluster] cluster-master cluster-slave1 cluster-slave2 cluster-slave3 [master] cluster-master [slaves] cluster-slave1 cluster-slave2 cluster-slave3
配置docker容器hosts
由于/etc/hosts文件在容器启动时被重写,直接修改内容在容器重启后不能保留,为了让容器在重启之后获取集群hosts,使用了一种启动容器后重写hosts的方法。
需要在~/.bashrc中追加以下指令
$ vi ~/.bashrc :>/etc/hosts cat >>/etc/hosts<使配置文件生效,可以看到/etc/hosts文件已经被改为需要的内容
[root@cluster-master ansible]# cat /etc/hosts 127.0.0.1 localhost 172.20.0.2 cluster-master 172.20.0.3 cluster-slave1 172.20.0.4 cluster-slave2 172.20.0.5 cluster-slave3用ansible分发.bashrc至集群slave下
ansible cluster -m copy -a "src=~/.bashrc dest=~/"软件环境配置下载JDK1.8并解压缩至/opt 目录下
$ docker cp jdk-8u211-linux-x64.tar.gz cluster-master:/opt/ $ tar -zxvf jdk-8u211-linux-x64.tar.gz下载hadoop3 到/opt目录下,解压安装包,并创建链接文件
$ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.2/hadoop-3.3.2.tar.gz --no-check-certificate $ tar -xzvf hadoop-3.3.2.tar.gz $ ln -s hadoop-3.3.2 hadoop配置java和hadoop环境变量
编辑 ~/.bashrc文件
# hadoop export HADOOP_HOME=/opt/hadoop-3.3.2 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH #java export JAVA_HOME=/opt/jdk8 export PATH=$JAVA_HOME/bin:$PATH使文件生效:
$ source ~/.bashrc配置hadoop运行所需配置文件cd $HADOOP_HOME/etc/hadoop/1、修改core-site.xml
hadoop.tmp.dir /home/hadoop/tmp A base for other temporary directories. fs.default.name hdfs://cluster-master:9000 fs.trash.interval 4320 2、修改hdfs-site.xml
dfs.namenode.name.dir /home/hadoop/tmp/dfs/name dfs.datanode.data.dir /home/hadoop/data dfs.replication 3 dfs.webhdfs.enabled true dfs.permissions.superusergroup staff dfs.permissions.enabled false 3、修改mapred-site.xml
mapreduce.framework.name yarn mapred.job.tracker cluster-master:9001 mapreduce.jobtracker.http.address cluster-master:50030 mapreduce.jobhisotry.address cluster-master:10020 mapreduce.jobhistory.webapp.address cluster-master:19888 mapreduce.jobhistory.done-dir /jobhistory/done mapreduce.intermediate-done-dir /jobhisotry/done_intermediate mapreduce.job.ubertask.enable true 4、yarn-site.xml
yarn.resourcemanager.hostname cluster-master yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler yarn.resourcemanager.address cluster-master:18040 yarn.resourcemanager.scheduler.address cluster-master:18030 yarn.resourcemanager.resource-tracker.address cluster-master:18025 yarn.resourcemanager.admin.address cluster-master:18141 yarn.resourcemanager.webapp.address cluster-master:18088 yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 86400 yarn.log-aggregation.retain-check-interval-seconds 86400 yarn.nodemanager.remote-app-log-dir /tmp/logs yarn.nodemanager.remote-app-log-dir-suffix logs 打包hadoop 向slaves分发
$ cd /opt $ tar -cvf hadoop-dis.tar hadoop hadoop-3.3.2使用ansible-playbook分发.bashrc和hadoop-dis.tar至slave主机
--- - 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将以上yaml保存为hadoop-dis.yaml,并执行
ansible-playbook hadoop-dis.yamlhadoop-dis.tar会自动解压到slave主机的/opt目录下
主节点修改环境变量
$ vi /opt/hadoop-3.3.2/etc/hadoop/hadoop-env.sh export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=rootHadoop 启动主节点格式化namenode(第一次运行执行)
$ hdfs --daemon namenode -format如果看到storage format success等字样,即可格式化成功
从节点初始化(第一次运行执行)
$ hdfs --daemon start datanode启动集群
$ start-all.sh启动后可使用jps命令查看是否启动成功
#主节点 9697 NodeManager 8947 NameNode 9076 DataNode 9573 ResourceManager 9318 SecondaryNameNode 10041 Jps #从节点 944 DataNode 1020 Jps验证服务
守护进程 网页界面 笔记 名称节点 http://nn_host:port/ 默认 HTTP 端口为 9870。 资源管理器 http://rm_host:port/ 默认 HTTP 端口为 18088。 MapReduce JobHistory 服务器 http://jhs_host:port/ 默认 HTTP 端口为 19888。 关闭服务
停止集群 $ stop-all.sh问题问题1:ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation
$ vi /opt/hadoop-3.3.2/etc/hadoop/hadoop-env.sh export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root**问题2:**启动hadoop 集群是,发现slave节点的datanode没有启动
查了资料发现是因为我在启动集群前,执行了这个命令:
hadoop namenode -format这个指令会重新格式化namenode的信息,这样可能会导致master节点的VERSION信息跟datanode的信息对不上,导致指令无法同步。
第一步:停止集群: > stop-all.sh 第二步:删除logs文件夹和tmp文件夹 > rm -rf /opt/hadoop-3.3.2/logs > rm -rf /tmp/logs 第三步:查看VERSION文件是否存在,如果存在的话,把它删除: > cd /home/hadoop/tmp/dfs/name/current > cat VERSION 如果有VERSION文件,直接删除: > rm -f VERSION 第四步:所有slave节点删除VERSION文件 > cd /home/hadoop/data/current > cat VERSION > rm -f VERSION



