# hadoop-docker-quickstart **Repository Path**: EscapeReality846089495/hadoop-docker-quickstart ## Basic Information - **Project Name**: hadoop-docker-quickstart - **Description**: 基于 docker 的 hadoop 快速部署项目 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-09-16 - **Last Updated**: 2023-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 前言 本文先介绍启动一个 Hadoop-3.3.0 集群需要的拓扑配置,然后介绍构建一个通用的 Hadoop-3.3.0 镜像所需的 Dockerfile 配置,最后基于此镜像部署可一键启动的 Hadoop-3.3.0 集群所需的Docker Compose 配置(docker-compose.yml)。 ## 快速使用 windows 用户启动 up.cmd; 其余用户启动 up.sh; ## Hadoop 集群拓扑配置 3.3.0 版本的 Hadoop 只需要配置 worker 的网络地址和 主节点到 worker 的免密登录即可成功启动集群。主节点知道了 worker 的网络地址以及登录方式后,就可以使用远程shell来自动唤起工作节点上的组件。 操作步骤: 1. 配置主节点到从节点之间的免密登录,使得主节点可以免密登录从节点; 2. 在主节点的`${HADOOP_HOME}/etc/hadoop/workers`中列出从节点的网络地址。 ## Dockerfile 本节主要负责的是准备节点的运行条件(软件包、环境变量)与调试条件(网络辅助工具)。 使用 [eclipse-temurin](https://hub.docker.com/_/eclipse-temurin?tab=description&page=1&ordering=last_updated):8-jdk-focal 作为基础镜像(FROM eclipse-temurin:8-jdk-focal),Dockerfile 中配置流程及源码如下: 1. apt 源配置与重要工具下载 先添加apt的aliyun镜像;更新源并安装 wget(用于测试 web UI、下载 hadoop 压缩包)、ssh、vim(用于编辑文件)、net-tools(netstat)、inetutils-ping(ping)工具;清除源 ``` RUN sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list &&\ apt-get update && apt-get install -y wget ssh vim net-tools inetutils-ping &&\ apt-get clean ``` 2. hadoop 安装 获取 hadoop 压缩包,解压到根目录,删除压缩包 ``` RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz\ && tar -zxvf hadoop-3.3.0.tar.gz && rm -f hadoop-3.3.0.tar.gz ``` 3. hadoop 重要环境变量(JAVA_HOME)配置 在环境设置的 shell 文件顶部添加 JAVA_HOME 的声明 ``` RUN sed -i "1i JAVA_HOME=/opt/java/openjdk" hadoop-3.3.0/etc/hadoop/hadoop-env.sh RUN sed -i "1i JAVA_HOME=/opt/java/openjdk" hadoop-3.3.0/etc/hadoop/mapred-env.sh RUN sed -i "1i JAVA_HOME=/opt/java/openjdk" hadoop-3.3.0/etc/hadoop/yarn-env.sh ``` 4. 配置主节点到从节点之间的免密登录,对应上一节的第 1 步(实现时配置了任意两两互相访问,更为简洁) 每个主机添加相同的ssh-key与信任列表,使得互相可达 ``` RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &&\ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys &&\ chmod 0600 ~/.ssh/authorized_keys ``` 5. 声明暴露端口、环境变量以及容器入口点命令。 显式声明暴露端口(可选);为组件添加启动用户,均为 root,供管理组件跨机启动对应的工作组件进程;默认入口点为启动 ssh 服务 ``` EXPOSE 9870 EXPOSE 9000 EXPOSE 8088 EXPOSE 10020 EXPOSE 19888 ENV HDFS_NAMENODE_USER=root ENV HDFS_DATANODE_USER=root ENV HDFS_SECONDARYNAMENODE_USER=root ENV YARN_RESOURCEMANAGER_USER=root ENV YARN_NODEMANAGER_USER=root ENTRYPOINT service ssh restart && bash ``` ## Docker Compose配置 在完成了如上的镜像构建后,将基于此镜像部署主节点与从节点。 配置要点有: * 设置专用网络; * 外部重要配置文件映射,对应上一节的第 2 步,包括 1. 设置主节点上的从节点列表(/hadoop-3.3.0/etc/hadoop/workers); 2. 设置主节点核心参数,主要是对外开放的地址(/hadoop-3.3.0/etc/hadoop/core-site.xml); 3. 设置主节点的 hdfs 运行参数,主要是文件块的备份数(/hadoop-3.3.0/etc/hadoop/hdfs-site.xml); 4. 设置主节点入口点为自定义的 entry.sh(/hadoop-3.3.0/etc/hadoop/entry.sh),entry.sh 的内容可自定义 5. 设置从节点上记录的主节点网络地址(/hadoop-3.3.0/etc/hadoop/core-site.xml); * 从节点复制数; * 主节点的容器入口点,以覆盖镜像内预定义的入口点,指定其运行 entry.sh ``` yml version: "2.4" services: namenode: image: hadoop:3.3.0 ports: - "9870:9870" - "9000:9000" - "8088:8088" - "10020:10020" - "19888:19888" volumes: - "./conf/namenode/core-site.xml:/hadoop-3.3.0/etc/hadoop/core-site.xml" - "./conf/namenode/hdfs-site.xml:/hadoop-3.3.0/etc/hadoop/hdfs-site.xml" - "./conf/namenode/workers:/hadoop-3.3.0/etc/hadoop/workers" - "./conf/namenode/entry.sh:/hadoop-3.3.0/etc/hadoop/entry.sh" depends_on: - "datanode" entrypoint: /hadoop-3.3.0/etc/hadoop/entry.sh networks: hadoops: stdin_open: true tty: true datanode: image: hadoop:3.3.0 deploy: replicas: 2 volumes: - "./conf/datanode/core-site.xml:/hadoop-3.3.0/etc/hadoop/core-site.xml" networks: hadoops: stdin_open: true tty: true networks: hadoops: ``` ## 最后一步 在 docker-compose.yml 所在目录下运行 docker-compose up -d 以启动这些容器,等待若干秒,即可在浏览器中访问 hdfs、yarn、mapreduce history 的 web UI。web UI 的默认端口参考[hadoop官网教程](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html)拉到底。