作者在服务器中成功手动搭建了 hadoop 集群,服务器系统是 centos 7.9,内核是 3.10.0-1127.el7.x86_64 。在搭建期间查了很多博客,但是很多博客中存在着问题,前前后后花了我大概一天多的时间,查资料,debug可以成功的运行了。在这里,我将我的安装总结一下,供需要的人进行参考。
参考文章:Docker中Hadoop集群搭建
一、安装docker# 安装需要的软件包 yum install -y yum-utils # 设置阿里云镜像 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新yum安装包索引 yum makecache fast # 安装Docker引擎 yum -y install docker-ce docker-ce-cli containerd.io # 启动Docker systemctl start docker # 运行docker(查看是否安装成功) docker version docker run hello-world二、拉取 centos 镜像
我安装的是 centos7。centos8 已经不提供后续支持。
docker pull daocloud.io/library/centos:7三、配置固定 ip 的容器
创建的网络结构如下:
| hostname | ip |
|---|---|
| cluster-master | 172.18.0.2 |
| cluster-slave1 | 172.18.0.3 |
| cluster-slave2 | 172.18.0.4 |
| cluster-slave3 | 172.18.0.5 |
docker network create --subnet=172.18.0.0/16 netgroup2、创建固定 ip 的容器
-p 指定了端口号
# cluster-master docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-master -h cluster-master -p 18088:18088 -p 9870:9870 --net netgroup --ip 172.18.0.2 daocloud.io/library/centos:7 /usr/sbin/init #cluster-slaves docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-slave1 -h cluster-slave1 --net netgroup --ip 172.18.0.3 daocloud.io/library/centos:7 /usr/sbin/init docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-slave2 -h cluster-slave2 --net netgroup --ip 172.18.0.4 daocloud.io/library/centos:7 /usr/sbin/init docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-slave3 -h cluster-slave3 --net netgroup --ip 172.18.0.5 daocloud.io/library/centos:7 /usr/sbin/init四、配置容器主机的 openSSH
进入到不同主机的方法,退出时使用快捷键 ctrl+p+q,不要用 exit,否则会关闭容器。
docker exec -it 主机名 /bin/bash1、yum 换源
在安装 ssh 过程中,如果没速度,可以先对要安装的主机 yum 进行换源。
yum -y install wget mv /etc/yum.repos.d/CentOS-base.repo /etc/yum.repos.d/CentOS-base.repo.backup wget -O /etc/yum.repos.d/CentOS-base.repo http://mirrors.163.com/.help/CentOS7-base-163.repo yum makecache2、配置 cluster-master 的 ssh,设置免密登录
首先,配置 cluster-master,并进行免密登录配置。
# 安装 OpenSSH docker exec -it cluster-master /bin/bash yum -y install openssh openssh-server openssh-clients systemctl start sshd # master 设置 ssh 登录自动添加 kown_hosts,配制免密登录 vi /etc/ssh/ssh_config # 注意:将原来的 StrictHostKeyChecking 的 ask 改为 no! systemctl restart sshd3、配置 cluster-slaves 的ssh
然后,配置 slave 的 ssh
docker exec -it cluster-slave1 /bin/bash yum -y install openssh openssh-server openssh-clients systemctl start sshd
这里需要注意的是,后续会使用 scp命令,需要输入从节点的密码。这里,我用了比较简单的方法,在配置从结点的时候,顺便为其添加统一的简单密码:
passwd root五、cluster-master 公钥分发
进入主节点中,分发公钥
docker exec -it cluster-master /bin/bash # 生成公钥 ssh-keygen -t rsa # 将生成的公钥id_rsa.pub,重定向到文件authorized_keys cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys # 修改权限 chmod 600 ~/.ssh/authorized_keys # 用scp将公钥文件分发到所有的slaves主机上(重复下面操作) ssh root@cluster-slave1 'mkdir ~/.ssh' scp ~/.ssh/authorized_keys root@cluster-slave1:~/.ssh六、Ansible 的安装和使用 1、安装 Ansible
进入到主节点中,安装 Ansible
docker exec -it cluster-master /bin/bash yum -y install epel-release yum -y install 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-slave32、配置Docker容器host
/etc/hosts 文件中的内容在容器启动时被重写,所以需要在容器重启后自动获取集群的hosts,修改本地服务器的.bashrc文件
vi ~/.bashrc
添加信息
:>/etc/hosts cat >>/etc/hosts<重启.bashrc
source ~/.bashrc3、用 Ansible 分发 .bashrc 至集群slave下ansible cluster -m copy -a "src=~/.bashrc dest=~/"七、配置 hadooop 运行环境 1、集群中搭建 jdkansible cluster -m yum -a "name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=latest"2、安装 hadooop这里安装的是清华镜像里的hadoop-3.3.0,可以根据自己的需要去择清华镜像选择安装。这里我也选择将其安装到 /opt 目录下
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz tar -xzvf hadoop-3.3.0.tar.gz ln -s hadoop-3.3.0 hadoop3、配置环境变量修改 .bashrc。
vi ~/.bashrc添加内容如下,注意根据自己的实际安装情况来,不要照搬:
# hadoop,选择自己的hadoop安装目录 export HADOOP_HOME=/opt/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH #java,选择自己的jdk安装目录 export JAVA_HOME=/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64 export PATH=$HADOOP_HOME/bin:$PATH重启
source ~/.bashrc八、配置 hadoop 的运行配置文件这里的修改,照搬就行。
cd $HADOOP_HOME/etc/hadoop/1、修改 core-site.xml 文件2、修改 hdfs-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 3、修改 mapred-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 4、修改 yarn-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 5、向slave分发 hadoopyarn.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,返回 hadoop 安装目录 /opt,打包文件。
tar -cvf hadoop-dis.tar hadoop hadoop-3.3.0创建为 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使用 ansible-playbook 分发 .bashrc 和 hadoop-dis.tar 至 slave 主机。
ansible-playbook hadoop-dis.yaml九、Hadoop 启动和常见的问题在启动集群时,我遇到了下面两个问题,先把问题和解决问题的方法列在下面,供读者参考。
问题1:Attempting to operate on hdfs namenode as root这是由于用 root 用户来操作集群产生的问题,需要在 $HADOOP_HOME/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:ERROR: Cannot set priority of datanode process这是由于在修改hadoop运行配置文件时,
启动 hadoop 集群设置错误导致的。这个根据错误信息定位产生错误的文件,小心粘贴。 在解决了上述问题后,就可以启动集群了
cd $HADOOP_HOME/sbin # 格式化namenode hadoop namenode -format # 启动集群 ./start-all.sh用 jps 可以看到运行进程信息,也可以远程进行访问。
http://ip地址:端口号/ # ip是你的主机(服务器)的ip,端口号设置的是18088



