基于docker技术搭建hadoop与mapreduce分布式环境

一、安装doker

1. 宿主环境确认

  1. (如果没有的话)安装lsb-relaease工具

    apt install lsb-release

    在这里插入图片描述

  2. 检查版本

    lsb_release -a

    在这里插入图片描述

2. 整备安装环境

  1. 更新系统

    sudo apt update

    在这里插入图片描述

    在这里插入图片描述

    sudo apt upgrade

    在这里插入图片描述

    在这里插入图片描述

  2. 下载curl:

    sudo apt install curl

    在这里插入图片描述

3. 安装docker

  1. 通过curl工具安装docker

    curl -fssl https://get.docker.com -o get-docker.sh

    在这里插入图片描述

    sudo sh get-docker.sh

    在这里插入图片描述

    在这里插入图片描述

  2. 确认docker的安装

    sudo docker version

    在这里插入图片描述

  3. (可选)安装docker-compose,当前最新版本为1.29.2

    可以先行访问 https://github.com/docker/compose/releases/ 确认版本号

    sudo curl -l "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    在这里插入图片描述

    sudo chmod +x /usr/local/bin/docker-compose

    在这里插入图片描述

  4. 添加国内的docker镜像cdn

    sudo vi /etc/docker/daemon.json

    {
    
      "registry-mirrors":["https://kfp63jaj.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
    
    }
    

    在这里插入图片描述

  5. 重载docker使cdn生效:

    sudo systemctl daemon-reload

    在这里插入图片描述

    sudo systemctl restart docker

    在这里插入图片描述

    重启docker但遇到问题(如上图)

    为了方便,我先安装一个vim(实在不会用vi)

    在这里插入图片描述

    于是我删除了docker,并重新安装之后问题解决

    在这里插入图片描述

  6. 测试docker能否正常抓取镜像和运行

    1. 运行hello-world测试案例

      sudo docker run hello-world

      在这里插入图片描述

  7. 查看hello-world镜像的运行记录

    sudo docker ps -a

    在这里插入图片描述

二、基于docker技术搭建hadoop与mapreduce

1. 整备容器环境

  1. 抓取ubuntu 18.04的镜像作为基础搭建hadoop环境

    sudo docker pull ubuntu:18.04

    在这里插入图片描述

  2. 查看镜像是否抓取成功

    sudo docker images

    在这里插入图片描述

  3. 使用该ubuntu镜像启动一个容器

    将<host-share-path>与<container-share-path>连通

    sudo docker run -it -v ~/hadoop/build:/home/hadoop/build ubuntu

    在这里插入图片描述

    似乎总是会在前几个cdn里面找不到镜像,然后报一个错,然后在后面的cdn里面找到镜像

    容器启动后,会自动进入容器的控制台

  4. 在容器的控制台安装所需软件

    apt-get update

    在这里插入图片描述

    apt-get upgrade

    在这里插入图片描述

  5. 需要安装net-tools(网络管理工具)、vim(命令行文本编辑器)和ssh(远程登录协议)

    apt-get install net-tools vim openssh-server

    在这里插入图片描述

2. 配置ssh服务器

  1. 让ssh服务器自动启动

    vim ~/.bashrc

    在文件的最末尾按o进入编辑模式,加上:

    /etc/init.d/ssh start

    按esc返回命令模式,输入:wq保存并退出

    在这里插入图片描述

  2. 让修改即刻生效

    source ~/.bashrc

    在这里插入图片描述

  3. 配置ssh的无密码访问

    ssh-keygen -t rsa

    在这里插入图片描述

    cd ~/.ssh

    cat id_rsa.pub >> authorized_keys

    在这里插入图片描述

3. 安装jdk8

​ (注意:hadoop3.x目前仅支持jdk7,8)

  1. 安装jdk8

    apt-get install openjdk-8-jdk

    在这里插入图片描述

  2. 在环境变量中英勇jdk,编辑bash命令行配置文件

    vim ~/.bashrc

    在文件的最末尾加上:

    export java_home=/usr/lib/jvm/java-8-openjdk-amd64/
    
    export path=$path:$java_home/bin
    

    在这里插入图片描述

  3. 让jdk配置即刻生效

    source ~/.bashrc

    在这里插入图片描述

  4. 测试jdk正常运作

    java -version

    在这里插入图片描述

4. 保存镜像

  1. (可选)登陆docker,需要事先在docker网站上注册账号,好处是可以将自己做好的镜像提交到网上

    sudo docker login

    在这里插入图片描述

  2. 查询container id

    sudo docker ps -a

    在这里插入图片描述

  3. 将当前容器保存为镜像

    sudo docker commit <container id> <image name>

    在这里插入图片描述

  4. 容器太多时可以通过以下命令删除容器

    docker rm -f <containerid>

    在这里插入图片描述

5. 安装hadoop

  1. 在宿主控制台上下载hadoop二进制压缩包

    本文使用的hadoop版本为3.2.1,目前最新版本:3.3.2

    其他版本可以在apache hadoop官网下载: https://hadoop.apache.org/releases.html

    cd /<host-share-path>

    <host-share-path>指的是创建容器的时候的前面的路径:~/hadoop/build

    在这里插入图片描述

    wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz

    (这里下载的只是网页,没有用,因此hadoop压缩包还是得自己去下,懂吧!)

    在这里插入图片描述

  2. 在容器控制台上解压hadoop

    如果容器名字不喜欢或者不好打,可以给他重命名

    docker rename <原名> <新名>

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    打开容器

    docker exec -it <容器名或容器id> /bin/bash

    在这里插入图片描述

    如果容器没有启动,需要先启动容器

    在这里插入图片描述

    docker start <容器名或容器id>

    在这里插入图片描述

    cd /<container-share-path>

    <container -share-path>指的是创建容器的时候的前面的路径:/home/hadoop/build在这里插入图片描述

    tar -zxvf hadoop-3.3.2.tar.gz -c /usr/local

    (注意,使用hadoop-3.2.3.tar.gz时我出现了解压有问题的情况,因此更换了hadoop-3.3.2.tar.gz)

    在这里插入图片描述

  3. 安装完成了,查看hadoop版本

    1. 配置环境变量

      export hadoop_home=/usr/local/hadoop-3.3.2
      export hadoop_yarn_home=$hadoop_home
      

      在这里插入图片描述

    2. 测试

      cd /usr/local/hadoop-3.3.2

      ./bin/hadoop version

      在这里插入图片描述

  4. 为hadoop指定jdk位置

    1. 修改配置文件

      在hadoop安装目录下执行

      vim etc/hadoop/hadoop-env.sh

      在这里插入图片描述

      查找到被注释掉的java_home配置位置,更改为刚才设定的jdk位置

      export java_home=/usr/lib/jvm/java-8-openjdk-amd64/
      

      在这里插入图片描述

  5. hadoop联机配置

    1. 配置core-site.xml文件

      在hadoop安装目录下执行

      vim etc/hadoop/core-site.xml

      在这里插入图片描述

      加入

      <configuration>
      <property>
      <name>hadoop.tmp.dir</name>
      <value>file:/usr/local/hadoop-3.2.1/tmp</value>
      <description>abase for other temporary directories.</description>
      </property>
      <!-- 配置文件系统的uri,代码中可以通过该地址访问文件系统,使用 hdfsoperator.hdfs_uri 调用 -->
      <property>
      <name>fs.defaultfs</name>
      <value>hdfs://master:9000</value>
      </property>
      </configuration>
      

      在这里插入图片描述

    2. 配合hdfs-site.xml文件

      在hadoop安装目录下执行

      vim etc/hadoop/hdfs-site.xml

      在这里插入图片描述

      加入

      <configuration>
      <!-- 配置保存fsimage位置 -->
      <property>
      <name>dfs.namenode.name.dir</name>
      <value>file:/usr/local/hadoop-3.2.1/namenode_dir</value>
      </property>
      <!-- 配置保存数据文件的位置 -->
      <property>
      <name>dfs.datanode.data.dir</name>
      <value>file:/usr/local/hadoop-3.2.1/datanode_dir</value>
      </property>
      <property>
      <name>dfs.replication</name>
      <value>3</value>
      </property>
      </configuration>
      

      在这里插入图片描述

    3. mapreduce配置

      该配置文件的定义说明参考:

      https://hadoop.apache.org/docs/r<hadoop版本号>/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

    4. 配置mapred-site.xml

      在hadoop安装目录下执行

      vim etc/hadoop/mapred-site.xml

      在这里插入图片描述

      加入

      <configuration>
      <!-- mapreduce框架的名字 -->
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      <!-- 设定hadoop的位置给yarn和mapreduce程序 -->
      <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>
      

      在这里插入图片描述

    5. 配置yarn-site.xml文件

      在hadoop安装目录下执行

      vim etc/hadoop/yarn-site.xml

      在这里插入图片描述

      加入

      <configuration>
      <!-- site specific yarn configuration properties -->
      <!-- 辅助服务,数据混洗 -->
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      <!-- 设定资源管理服务器的host名称,这个名称(master)将在下个小节中设定-->
      <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>master</value>
      </property>
      </configuration>
      

      在这里插入图片描述

  6. 服务启动权限配置

    1. 配置start-dfs.sh与stop-dfs.sh文件

      在hadoop安装目录下执行

      vim sbin/start-dfs.sh

      在这里插入图片描述

      vim sbin/stop-dfs.sh

      在这里插入图片描述

      在文件开头加入

      HDFS_DATANODE_USER=root
      HADOOP_SECURE_DN_USER=hdfs
      HDFS_NAMENODE_USER=root
      HDFS_SECONDARYNAMENODE_USER=root
      

      在这里插入图片描述
      在这里插入图片描述

    2. 配置start-yarn.sh与stop-yarn.sh文件

      在hadoop安装目录下执行

      vim sbin/start-yarn.sh

      在这里插入图片描述

      vim sbin/stop-yarn.sh

      在这里插入图片描述

      在文件开头加入

      YARN_RESOURCEMANAGER_USER=root
      HADOOP_SECURE_DN_USER=yarn
      YARN_NODEMANAGER_USER=root
      

      在这里插入图片描述
      在这里插入图片描述

    3. 配置完成,保存镜像

      1. 返回宿主机

        exit

        在这里插入图片描述

      2. 查看容器

        docker ps

        在这里插入图片描述

      3. 上传容器

        docker commit <container id> <image name>

        在这里插入图片描述

  7. 启动hadoop,并进行网络配置

    1. 打开三个宿主控制台,启动一主两从三个容器:

    2. master

      打开端口映射:8088=>8080

      sudo docker run -p 8088:8080 -it -h master –-name master <image name>

      在这里插入图片描述

    3. worker01

      sudo docker run -it -h worker01 –-name worker01 <image name>

      在这里插入图片描述

    4. worker02

      sudo docker run -it -h worker02 –-name worker02 <image name>

      在这里插入图片描述

    5. 分别打开三个容器的/etc/hosts,将彼此的ip地址与主机名的映射信息补全(三个容器均需要如此配置)

      vim /etc/hosts

      在这里插入图片描述

      (需要时也可以使用一下命令查询ip: ifconfig<if和config中间不要有空格,否则就是另一个命令>)

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      添加信息(每次容器启动该文件都需要调整)

      <master的实际ip>   master
      <worker01的实际ip>   worker01
      <worker02的实际ip>   worker02
      

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      三台的hosts文件内容都一样

    6. 检查配置是否有效

      ssh master

      ssh worker01

      ssh worker02

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

  8. 在master容器上配置worker容器的主机名

    cd /usr/local/hadoop-3.3.2

    vim etc/hadoop/workers

    在这里插入图片描述

    删除localhost,加入

    worker01
    worker02
    

    网络配置完成

    在这里插入图片描述

  9. 启动hadoop

    1. 在master主机上,启动hadoop

      cd /usr/local/hadoop-3.3.2

      ./bin/hdfs namenode -format

      在这里插入图片描述

      在这里插入图片描述

      ./sbin/start-all.sh

      在这里插入图片描述

    2. 在hdfs上建立一个目录存放文件

      假设要创建的目录为:/home/hadoop/input

      ./bin/hdfs dfs -mkdir -p /home/hadoop/input

      ./bin/hdfs dfs -put ./etc/hadoop/*.xml /home/hadoop/input

      在这里插入图片描述

    3. 查看分发复制是否正常

      ./bin/hdfs dfs -ls /home/hadoop/input

      在这里插入图片描述

  10. 运行mapreduce自带的示例例程序

    1. 运行程序

      1. 新建目录/home/hadoop/wordcount

        ./bin/hdfs dfs -mkdir /home/hadoop/wordcount

        在这里插入图片描述

      2. 新建输入文件hello.txt并放在/home/hadoop/wordcount/目录下

        在这里插入图片描述

        在这里插入图片描述

      3. 执行程序

        ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.2.jar wordcount /home/hadoop/wordcount /home/hadoop/wordcount/output

        在这里插入图片描述在这里插入图片描述

  11. 运行结束后,查看输出结果

    (由于原先提供的任务我的云服务器跑不出来,因此我换成了wordcount任务)

    ./bin/hdfs dfs -ls /home/hadoop/wordcount/output

    在这里插入图片描述

    ./bin/hdfs dfs -cat /home/hadoop/wordcount/output/*

    在这里插入图片描述

三、Q&A

Q1:如何让name node退出安全模式。

A1:关闭容器前,没有执行stop-all.sh命令会导致name node进入安全模式。退出安全模式命令如下

./bin/hadoop dfsadmin -safemode leave

在这里插入图片描述

Q2:如何批量删除已经退出的容器。

A2:sudo docker container prune

Q3:启动hadoop服务时出现connect to host <docker node> port 22: connection refused的错误。

A3:ssh服务器没有启动,使用下面的命令启动ssh服务器

/etc/init.d/ssh start

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐