我有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作曲。
1条答案
按热度按时间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
参数)和端口,它应该可以工作