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
整理一下
- 先写一个
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
- 再写一个环境变量文件
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
准备
hadoop-2.10.1.tar.gz
,解压至当前目录准备
jdk-8u331-linux-x64.tar.gz
,解压至当前目录-
以上4步所产生的文件,全部放到同一目录中,在目录中执行命令:
docker compose up -d
-
可以进入容器了
docker exec -it hadoop-pseudo bash
-
执行命令
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
改hadoop、hive配置文件,此处省略1000字
启动hdfs、yarn(伪分布式,貌似不用yarn)、hive,然后就能玩了
在宿主机浏览器里通过本机
50070
端口、8088
端口就能访问Web UI了