基于https://github.com/gotthardsen/docker-hadoop-spark-workbench/tree/master/swarm,我有一个docker swarm设置,其中包含hadoop,spark,hue和jupyter笔记本设置。
使用Hue,我已将文件上传到hdfs,而从name节点上的hue或hdfs下载或查看文件也没有问题。没有丢失的块,文件检查说一切都很好。
但是当我尝试在jupyter中使用pyspark访问它时,我得到了:
org.apache.hadoop.hdfs.BlockMissingException:无法获取块: BP-296583215-10.0.0.6-1542473394293:blk_1073741833_1009 file = / 20170930.csv
我知道这不是关于丢失块的问题,而是更有可能的其他事情。但是我不知道为什么。使用python2内核的工作簿中的python代码为:
from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('hello').setMaster('spark://spark-master:7077')
sc = SparkContext(conf=conf)
from pyspark.sql import SparkSession
# Read from HDFS
sparkSession = SparkSession(sc)
df_load = sparkSession.read.csv('hdfs://namenode:9000/20170930.csv')
df_load.show()
问题出在:
df_load = sparkSession.read.csv('hdfs://namenode:9000/20170930.csv')
在不同的日志中看不到任何可以提供线索的信息。只有INFO行
任何能提供线索的人都会寻找什么?
答案 0 :(得分:1)
由于Docker容器是短暂的,因此datanode容器可能会死亡,因此其中的数据也将消失,但是namenode仍然知道该文件曾经存在。
我不知道Swarm中的节点相似性规则,但是您应该尝试将卷挂载添加到namenode和datanode容器,另外还要确保它们只能在单台机器上进行调度(假设您有多个,因为您使用的是Swarm而不是Compose)
可能是相同的,但是我已经用Hue,Juptyer,NameNode和Datanode制作了自己的Docker Compose,并使用PySpark进行了测试
答案 1 :(得分:0)
关键是,如果我们使用endpoint-mode = dnsrr(并且必须使用dnsrr,否则Hadoop将出现一些问题),我们将无法发布端口。
因此,要公开端口,我们可以启动另一个容器来发布端口并将流量路由到HDFS节点。一种可用的工具是socat。
当然,您仍然必须在该节点上设置主机。
请参阅https://blog.newnius.com/setup-distributed-hadoop-cluster-with-docker-step-by-step.html