Docker + Hadoop

使用Docker部署Hadoop集群

1. 相关工具和环境说明

TermiusSSH、基于Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-146-generic x86_64)镜像的服务器、dockerJDK1.8

2. Ubuntu下docker的安装

官网:https://docs.docker.com/engine/install/ubuntu/
建议自行看官网安装,下面这个做个简单的翻译

  1. 在尝试安装新版本之前卸载任何此类旧版本,旧版本的 Docker 使用的名称是 DockerDocker.ioDocker-engine

    sudo apt-get remove docker docker-engine [docker.io](http://docker.io/) containerd runc
    
  2. 更新 apt 包索引并安装包,以允许 apt 通过 HTTPS 使用存储库:

    sudo apt-get update
    
    # \ 续行符号:继续到下一行
    
    sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
  3. 添加 Docker 的官方 GPG 密钥(gpgkey:是用来验证软件的真伪——防伪的):

    # -m  建立目录的同时设置目录的权限
    # -p 递归创建多级目录
    sudo mkdir -m 0755 -p /etc/apt/keyrings
    
    curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
  4. 下载仓库文件

    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  5. 再次更新系统

    sudo apt-get update
    
  6. 安装最新版Docker

    sudo apt-get install docker-ce docker-ce-cli [containerd.io](http://containerd.io/) docker-buildx-plugin docker-compose-plugin
    
  7. 通过运行 hello-world 镜像验证 Docker Engine 安装是否成功:

    sudo docker run hello-world
    # 出现
    # This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits.
    # 表明安装成功!
    # 如下图所示
    

    在这里插入图片描述

3. 部署Hadoop

大致过程:

  1. 拉取 ubuntu:20.04 基础镜像,并进行必要工具的安装
  2. 在基础镜像中进行hadoop的配置
  3. 提交为新的镜像,命名为 yhhadoop
  4. 以此镜像为基础创建3个容器,并赋予 hostname:master、slave1和slave2
  5. 进入 master 容器,启动 Hadoop 集群
  6. 运行 wordcount 实例

4.1 下载hadoop文件

在 ubuntu 本机下载 hadoop文件,然后后面再和 docker容器 进行路径映射就好
下载到 /root/hadoop_files/

# 1. 下载 hadoop-3.3.5.tar.gz , 可能有点慢。。。
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz

# 2. 下载hadoop的公共密钥
wget https://downloads.apache.org/hadoop/common/KEYS

# 3. 下载对应的签名文件
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz.asc

# 4. 导入 Hadoop 的公共密钥。您需要将 KEYS 文件导入 GPG 密钥库,例如:
gpg --import KEYS

# 5. 验证签名。使用以下命令验证 Hadoop 的签名:
gpg --verify hadoop-3.3.5.tar.gz.asc hadoop-3.3.5.tar.gz

# 6. 输出如下信息表明验证成功
root@YH:~/hadoop_files# gpg --verify hadoop-3.3.5.tar.gz.asc hadoop-3.3.5.tar.gz
gpg: Signature made Thu 16 Mar 2023 01:28:06 AM CST
gpg:                using RSA key 38237EE425050285077DB57AD22CF846DBB162A0
gpg: Good signature from "Steve Loughran (ASF code sign key  - 2018) <stevel@apache.org>" [unknown]
gpg:                 aka "[jpeg image of size 8070]" [unknown]
gpg:                 aka "Steve Loughran <stevel@cloudera.com>" [unknown]
gpg:                 aka "Steve Loughran <steve.loughran@gmail.com>" [unknown]
gpg:                 aka "Steve Loughran <stevel@hortonworks.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 3823 7EE4 2505 0285 077D  B57A D22C F846 DBB1 62A0
root@YH:~/hadoop_files# 

在这里插入图片描述

4.2 拉取ubuntu:20.04 基础镜像,并进行必要工具的安装

  1. 拉取ubuntu:20.04镜像:docker pull ubuntu:20.04
    在这里插入图片描述

    现在的 Docker 网络能够提供 DNS 解析功能,我们可以使用如下命令为接下来的 Hadoop 集群单独构建一个虚拟的网络。
    使用 docker network create --driver=bridge hadoop 命令创建了一个名为 Hadoop 的虚拟桥接网络,该虚拟网络内部提供了自动的DNS解析服务。
    使用 docker network ls 命令查看 Docker 中的网络,可以看到刚刚创建的名为 hadoop 的虚拟桥接网络
    查看网桥使用情况:docker network inspect hadoop

    在这里插入图片描述

  2. 进入容器

    # 进入容器 并将本地 /root/hadoop_files 下的文件和容器中 /host_files 下的文件做映射
    # 命名为 ubuntu-hadoop
    
    docker run -it -v /root/hadoop_files:/host_files --name ubuntu-hadoop ubuntu:20.04
    # ctrl+p+q 推出容器,此种方法容器并没有停止
    # 使用 exit 推出容器会使容器停止
    # 使用以下命令 启动并进入 容器
    # docker start ubuntu-hadoop
    # docker ecex -it ubuntu-hadoop bash
    # 这时 使用 exit 推出容器 容器不会停止
    # 使用 docker stop ubuntu-hadoop 停止容器 
    
    # 或者使用下面命令进入
    # docker run -d -v /root/hadoop_files:/host_files --name ubuntu-hadoop ubuntu:20.04
    # -d 命令不会立马进入容器的交互式界面
    # 使用 docker ecex -it ubuntu-hadoop bash 进入
    
  3. 在ubuntu-hadoop容器中进行一些必要的配置

    # 安装 nano 编辑器 也可以安装 vim
    apt install nano
    # 安装 网络工具
    apt install net-tools
    # 安装java环境
    apt install openjdk-8-jdk
    # 安装ssh服务
    apt install openssh-server
    apt install openssh-client
    
  4. 配置密钥登陆
    1). 生成rsa方式加密的密钥:ssh-keygen -t rsa -P ""
    在这里插入图片描述
    2). 写入公钥:cat .ssh/id_rsa.pub >> .ssh/authorized_keys
    3). 登陆自己进行测试:ssh 127.0.0.1
    在这里插入图片描述
    4). 设置开机启动ssh服务:在 ~/.bashrc 中追加 service ssh start,编辑 .bashrcnano ~/.bashrc
    在这里插入图片描述

4.3 在基础镜像进行 hadoop 配置

  1. 解压 hadoop 文件并进行重命名

    # 解压文件
    tar -zxvf /host_files/hadoop-3.3.5.tar.gz -C /usr/local/
    # 重命名
    cd /usr/local/
    mv hadoop-3.3.5 hadoop
    
  2. 修改 /etc/profile 文件,添加一下环境变量到文件中

    nano /etc/profile
    
    # 追加
    #java
    # JAVA_HOME 为 JDK 安装路径,使用 apt 安装就是这个,用 update-alternatives --config java 可查看
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
    
    #hadoop
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_YARN_HOME=$HADOOP_HOME
    export HADOOP_INSTALL=$HADOOP_HOME
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_CONF_DIR=$HADOOP_HOME
    export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
    export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
    export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop
    export HDFS_DATANODE_USER=root
    export HDFS_DATANODE_SECURE_USER=root
    export HDFS_SECONDARYNAMENODE_USER=root
    export HDFS_NAMENODE_USER=root
    export YARN_RESOURCEMANAGER_USER=root
    export YARN_NODEMANAGER_USER=root
    
    # 刷新文件,使配置生效
    source /etc/profile
    
  3. 修改 /usr/local/hadoop/etc/hadoop 下的 hadoop 的一些配置文件

    修改 hadoop-env.sh

    nano hadoop-env.sh
    
    # 追加
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    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
    

    修改 core-site.xml

    <configuration>
    
    <!-- Set the default file system to use.
     Hadoop supports file systems such as File, HDFS, GFS, ali | Amazon Cloud, etc 
    -->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://master:9000</value>
    </property>
    
    <!-- Specify the storage directory for files generated during Hadoop runtime  -->
    <property>
      <name>hadoop.tmp.dir</name>
      <value>/usr/local/hadoop/tmp</value>
    </property>
    
    <!-- The username used to access HDFS in the web UI  -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
    
    </configuration>
    

    修改 hdfs-site.xml

    <configuration>
    
    <!-- Web Access Address  -->
    <property>
       <name>dfs.namenode.http-address</name>
       <value>master:9870</value>
    </property>
    
    <!-- Set SNN running host and port  -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>slave2:9868</value>
    </property>
    
    <!-- Specify the number of HDFS replicas  -->
    <property>
      <name>dfs.replication</name>
      <value>3</value>
    </property>
    
    <property>
     <name>dfs.namenode.name.dir</name>
     <value>/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    
    <property>
     <name>dfs.datanode.data.dir</name>
     <value>/usr/local/hadoop/tmp/dfs/data</value>
    </property>
    
    </configuration>
    

    修改mapred-site.xml

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <property>
            <name>mapreduce.application.classpath</name>
            <value>
                /usr/local/hadoop/etc/hadoop,
                /usr/local/hadoop/share/hadoop/common/*,
                /usr/local/hadoop/share/hadoop/common/lib/*,
                /usr/local/hadoop/share/hadoop/hdfs/*,
                /usr/local/hadoop/share/hadoop/hdfs/lib/*,
                /usr/local/hadoop/share/hadoop/mapreduce/*,
                /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
                /usr/local/hadoop/share/hadoop/yarn/*,
                /usr/local/hadoop/share/hadoop/yarn/lib/*
            </value>
        </property>
    
    <!-- MR Program History Service Address  -->
    <property>
      <name>mapreduce.jobhistory.address</name>
      <value>master:10020</value>
    </property>
    
    <!-- MR program history server web address  -->
    <property>
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>master:19888</value>
    </property>
    
    </configuration>
    

    修改yarn-site.xml

    <configuration>
    
    <!-- Site specific YARN configuration properties -->
    
    <!-- Specify the address of YARN's boss (ResourceManager)  -->
    <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>master</value>
    </property>
    
    <!-- How reducers obtain data  -->
    <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
    </property>
    
    </configuration>
    

    修改 workers

    nano workers
    
    # 删除里面的内容 并添加一下内容
    master
    slave1
    slave2
    
  4. 添加 hadoop 环境变量

    root@b9f7246412df:~# nano .bashrc 
    # 追加
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
    # 然后刷新一下
    root@b9f7246412df:~# source .bashrc
    
    # 尝试是否配置成功
    root@b9f7246412df:~# hadoop version
    Hadoop 3.3.5
    Source code repository https://github.com/apache/hadoop.git -r 706d88266abcee09ed78fbaa0ad5f74d818ab0e9
    Compiled by stevel on 2023-03-15T15:56Z
    Compiled with protoc 3.7.1
    From source with checksum 6bbd9afcf4838a0eb12a5f189e9bd7
    This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.3.5.jar
    

4.4 创建master、slave1、slave2镜像

# 提交配置好的镜像
root@YH:~# docker commit -m “hadoop” -a “yh” b9f7246412df yhhadoop

# 查看镜像yhhadoop
root@YH:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
yhhadoop     latest    0dd0efa8ddce   2 minutes ago   2GB
ubuntu       20.04     1c5c8d0b973a   5 weeks ago     72.8MB
mysql        5.7       be16cf2d832a   2 months ago    455MB

# 创建 master slave1 slave2 容器
root@YH:~# docker run -itd --network hadoop -h "master" --name "master" -p 9870:9870 -p 8088:8088 yhhadoop /bin/bash
b5e3d87db7427b506560b9c333a2d0a2645823c7d480edafad39820c668dca0b
root@YH:~# docker run -itd --network hadoop -h "slave1" --name "slave1" yhhadoop /bin/bash
b3bf90e57646aa390edb12aa3dd179b31814c86ffec44fc3f1e6a824e14eb930
root@YH:~# docker run -itd --network hadoop -h "slave2" --name "slave2" yhhadoop /bin/bash
b1b63c4e7afec618fa59a0a4203e8e2bfcbdbd2919cff5b4c720772c6ac4c881

# 查看正在运行的容器
root@YH:~# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS              PORTS                                                                                  NAMES
b1b63c4e7afe   yhhadoop       "/bin/bash"   6 seconds ago        Up 5 seconds                                                                                               slave2
b3bf90e57646   yhhadoop       "/bin/bash"   17 seconds ago       Up 16 seconds                                                                                              slave1
b5e3d87db742   yhhadoop       "/bin/bash"   About a minute ago   Up About a minute   0.0.0.0:8088->8088/tcp, :::8088->8088/tcp, 0.0.0.0:9870->9870/tcp, :::9870->9870/tcp   master
b9f7246412df   ubuntu:20.04   "/bin/bash"   44 hours ago         Up 21 hours                                                                                                ubuntu-hadoop
root@YH:~# 

4.5 在master中启动 hadoop 集群

root@YH:~# docker exec -it master bash
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                                                                         [ OK ] 
root@master:/#

# 格式化
root@master:/# hadoop namenode -format

# 启动hadoop集群
root@master:/# start-all.sh
Starting namenodes on [master]
master: Warning: Permanently added 'master,172.18.0.2' (ECDSA) to the list of known hosts.
Starting datanodes
slave1: Warning: Permanently added 'slave1,172.18.0.3' (ECDSA) to the list of known hosts.
slave2: Warning: Permanently added 'slave2,172.18.0.4' (ECDSA) to the list of known hosts.
slave2: WARNING: /usr/local/hadoop/logs does not exist. Creating.
slave1: WARNING: /usr/local/hadoop/logs does not exist. Creating.
Starting secondary namenodes [slave2]
Starting resourcemanager
Starting nodemanagers
root@master:/# 

在这里插入图片描述

4.6 访问本机的 8088 与 9870 端口查看监控信息

在这里插入图片描述

在这里插入图片描述

4.7 运行 jps 查看节点状态

root@master:/# jps
800 NodeManager
276 NameNode
698 ResourceManager
1134 Jps
383 DataNode
root@master:/# exit
exit
root@YH:~# docker exec -it slave1 bash
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                                                                         [ OK ] 
root@slave1:/# jps
65 DataNode
291 Jps
169 NodeManager
root@slave1:/# exit
exit
root@YH:~# docker exec -it slave2 bash
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                                                                         [ OK ] 
root@slave2:/# jps
64 DataNode
166 SecondaryNameNode
238 NodeManager
367 Jps
root@slave2:/# 

在这里插入图片描述

4.8 运行 wordcount 实例

  1. /usr/local/hadoop 下的 LICENSE.txt 文件作为 input

    cat LICENSE.txt > wordcount_test.txt
    
  2. HDFS 中创建 input 文件夹

    hadoop fs -mkdir /input
    
  3. 上传 wordcount_test.txt 文件到 HDFS

    hadoop fs -put ./wordcount_test.txt /input
    
  4. 查看 HDFSinput 文件夹里的内容

    hadoop fs -ls /input
    
    Found 1 items
    -rw-r--r--   3 root supergroup      15217 2023-04-14 12:49 /input/wordcount_test.txt
    
  5. 运作 wordcount 例子程序

    cd /usr/local/hadoop/share/hadoop/mapreduce/
    hadoop jar hadoop-mapreduce-examples-3.3.5.jar wordcount /data/wordcount /input /output
    
  6. 查看 HDFS 中的 /output 文件夹的内容

    hadoop fs -ls /output
    
    Found 2 items
    -rw-r--r--   2 root supergroup          0 2019-03-19 11:18 /output/_SUCCESS
    -rw-r--r--   2 root supergroup      35324 2019-03-19 11:18 /output/part-r-00000
    
  7. 查看 part-r-00000 文件的内容

    hadoop fs -cat /output/part-r-00000
    

4. 实验结果与分析

  1. sudo useradd -m hadoop -s /bin/bash 命令创建了可以登陆的 hadoop 用户,最后的 -s /bin/bash 含义是什么?

useradd 创建新用户
-m 选项来创建一个新的用户主目录(通常位于 /home/hadoop 下)
-s 选项来指定新用户的默认 shell/bin/bash

  1. 实验中 cd ~ 的含义是什么?

切换到当前用户目录
比如:
如果当前用户为 root,那么cd ~ 就会到 /root/ 目录
如果当前用户为 hadoop,那么cd ~ 就会到 /home/hadoop/ 目录

  1. JRE 和 JDK 的区别是什么?

JRE 和 JDK 都是 Java 开发和运行环境的组件,它们之间的主要区别在于它们包含的组件和用途。
JRE(Java Runtime Environment)是 Java 运行时环境,它包含了运行 Java 应用程序所必需的组件,包括 Java 虚拟机(JVM)、Java 类库、Java 命令行工具等。JRE 只能用于运行 Java 应用程序,而不能用于开发和编译 Java 代码。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了。
JDK(Java Development Kit)是 Java 开发工具包,它包含了开发和编译 Java 应用程序所必需的所有组件,包括 JRE、Java 编译器(javac)、Java 文档生成器(javadoc)、Java 调试器(jdb)、Java 应用程序打包工具(jar)等。JDK 除了包含 JRE,还提供了一系列开发工具,方便开发人员进行 Java 应用程序的开发和调试。如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。
总之,JRE 是运行 Java 应用程序所必需的组件,而 JDK 不仅包含了 JRE,还提供了开发和编译 Java 应用程序所必需的工具。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了;如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。
总之,JRE 是运行 Java 应用程序所必需的组件,而 JDK 不仅包含了 JRE,还提供了开发和编译 Java 应用程序所必需的工具。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了;如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。

  1. jps 命令运行后的结果是什么?
# `jps` 命令是 Java Virtual Machine Process Status Tool 的缩写,它可以列出当前系统上所有正在运行的 Java 进程的进程 ID(PID)以及 Java 进程的类名(Java class name)。

# `jps` 命令的输出结果包括两列信息,分别是 Java 进程的进程 ID 和 Java 进程的类名。具体来说,输出结果格式如下:
<进程 ID> <Java 进程的类名>

#例如,下面是 `jps` 命令的输出结果示例:
12345 Jps
23456 MainClass

# 下面是本次实验所存在的java进程
root@master:/# jps
800 NodeManager
276 NameNode
698 ResourceManager
1134 Jps
383 DataNode 

root@slave1:/# jps
65 DataNode
291 Jps
169 NodeManager
                                                                                                                             
root@slave2:/# jps
64 DataNode
166 SecondaryNameNode
238 NodeManager
367 Jps

# NameNode:HDFS 的主节点,负责管理文件系统的名称空间和客户端对文件的访问。
# DataNode:HDFS 的数据节点,负责存储和检索数据块。
# ResourceManager:YARN 的主节点,负责管理集群上的资源和作业。
# NodeManager:YARN 的工作节点,负责启动和监视容器(container)以及处理容器上的任务。
# Jps:Java Virtual Machine Process Status Tool,用于列出当前系统上所有正在运行的 Java 进程的进程 ID 和 Java 进程的类名。
# SecondaryNameNode:HDFS 的辅助节点,用于协助 NameNode 完成部分工作,如定期合并 HDFS 的编辑日志(edit log)以及 NameNode 的文件系统镜等(fsimage)等。
# 这些进程共同协作,完成分布式计算任务。
  1. 运行 WordCount 实例后的结果是什么?
hadoop fs -ls /output

Found 2 items
-rw-r--r--   2 root supergroup          0 2019-03-19 11:18 /output/_SUCCESS
-rw-r--r--   2 root supergroup      35324 2019-03-19 11:18 /output/part-r-00000

# _SUCCESS 文件是 MapReduce 作业运行成功的标识文件
# part-r-00000 是 MapReduce 作业的输出文件。

# 查看输出的内容
hadoop fs -cat /output/part-r-00000
# 其结果就是词频,格式为:
# word word——count
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值