Hadoop与docker一起运行;hdfs dfs-put“;错误

Hadoop与docker一起运行;hdfs dfs-put“;错误,docker,hadoop,hdfs,Docker,Hadoop,Hdfs,我有一个hadoop的docker镜像。(就我而言是这样) 我根据这个博客一步一步地做这项工作。我可以成功运行docker和Hadoop。但是,当我尝试在主机中放入一些文件来测试Hadoop中的字数测试时。当我跑的时候 root@hadoop-master:~# hdfs dfs -put /home/ke/code /input 它返回一个错误: put: `/home/ke/code': No such file or directory 但是这个目录实际上是存在的,因为我可以使用cd/

我有一个hadoop的docker镜像。(就我而言是这样) 我根据这个博客一步一步地做这项工作。我可以成功运行docker和Hadoop。但是,当我尝试在主机中放入一些文件来测试Hadoop中的字数测试时。当我跑的时候

root@hadoop-master:~# hdfs dfs -put /home/ke/code /input
它返回一个错误:

put: `/home/ke/code': No such file or directory

但是这个目录实际上是存在的,因为我可以使用
cd/home/ke/code
转到这个目录。

您需要了解的是,Hadoop实例运行的环境与主机环境完全不同。因此,当您运行下面的中提到的
sudo./start container.sh
命令时,理想情况下,您正在创建一个独立于主机操作系统(包含
/home/ke/code
下的文件)的新子系统。不幸的是,在这种情况下,Hadoop磁盘文件系统(HDFS)正在新创建的子系统(称为Docker容器)中运行,并且您希望传输的文件存在于其他地方(在主机操作系统中)

然而,有一个解决方案,你可能可以做,使它的工作

  • 通过以下方式编辑
    start container.sh
    :编辑负责启动hadoop主容器的行10-16:-

    sudo docker run -itd \
            -v /home/ke/:/mnt/ke/ \
            --net=hadoop \
            -p 50070:50070 \
            -p 8088:8088 \
            --name hadoop-master \
            --hostname hadoop-master \
            kiwenlau/hadoop:1.0 &> /dev/null
    
这里要注意的主要区别是
-v
开关,它将
/home/ke/
卷从主机系统装载到
/mnt/ke/
中的Docker容器

  • 使用相同的
    docker rm
    命令删除使用命令
    docker rm hadoop master
    创建的旧主容器以及名为
    hadoop-slave1
    的从容器,直到
    hadoop-slave3

  • 完成后,从第4步开始运行,如GitHub中所述。复制文件的命令现在实际上变成
    hdfs dfs-put/mnt/ke/code/input


谢谢!但最新命令“-v/home/ke/:/mnt/ke/\”的末尾应添加“\”。我还有一个问题,每次我想把一些文件从主机放到HDFS上,我都会编辑“start container.sh”,这很复杂。有没有其他方法可以让HDFS访问主机环境?您不必一直编辑
start container.sh
文件。您可以做的是在主机系统中创建一些临时目录,并将该目录装载到容器中。此单一目录可用于在想要HDFS的任何文件之间进行传输的单一目的,只需将需要复制的文件移动到此目录即可实现。一旦运行
start comtainer.sh
脚本,您实际上会输入主容器的提示。要退出,只需运行
exit
命令,该命令将引导您进入主机级提示符。使用命令
docker Stop
停止主容器和从容器,并以相同的方式使用
docker start
命令启动它们。要输入正在运行的主容器的提示,请使用命令
sudo docker exec-it hadoop master bash
。如果您了解更多关于如何处理docker容器的知识,这会更好,因为您正在使用容器在hadoop中运行作业。为了回答您提出的问题,不幸的是,如果不装载,就无法从容器文件系统访问主机文件系统,因此容器中的HDF只能通过您设置的装载目录访问主机环境。