使用 docker compose 搭建 hadoop集群 总结

2023-12-02 20:46:47 浏览数 (1)

-- 学习了 docker 之后实践机会较少,通过本次实践练习 dockerfile 的编写,docker compose 的使用,以及一些 linux 命令的回顾

操作系统基础镜像

选用 ubuntu 20.04 作为基础镜像,需要在引入镜像后第一时间修改源,以免后续软件下载过慢

代码语言:shell复制
FROM ubuntu:20.04
# 换源
RUN sed -i  's/archive.ubuntu.com/mirrors.aliyun.com/g'  /etc/apt/sources.list
# 用于提供 ssh 服务、下载 及修改文件的工具
RUN apt install -y openssh-server wget openssh-client ntpdate neovim

下载JDK 及 hadoop

选用的是 JDK 8 及 Hadoop 3.3.3

代码语言:shell复制
// 解压后删除压缩包,避免无用文件占据空间
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.3/hadoop-3.3.3.tar.gz 
&& wget https://mirrors4.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz 
&& tar -xvf hadoop-3.3.3.tar.gz -C /var  
&& tar -xvf OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz -C /var 
&& rm hadoop-3.3.3.tar.gz OpenJDK8U-jdk_x64_linux_hotspot_8u392b08.tar.gz

配置环境变量

代码语言:shell复制
# 配置 JDK 及 hadoop 环境变量
RUN echo 'export JAVA_HOME=/var/jdk8u392-b08' >> ~/.bashrc 
&& echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc 
&& echo 'export CLASSPATH=$JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar' >> ~/.bashrc 
&& echo 'export HADOOP_HOME=/var/hadoop-3.3.3' >> ~/.bashrc 
&& echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc 
&& echo 'export JAVA_HOME=/var/jdk8u392-b08' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
&& echo 'export HDFS_NAMENODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
&& echo 'export HDFS_DATANODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
&& echo 'export HDFS_SECONDARYNAMENODE_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
&& echo 'export YARN_RESOURCEMANAGER_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
&& echo 'export YARN_NODEMANAGER_USER=root' >> /var/hadoop-3.3.3/etc/hadoop/hadoop-env.sh 
# 存放hdfs数据
&& mkdir /var/data 

注意事项:

  • 与 >> 的区别 将直接覆盖原文件,>> 在原文件中追加内容
  • echo 命令 '' 与 "" 的区别 '' 在 evaluate 变量之后再输出,"" 则直接将原字符串输出配置 Hadoop注意事项:
  • xml文件配置时,标签之间不能有空格,否则将会出现错误配置 ssh
代码语言:shell复制
# config ssh
# 本来打算通过 sed 进行文本替换来修改配置文件,但一番尝试之后发现 sed 适合替换字符串,如单词等,但不适合带有空格的字符串,故直接使用 echo 在文件末尾追加
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config 
&& echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config 
# 通过启动脚本文件来运行 ssh 服务,
# 直接将 "/usr/sbin/sshd -D" 作为启动命令将会报错
# 原因为 默认启用的是 /bin/sh, "/usr/sbin/sshd -D" 需要通过 /bin/bash 启动
RUN touch /var/run.sh 
&& echo "#!/bin/bash " >> /var/run.sh 
&& echo "/usr/sbin/sshd -D" >> /var/run.sh 
&& chmod 777 /var/run.sh 
&& mkdir /run/sshd
# 设置 root 密码
RUN echo "root:112233" | chpasswd
CMD [ "/var/run.sh"  ]
# 进入node1 后,生成密钥并将公钥传给 其他 node
# ssh-keygen -t ed25519
# ssh-copy-id node1
# ssh-copy-id node2
# ssh-copy-id node3

配置 docker compose

代码语言:yaml复制
// 输入代码内容
version: "3"
services:
  # 主 node
  node1:
    build: .
    hostname: node1
  node2:
    build: .
    hostname: node2
  node3:
    build: .
    hostname: node3

docker compose 的优点在于能够便捷地配置网络,实现 docker 之间的互联

使用

代码语言:shell复制
# 简简单单的一句即可实现容器的相互连接
docker compose up 

其他内容

可以通过 --net=host 参数来让容器使用宿主机的网络,从而访问外部网络,然而更好的方法是允许宿主机的 ip 路由转发,通过 docker 的虚拟网络来访问外部网络

项目地址

0 人点赞