首页 文章

从运行Spark的另一个Docker容器写入在Docker中运行的HDFS

提问于
浏览
0

我有一个用于spark jupyter的码头图像(https://github.com/zipfian/spark-install

我有另一个用于hadoop的码头图像 . (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中,我能够成功进入

  • 网页浏览器localhost:8088:并浏览Hadoop所有应用程序

  • localhost:50070:并浏览HDFS文件系统 .

enter image description here

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

所以我添加了额外的一行

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

我收到错误:

HDFS URI, no host: hdfs:///user/root/input/test

我错误地给出了hdfs路径吗?

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

谢谢你的时间 .

我还没有尝试过docker compose .

1 回答

  • 1

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

    例如,您可能已将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 参数的值)和端口,如上所述,它应该工作

相关问题