从另一个运行spark的docker容器写入在docker中运行的hdfs

dxxyhpgq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(523)

我有spark+jupyter的docker图像(https://github.com/zipfian/spark-install)
我有另一个用于hadoop的docker映像(https://github.com/kiwenlau/hadoop-cluster-docker)
我在ubuntu中运行上面两张图片中的两个容器。对于第一个容器:我能够成功地启动jupyter并运行python代码:

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

对于第二个容器:
在主机ubuntu操作系统中,我能够成功地转到
web浏览器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作曲。

wh6knrhe

wh6knrhe1#

uri hdfs:///user/root/input/test 缺少授权(主机名)部分和端口。要在另一个容器中写入hdfs,您需要完全指定uri,并确保这两个容器位于同一网络上,并且hdfs容器公开了namenode和data node的端口。
例如,您可能已经将hdfs容器的主机名设置为 hdfs.container . 然后可以使用uri写入hdfs示例 hdfs://hdfs.container:8020/user/root/input/test (假设namenode在8020上运行)。当然,您还需要确保要写入的路径也具有正确的权限。
所以要做你想做的事:
确保hdfs容器公开了namenode和datanode端口。你可以使用 EXPOSE dockerfile中的指令(链接的容器没有这些指令)或使用 --expose 调用时的参数 docker run . 默认端口为8020和50010(分别用于nn和dn)。
启动同一网络上的容器。如果你这么做的话 docker run 没有 --network 他们会在默认网络上启动,你会没事的。使用 --name 争论。
现在修改uri以包含适当的权限(这将是docker的值) --name 参数)和端口,它应该可以工作

相关问题