Hadoop Spark docker swarm,其中pyspark提供BlockMissingException但文件很好

时间:2018-11-18 10:04:08

标签: docker apache-spark hadoop pyspark docker-swarm

基于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行

任何能提供线索的人都会寻找什么?

2 个答案:

答案 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