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>

posted @ 2025-03-12 18:52  折翼的小鸟先生  阅读(440)  评论(0)    收藏  举报