【问题标题】:Write to HDFS running in Docker from another Docker container running Spark从另一个运行 Spark 的 Docker 容器写入在 Docker 中运行的 HDFS
【发布时间】:2017-10-07 08:04:09
【问题描述】:

我有一个 spark + jupyter 的 docker 镜像 (https://github.com/zipfian/spark-install)

我有另一个用于 hadoop 的 docker 镜像。 (https://github.com/kiwenlau/hadoop-cluster-docker)

我在 Ubuntu 中运行来自上述 2 个映像的 2 个容器。 对于第一个容器: 我能够成功启动 jupyter 并运行 python 代码:

   import pyspark
   sc = pyspark.sparkcontext('local[*]')
   rdd = sc.parallelize(range(1000))
   rdd.takeSample(False,5)

对于第二个容器:

在宿主机Ubuntu OS中,我能够成功进入

  • web browser localhost:8088 : 并浏览 Hadoop 所有应用程序
  • localhost:50070: 并浏览 HDFS 文件系统。

现在我想从 jupyter(在第一个容器中运行)写入 HDFS 文件系统(在第二个容器中运行)。

所以我添加了附加行

rdd.saveAsTextFile("hdfs:///user/root/input/test")

我得到错误:

HDFS URI,无主机:hdfs:///user/root/input/test

我是否错误地提供了 hdfs 路径?

我的理解是,我应该能够从另一个运行 spark 的容器与一个运行 hdfs 的 docker 容器通信。我错过了什么吗?

感谢您的宝贵时间。

我还没试过 docker compose。

【问题讨论】:

    标签: hadoop apache-spark docker hdfs


    【解决方案1】:

    URI hdfs:///user/root/input/test 缺少权限(主机名)部分和端口。要在另一个容器中写入 hdfs,您需要完全指定 URI,并确保两个容器位于同一网络上,并且 HDFS 容器具有暴露名称节点和数据节点的端口。

    例如,您可能已将 HDFS 容器的主机名设置为 hdfs.container。然后,您可以使用 URI hdfs://hdfs.container:8020/user/root/input/test 写入该 HDFS 实例(假设 Namenode 在 8020 上运行)。当然,您还需要确保您要写入的路径也具有正确的权限。

    所以做你想做的事:

    • 确保您的 HDFS 容器暴露了 namenode 和 datanode 端口。您可以使用 dockerfile 中的 EXPOSE 指令(您链接的容器没有这些)或在调用 docker run 时使用 --expose 参数来执行此操作。默认端口为 8020 和 50010(分别用于 NN 和 DN)。
    • 在同一网络上启动容器。如果你只做docker run 而没有--network 他们将在默认网络上启动,你会没事的。使用 --name 参数以特定名称启动 HDFS 容器。
    • 现在修改您的 URI 以包含正确的权限(这将是您传递的 docker --name 参数的值)和如上所述的端口,它应该可以工作

    【讨论】:

    • 非常感谢 Ed。我在同一个网络(用户定义)中运行了两个容器。然后我能够使用 hdfs:///hadoop-master:9000/user/root/input/test 读取 hdfs 文件系统。 (hadoop-master 是容器的名称,docker img 中的 hdfs 端口是 9000 而不是 8020)。
    • 然而,我对另外两件事感到震惊:1)我无法从另一个容器写入 HDFS 目录 2)不确定在启动容器时我应该卷挂载 hadoop 容器中的哪个目录这样我就可以将更改持久保存到主机
    • for 1) 对于 hdfs 写入问题,您是否有错误要发布? 2)如果我没记错的话,默认的存储目录在 /var/lib/... (它可能是容器中唯一的东西)。
    • 再次感谢 Ed。 1)得到解决..是容器内的权限问题。 2)我感到困惑的是:在hdfs容器内,如果我使用命令hadoop fs touch、mkdir等创建hdfs目录或文件,实际数据保存在哪里?这就是我想在主机 ubuntu 机器上挂载的路径。我的理解不正确吗?
    • HDFS 有一个用于保存数据的路径的配置(实际上是几个)。您最可能感兴趣的是 dfs.datanode.data.dir 和 dfs.namenode.name.dir。您可能希望从 Ubuntu 挂载这些以跨会话保存数据。您可以在此处找到这些路径的默认值:hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多