我有一个用于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中,我能够成功转到
现在我想从jupyter(在第一个容器中运行)写入HDFS文件系统(在第二个容器中运行)。
所以我添加了额外的一行
rdd.saveAsTextFile("hdfs:///user/root/input/test")
我收到错误:
HDFS URI,无主机:hdfs:/// user / root / input / test
我是否错误地提供了hdfs路径?
我的理解是,我应该能够从另一个运行spark的容器中运行hdfs的docker容器。我错过了什么吗?
感谢您的时间。
我还没有尝试过docker compose。
答案 0 :(得分:2)
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上运行)。当然,您还需要确保您正在寻找的路径也具有正确的权限。
所以要做你想做的事:
EXPOSE
指令(您链接的容器没有这些)或在调用--expose
时使用docker run
参数来执行此操作。默认端口为8020和50010(分别用于NN和DN)。docker run
没有--network
,他们将从默认网络开始,您就可以了。使用--name
参数启动具有特定名称的HDFS容器。--name
参数的值)和端口,如上所述,它应该工作