docker安装hadoop
docker安装hadoop
2025年4月29号更新: 写这篇博客的时候对docker的使用还并不熟练,单独下载了namenode的image去配置了
半天,那时候我还想着怎么缺这么多东西,现在想想我的操作完全忽略了docker的优点,其实再docker使用
hadoop很简单,在github找到对应的项目,clone下来直接在docker-compose后就直接可以用了,我下面整这么
多其实是镜像不全,我只使用了单个镜像,但实际是要用多个镜像导致的。
下面是原文:
前言:近期的大数据作业需要使用hadoop,不过都是要求在vmware的虚拟机中安装,因为有在用wsl2,不想关hyper-v,索性直接在docker中进行hadoop的安装
安装第一步,先拉取镜像:
docker pull bde2020/hadoop-base:2.0.0-hadoop2.7.4-java8
然后再使用docker run启动容器,并进行端口映射
docker run -it --name hadoop \
-p 9870:9870 -p 8088:8088 \
bde2020/hadoop-base:2.0.0-hadoop2.7.4-java8 /bin/bash
9870是HDFS Web UI 的默认端口
8088是YARN ResourceManager 的 默认Web UI 端口
然后将core-site.xml和hdfs-core.xml更改为本篇文章最下面给出的内容
然后就是启动服务
# 格式化 HDFS(第一次使用需要格式化 NameNode)
hdfs namenode -format
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
需要注意的是,这里需要找到你的start-dfs.sh和start-yarn.sh所在位置并运行,所以需要找到这两个启动shell的位
置
find / -name "start-dfs.sh"
find / -name “start-yarn.sh"
然后就可以访问 http://localhost:9870 查看 HDFS 状态,通过 http://localhost:8088 查看 YARN 状态
了。
按理说到这里就完成安装了,但是,我在运行start-dfs.sh时却遇上了
Starting namenodes on [45bebd121e03]
45bebd121e03: /opt/hadoop-2.7.4/sbin/slaves.sh: line 60: ssh: command not found
localhost: /opt/hadoop-2.7.4/sbin/slaves.sh: line 60: ssh: command not found
Starting secondary namenodes [0.0.0.0]
0.0.0.0: /opt/hadoop-2.7.4/sbin/slaves.sh: line 60: ssh: command not found
很明显,这个镜像里面没有ssh,我们要安装ssh
apt-get install openssh-client
apt-get install openssh-server
但是,在安装ssh时问题又出现了
W: Failed to fetch http://security.debian.org/dists/jessie/updates/main/binary-amd64/Packages 404 Not Found [IP: 151.101.2.132 80]
这是因为 Debian Jessie 仓库已不再提供更新和支持。Debian Jessie(Debian 8)已经被官方停止支持,因此其
软件包仓库不再可用
我们通过使用archive.debian.org修改其中源地址来解决
但是我们会发现,这个镜像里没有nano,也没有vim,想要安装又因为源无法安装
这时候就需要使用系统自带echo来解决了
echo "deb http://archive.debian.org/debian/ jessie main" > /etc/apt/sources.list
echo "deb http://archive.debian.org/debian-security/ jessie/updates main" >> /etc/apt/sources.list
然后再去安装ssh,发现成功了
启动ssh
service ssh status
启动后 执行我们的start-dfs.sh 发现又有问题了
让我们输入密码的密码错误,这是因为没有设置ssh的免密登陆
先生成密钥对 :
ssh-keygen -t rsa -P ""
再添加到authorized_keys中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
然后再去运行启动shell
发现怎么又又又报错了
这次是
0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
0.0.0.0: Error: JAVA_HOME is not set and could not be found.
原来是没有设置java环境变量
先查看java路径
update-alternatives --config java
再将路径设置为环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
需要注意,设置环境变量的java地址只需要到版本目录即可,我们通过上面的命令会直接给下一级的/bin/java路径
但我们不需要到这一级
然后我们再运行NameNode启动程序,终于成功了。
通过上面不断的报错和解决问题,终于完成了hadoop在docker的部署。
当我们下一次想要启动时
docker exec -it hadoop /bin/bash
/usr/sbin/sshd
/opt/hadoop-2.7.4/sbin/start-dfs.sh
这里给出core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- Hadoop 文件系统的默认URI -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
<!-- 临时目录配置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop</value>
</property>
<!-- 设置MapReduce的默认实现 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 客户端的超时设置 -->
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>
</configuration>
和hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.servicerpc-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.http-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.namenode.https-bind-host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>localhost:8020</value>
</property>
</configuration>

浙公网安备 33010602011771号