Hadoop 集群环境搭建(Docker)

实验环境

  • 系统环境:CentOS Linux release 7.6.1810 (Core)
  • JDK 版本:jdk1.8.0_291
  • Hadoop 版本:hadoop-3.3.1

实验步骤

1.安装 Docker

安装工具包,缺少这些依赖将无法完成

yum install -y yum-utils

设置远程仓库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker

yum install docker-ce

启动 Docker

systemctl start docker

查看版本

docker version

2.Docker 部署 CentOS

拉取镜像

docker pull centos

查看镜像

docker images

设置docker网桥,用于分配固定 IP

docker network create --subnet=172.15.0.0/16 netgroup

创建容器

  • --name 容器名称
  • -h 容器主机名
  • --net 设置网桥
  • --ip 指定容器IP

    # master
    docker run --privileged -itd -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-master -h cluster-master --net netgroup --ip 172.15.0.2 centos /usr/sbin/init 
    
    # slave1
    docker run --privileged -itd -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-slave1 -h cluster-slave1 --net netgroup --ip 172.15.0.3 centos /usr/sbin/init 
    
    # slave2
    docker run --privileged -itd -v /sys/fs/cgroup:/sys/fs/cgroup --name cluster-slave2 -h cluster-slave2 --net netgroup --ip 172.15.0.4 centos /usr/sbin/init
    

查看运行中的容器

docker ps

3.配置节点 ssh 免密

分别进入进入容器(宿主机操作)

docker exec -it cluster-master bash
docker exec -it cluster-slave1 bash
docker exec -it cluster-slave2 bash

安装 OpenSSH(每个节点均要操作)

yum -y install openssh openssh-server openssh-clients
systemctl start sshd

设置用户密码(每个节点均要操作)

yum install -y passwd
passwd root

生成密钥(每个节点均要操作)

ssh-keygen -t rsa

配置hosts文件(每个节点和宿主机均要操作)

# 安装VIM编辑工具
yum install -y vim
vim /etc/hosts

追加以下内容(每个节点和宿主机均要操作)

172.15.0.2 cluster-master
172.15.0.3 cluster-slave1
172.15.0.4 cluster-slave2

公钥分发(每个节点均要操作)

ssh-copy-id  -f -i ~/.ssh/id_rsa.pub cluster-master
ssh-copy-id  -f -i ~/.ssh/id_rsa.pub cluster-slave1
ssh-copy-id  -f -i ~/.ssh/id_rsa.pub cluster-slave2

测试免密登录(每个节点均要操作)

ssh cluster-master
ssh cluster-slave1
ssh cluster-slave2

4.节点安装 Java 及 Hadoop

创建解压目录(每个节点均要操作)

mkdir /opt/jdk
mkdir /opt/hadoop

发送文件到容器(宿主机操作)

docker cp jdk-8u291-linux-x64.tar.gz cluster-master:/opt/jdk
docker cp jdk-8u291-linux-x64.tar.gz cluster-slave1:/opt/jdk
docker cp jdk-8u291-linux-x64.tar.gz cluster-slave2:/opt/jdk
# hadoop 只需发送到主节点,配置完后再拷贝至从节点
docker cp hadoop-3.3.1.tar.gz cluster-master:/opt/hadoop

解压文件(每个节点均要操作)

tar -zxvf jdk-8u291-linux-x64.tar.gz
tar -zxvf hadoop-3.3.1.tar.gz

配置环境变量(每个节点均要操作)

vim /etc/profile

追加以下内容(每个节点均要操作)

export JAVA_HOME=/opt/jdk/jdk1.8.0_291
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

export HADOOP_HOME=/opt/hadoop/hadoop-3.3.1
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 

使环境变量立即生效(每个节点均要操作)

source /etc/profile

验证 java 安装(每个节点均要操作)

java -version

5. 修改 Hadoop 配置

创建 hadoop 文件目录(每个节点均要操作)

# hadoop 临时文件目录
mkdir -p /home/hadoop/tmp
# hadoop 主节点(namenode)文件目录
mkdir -p /home/hadoop/hdfs/name
# hadoop 数据节点(datanode)文件目录
mkdir -p /home/hadoop/hdfs/data

进入 cluster-master 的 ${HADOOP_HOME}/etc/hadoop 目录下,修改配置文件

  1. hadoop-env.sh(指定JDK的安装位置及启动用户)

    export JAVA_HOME=/opt/jdk/jdk1.8.0_291/
       
    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. core-site.xml(指定 namenode 的 hdfs 协议文件系统的通信地址、存储临时文件的目录)

    <configuration>
       <property>
           <name>fs.defaultFS</name>
           <value>hdfs://cluster-master:9000</value>
       </property>
       <property>
           <name>hadoop.tmp.dir</name>
           <value>/home/hadoop/tmp</value>
       </property>
    </configuration>
    
  3. hdfs-site.xml(设置 namenode 节点数据的存放位置、datanode 节点数据的存放位置)

    <property>
       <name>dfs.namenode.name.dir</name>
       <value>/home/hadoop/hdfs/name</value>
    </property>
    <property>
       <name>dfs.datanode.data.dir</name>
       <value>/home/hadoop/hdfs/data</value>
    </property>
    
  4. yarn-site.xml(配置 NodeManager 上运行的附属服务及 resourcemanager 的主机名)

    <configuration>
       <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
       <property>
           <name>yarn.resourcemanager.hostname</name>
           <value>cluster-master</value>
       </property>
    </configuration>
    
  5. mapred-site.xml(指定 mapreduce 作业运行在 yarn 上)

    <configuration>
       <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
       </property>
       <property>
     		<name>yarn.app.mapreduce.am.env</name>
     		<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    	</property>
    	<property>
     		<name>mapreduce.map.env</name>
     		<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    	</property>
    	<property>
         	<name>mapreduce.reduce.env</name>
     		<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    	</property>
    </configuration>
    
  6. workers(配置所有从属节点的主机名,每行一个)

    cluster-master
    cluster-slave1
    cluster-slave2
    

分发程序(将 Hadoop 安装包分发到其他两台服务器)(主节点操作)

scp -r /opt/hadoop/hadoop-3.3.1  cluster-slave1:/opt/hadoop/
scp -r /opt/hadoop/hadoop-3.3.1  cluster-slave2:/opt/hadoop/

6.启动集群

初始化 cluster-master 的 namenode(主节点操作)

进入 ${HADOOP_HOME}/bin/ 目录下,执行以下命令格式化 hadoop 文件系统:

./hdfs namenode -format

启动集群(主节点操作)

进入到 cluster-master 的 ${HADOOP_HOME}/sbin 目录下,启动 Hadoop:

# 启动dfs服务
./start-dfs.sh
# 启动yarn服务
./start-yarn.sh

此时 cluster-slave1 和 cluster-slave2 上的相关服务也会被启动

7.查看集群

在每台服务器上使用 jps 命令查看服务进程

查看 Namenode Web-UI,端口为 9870

查看 YARN Web-UI,端口号为 8088