Docker搭建Hadoop实录

docker搭建hadoop实录

鉴于用虚拟机跑hadoop太卡的原因,想在docker上跑hadoop

又因为hadoop搭建伪分布式环境,需要用到ssh免密登录本机

笔者的环境是Mac + Docker Desktop,启动centos容器后,在容器内无法通过systemctl start sshd启动ssh服务

查阅后得知,容器内的ssh,需要穿透到宿主机,至于到底为什么要如此设定,具体原因尚不可知。

因此只能依赖docker-machine操作了

docker-machine的本质,就是virtualbox的一台虚拟机,md,兜兜转转,还是要用虚拟机搞。但既然搞到一半了,后续到底要解决哪些问题尚不可知。但目前暂时还没有其他选择,那就继续搞docker-machine吧

在第一次运行docker-machine后,需要解压hadoop、hive等压缩包,提示空间不足。打开virtualbox窗口看了一下虚拟机给分配的磁盘容量,显示20GB,如果真的是这样的话,应该是足够使用了。所以目测因为其他的原因,导致实际分配的磁盘空间过小

输入docker-machine ssh default进入docker-machine,通过df -h /命令查看磁盘信息,显示如下

Filesystem                Size      Used Available Use% Mounted on
tmpfs                   886.9M    886.9M         0 100% /

能看到,磁盘只有800多兆,那肯定是不够用

继续百度,通过docker-machine create default创建虚拟机default时,可以指定磁盘大小。格式如下

docker-machine create --virtualbox-memory 8192 default

运行过一次后,再次通过docker-machine ssh default进入虚拟机,再次通过df -h /查看磁盘信息,显示如下

Filesystem                Size      Used Available Use% Mounted on
tmpfs                     7.0G    274.8M      6.7G   4% /

既然创建虚拟机时可以指定磁盘大小,那么猜测应该是可以指定内存大小的。但参数名字--virtual-memory英文含义应该就是内存的意思,反而设置的是磁盘,那么内存参数到底是啥,靠猜应该是猜不出来了,那么就通过docker-machine create --help看一下命令手册了。刚敲完后乍一看,以为输出错误信息了,重新敲了一遍,细节看了一下,确实是命令手册

读了一遍以后,看起来两个参数是比较靠谱:

  • --virtualbox-disk-size,这个参数,在命令手册中,确实是磁盘大小
  • --virtual-memory,这个参数,在命令手册中,也确实不是磁盘大小,有点懵逼...。如果靠猜的话,应该是内存设置多大,磁盘就设置多大???但又没什么道理,因为--virtualbox-disk-size,默认值是20G,在VirtualBox图形化工具上看到的,也确实是20G...

算了,这两个参数暂时搁置吧,以后再说。

现在可以把mac电脑上设置好的的docker-compose,给搞到docker-machine上了

docker-machine scp -r '/Users/XXX/docker-compose/hadoop-pseudo' default:/home/docker

再输入docker-machine ssh default进入docker-machine

此处提示需要注意一下,在docker-machine中,在线安装软件的命令,不是yum(不是红帽系列),也不是apt-get(不是debian系列),而是tcl
因为提示的地方已经写得很清楚了: TinyCoreLinux。想要安装软件的话,需要用到另一个命令。比如要装vim:

tce-load -wi vim.tcz

开始安装jdk

tar -zxvf jdk-8u331-linux-x64.tar.gz

再装hadoop

tar -zxvf hadoop-2.10.1.tar.gz

装docker-compose

wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

装docker-compose的过程耗时有点长,就去google了一下看为啥mac搭centos 7就不能用ssh

在docker官网上找到了这么一个描述:
https://docs.docker.com/desktop/mac/networking/#ssh-agent-forwarding

需要给docker-compose添加如下配置信息

    volumes:
      - type: bind
        source: /run/host-services/ssh-auth.sock
        target: /run/host-services/ssh-auth.sock      
    environment:
      - SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock

进入容器,敲systemctl start sshd,还是显示:

Failed to get D-Bus connection: Operation not permitted

MD,然后又google关键词mac docker desktop Failed to get D-Bus connection,看到了一个词有点印象cgroups。不知道这是个什么玩意,点进去看了一下。看到了Docker Desktop 4.3.0的release note:

Docker Desktop now uses cgroupv2. If you need to run systemd in a container then:
* Ensure your version of systemd supports cgroupv2. It must be at least systemd 247. Consider upgrading any centos:7 images to centos:8.
* Containers running systemd need the following options: --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw.

大概意思就是,推荐你用centos8,而不是7。如果你非要用centos7,那么需要在docker run时加上如上几个参数。
感觉离成功越来越近了,目前需要的是,把如上那几个参数,给搬运到docker compose配置文件里

首先第一个参数,貌似已经解决了

privileged: true

第二个参数,cgroupns,在docker run里有,但在docker-compose里没有。卧泥马...

回过头看了一下docker-machine里,compose的下载进度,还没下完。那就搞一下centos8吧

之前尝试过用centos8解决问题,但是启动起来之后,显示什么编码集的问题...

不行了,搞吧

给docker-compose中镜像的版本号改成centos 8,启动

安装软件包

yum install -y initscripts curl which tar sudo rsync openssh-server openssh-clients

显示如下

Failed to set locale, defaulting to C.UTF-8
CentOS Linux 8 - AppStream                                                                         76  B/s |  38  B     00:00    
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

两个问题,一个编码集,但貌似不是特别致命。那就先不管
第二个appstream,貌似是无法从仓库中下载软件,查询之后得到以下结果:

在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。

CentOS 8已于2021年12月31日寿终正寝,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org

如果你仍然需要运行你的旧CentOS 8,你可以在/etc/yum.repos中更新repos.d使用vault.centos.org代替mirror.centos.org。

cd /etc/yum.repos.d
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum update -y

再次安装

yum install -y initscripts curl which tar sudo rsync openssh-server openssh-clients

启动sshd服务

systemctl start sshd

修改root密码

yum install -y passwd
passwd root

ssh免密登录

ssh-keygen
ssh-copy-id localhost

都没问题了,搭建hadoop伪分布式环境——今天累了,改天再说吧

其实还有一个问题没解决——如何在主机,通过ip或网络名,访问容器?留下次解决吧。

docker-machine里边的compose也下载完了,但貌似不需要这种方案了。让他退下吧

docker-machine rm default

整理一下

  1. 先写一个docker-compose.yml:
version: '3.9'
services:
  hadoop-pseudo:
    image: centos:8.4.2105
    container_name: hadoop-pseudo
    tty: true
    privileged: true
    ports: 
      - 8088:8088
      - 50070:50070
    volumes:
      - ./jdk1.8.0_331:/usr/local/jdk1.8.0_331
      - ./hadoop-2.10.1:/usr/local/hadoop-2.10.1
      - type: bind
        source: /run/host-services/ssh-auth.sock
        target: /run/host-services/ssh-auth.sock        
    env_file: env
    environment:
      - SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock
    command: '/usr/sbin/init'

networks:
  default:
    external: true
    name: global
  1. 再写一个环境变量文件env:
# Java Development Kit Environment
export JAVA_HOME=/usr/local/jdk1.8.0_331
export PATH=$PATH:$JAVA_HOME/bin

# Hadoop Environment
export HADOOP_CONF_DIR=/usr/local/hadoop-2.10.1/etc/hadoop
export HADOOP_HOME=/usr/local/hadoop-2.10.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  1. 准备hadoop-2.10.1.tar.gz,解压至当前目录

  2. 准备jdk-8u331-linux-x64.tar.gz,解压至当前目录

  3. 以上4步所产生的文件,全部放到同一目录中,在目录中执行命令:

    docker compose up -d

  4. 可以进入容器了

    docker exec -it hadoop-pseudo bash

  5. 执行命令

    cd /etc/yum.repos.d
    sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
    yum update -y
    
    yum install -y initscripts curl which tar sudo rsync openssh-server openssh-clients
    
    systemctl start sshd
    
    yum install -y passwd
    passwd root
    
    ssh-keygen
    ssh-copy-id localhost
    
  6. 改hadoop、hive配置文件,此处省略1000字

  7. 启动hdfs、yarn(伪分布式,貌似不用yarn)、hive,然后就能玩了

  8. 在宿主机浏览器里通过本机50070端口、8088端口就能访问Web UI了

你可能感兴趣的:(Docker搭建Hadoop实录)