Docker搭建虚假的完全分布式Hadoop集群的采坑记录

本文详细记录了使用Docker搭建Hadoop完全分布式集群的步骤,包括安装Docker、拉取或构建Hadoop镜像、配置网络环境、自定义Dockerfile、启动与验证集群,并介绍了Eclipse远程连接Hadoop集群的方法。适合希望在Docker环境下实践Hadoop的开发者参考。
摘要由CSDN通过智能技术生成

Hadoop-Docker

0x01安装Docker

Docker的官网上下载Docker-Desktop

  • Windows系统建议使用WSL2子系统,详见网络教程(安装WSL2子系统)
  • Linux系统下的使用亦参加网络教程安装Docker

Windows安装Docker-Deskktop并开启基于WSL2引擎

  • 没有wsl2也可以,一样的其实

  • 安装过程中一路next

  • 可以从这里下载docker-desktop for windows

  • 更改镜像源,参见网络教程

  • 开启wsl2引擎同时还需要安装Linux发行版到WSL2上面(可选项)

image-20201116224217137

0x02 pull安装有hadoop的docker镜像(可选)

  • 镜像,是 Docker 的核心,可以通过从远程拉取镜像即可配置好我们所需要的环境,我们这次需要的是 Hadoop 集群的镜像。我们使用kiwenlau/hadoop:1.0这个镜像。
  • 当然,我们后面介绍了如何自己写一个镜像,可以不用这个的哦
docker pull kiwenlau/hadoop:1.0

静待pull完成

  • pull完成之后查看images的时候可以看见这个镜像

    docker images
    

    image-20201116225204374

克隆配置脚本(可选)

这一步是从github上克隆配置脚本,脚本的内容是使用kiwenlau/hadoop:1.0配置mater、slave1、slave2三个容器,其中slave数量可以修改:

git clone https://github.com/kiwenlau/hadoop-cluster-docker

以下大多数脚本在这个文件里面都可以寻找到,接下来的配置也是安装3个结点:hadoop-master,hadoop-slave1,hadoop-slave2 进行配置

0x03 搭建网络环境

  • 我们需要搭建的是一个Hadoop集群,他们之间需要能够互相通信,同时他们在网络中的地位应该是相同的

Hadoop的master节点需要与slave节点通信,需要在各个主机节点配置节点IP,为了不用每次启动都因为IP改变了而重新配置,在此配置一个Hadoop专用的网桥,配置之后各个容器的IP地址就能固定下来。

(关于Docker的网络模式可以参见docker的五种网络模式总结)

docker network create --driver=bridge hadoop
  • 以上命令的意义为:以Bridge模式创建一个以hadoop命名的网络,该网络模式相当于架设了一台交换机,在系统内部搭建了一个虚拟的内网环境,在该网络下的容器可以互相访问,也可以通过NAT方式访问外部网络,但是外部网络不能直接访问到容器内部

0x04 自己搭建Hadoop镜像

  • 文末附搭建镜像的资源1
  • 前面从github上面撸下来的那个脚本的文件夹里存放了配置haoop需要的文件,例如core-site.xml等,这些文件在这个被pull下来的镜像被创建的时候就被写进了文件系统,所以,我们可以省去很多多余的工作
  • 当然,这些文件也可以用来在虚拟机或者真正的计算机集群上作为搭建Hadoop的配置文件
  • 因为事情都被人家干的差不多了,所以我们详细的看一下这些配置文件,方便在其他平台(如虚拟机平台)上从0开始搭建Hadoop使用

! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 注意,以下编写Dockerfile过程中使用到的命令以及配置文件,在不使用Docker搭建hadoop时也能用到的哟

! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !

预置Dockerfile文件分析

  • 依Dockerfile文件创建的镜像所有的命令和文件操作都会预先执行
  • 这里的Dockerfile文件是这个项目的作者写的,后面我们会在这个基础上按照我们的某些特定的需求对Dockerfile进行更改。敬请期待
  • Dockerfile中定义的指令均会被执行,所有,我们可以参照于此,在普通的未安装hadoop的Ubuntu系统上以以下命令和操作进行hadoop的安装
FROM ubuntu:14.04
# #后面的是注释
MAINTAINER KiwenLau <kiwenlau@gmail.com>
# 声明维护者,对我们没啥用
WORKDIR /root
# 声明工作目录,该目录是你以bash方式进入依镜像开启的容器时默认进入的地址,一般默认root用户,/root目录就是~目录

# install openssh-server, openjdk and wget
RUN apt-get update && apt-get install -y openssh-server openjdk-7-jdk wget
# 正如上面的英文所说,更新软件源以及下载安装ssh工具和openjdk 因为我们使用甲骨文公司的jdk,所以后面这句命令 openjdk-7-jdk 可以去掉

# install hadoop 2.7.2
#下载hadoop软件包(你可以更改这里的下载地址如Apache的网站去下载)
RUN wget https://github.com/kiwenlau/compile-hadoop/releases/download/2.7.2/hadoop-2.7.2.tar.gz && \ #\符号在这里表示换行,即执行多行命令,这样的写法可以避免多次执行RUN指令使建立的镜像过大,如果你有兴趣,可以将所有的RUN指令的内容进行合并
    tar -xzvf hadoop-2.7.2.tar.gz && \  #解压安装包,
    mv hadoop-2.7.2 /usr/local/hadoop && \ # 将hadoop的安装包移至/usr/local/hadoop目录下面
    rm hadoop-2.7.2.tar.gz # 删除下载的压缩包

# set environment variable
ENV JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 
ENV HADOOP_HOME=/usr/local/hadoop 
ENV PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin 
# 上面3行设置了环境变量,一般安装Hadoop的教程中也会提及。
#因为我们要使用自己下载的jdk,所以这里的JAVA_HOME需要进行更改,同时,添加将自己下载的jdk包复制到镜像的文件系统中


# ssh without key
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#生成ssh免密登陆的公钥和私钥,这个因为我们的集群容器在一个镜像上面建立,所以他们的公私钥都是一样的,在这里建立之后就可以直接免密ssh登陆


RUN mkdir -p ~/hdfs/namenode && \ 
    mkdir -p ~/hdfs/datanode && \
    mkdir $HADOOP_HOME/logs #创建日志文件夹
#创建hdfs文件系统的namenode,datanode等,对于master节点,不需要datenode,对于slave节点,不需要namenode,但是为了创建的镜像中有这两个文件夹,所以就都创建上,生成容器后可以删除不需要的文件夹

COPY config/* /tmp/# 将写好的配置文件core-site.xml等文件拷贝到镜像系统中/tmp下,不一个一个复制还是那个原因,多余的指令会使镜像文件冗余

# 衔接上一步操作,将所有要更改的文件先下载到物理机中,更改完成后传到镜像文件系统中的对应位置。
RUN mv /tmp/ssh_config ~/.ssh/config && \
    mv /tmp/hadoop-env.sh /usr/local/hadoop/etc/hadoop/hadoop-env.sh && \
    mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml && \ 
    mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml && \
    mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml && \
    mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml && \
    mv /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves && \
    mv /tmp/start-hadoop.sh ~/start-hadoop.sh && \
    mv /tmp/run-wordcount.sh ~/run-wordcount.sh

# 更改脚本执行权限,前两个个shell脚本是自己写的,不是hadoop自带的,主要是为了启动hadoop更加方便,具体内容参加附件。
RUN chmod +x ~/start-hadoop.sh && \
    chmod +x ~/run-wordcount.sh && \
    chmod +x $HADOOP_HOME/sbin/start-dfs.sh && \
    chmod +x $HADOOP_HOME/sbin/start-yarn.sh 

# 格式化hdfs,
# format namenode
RUN /usr/local/hadoop/bin/hdfs namenode -format
# 在容器启动时启动ssh服务,即启动ssh登陆功能
CMD [ "sh", "-c", "service ssh start; bash"]

自定义Dockerfile文件

  • 前置工作,你应该有一个基础镜像,选择Ubuntu:18.04

    docker pull ubuntu:18.04
    
  • 编写自己的Dockerfile,搭建自己的镜像

    • 大部分的代码还是一样的,最后的Dockerfile应该和config文件夹在同一级。
    • 我们使用甲骨文公司的jdk-8u271
    • apache公司的hadoop-2.7.7,这个文件已经下载好了,如果不想用这个版本的话,可以按照上面介绍的方法,在apache官方下载
    • config中的文件一般不要在windows下打开,因为文件要在linux下运行,在windows下打开可能会改变其换行模式(即CRLF和LF
    • 本例中将slave文件中的节点设置为了两个slave节点,如果要更多,参见文件resize-cluster.sh
FROM ubuntu:18.04
#使用我们刚刚下载的Ubuntu系统镜像18.04

WORKDIR /root
# 声明工作目录,该目录是你以bash方式进入依镜像开启的容器时默认进入的地址,一般默认root用户,/root目录就是~目录

COPY config/* /tmp/
# 将写好的文件core-site.xml等文件拷贝到镜像系统中/tmp下,方便后续操作

# set environment variable
ENV JAVA_HOME=/usr/local/jdk1.8.0_271
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值