基于https://github.com/gotthardsen/docker-hadoop-spark-workbench/tree/master/swarm 我有一个DockerSwarm设置与hadoop,spark,hue和一个jupyter笔记本设置。
我使用hue上传了一个文件到hdfs,从hue或者namenode上的hdfs下载或者查看文件没有问题。没有漏块,文件检查显示一切正常。
但当我尝试使用jupyter中的Pypark访问它时,我得到:
org.apache.hadoop.hdfs.blockmissingeexception:无法获取块:bp-296583215-10.0.0.6-15424733943:blk__1009file=/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')
在不同的日志里我看不到任何线索。只有信息行
有谁能给我一个线索去寻找什么?
2条答案
按热度按时间sr4lhrrt1#
关键是,如果我们使用endpoint mode=dnsrr,我们就不能发布端口(我们必须使用dnsrr,否则hadoop会有一些问题)。
为了暴露端口,我们可以启动另一个容器来发布端口,并将通信路由到hdfs节点。一个可用的工具是socat。
当然,您仍然需要设置该节点上的主机。
看到了吗https://blog.newnius.com/setup-distributed-hadoop-cluster-with-docker-step-by-step.html
iqih9akk2#
由于docker容器是短暂的,所以有可能datanode容器已死亡,因此其中的数据也已死亡,但namenode仍然知道该文件曾经存在。
我不知道swarm中的节点关联规则,但您应该尝试将卷装载添加到namenode和datanode容器中,并确保它们只能安排在单个计算机上(假设您有多台计算机,因为您使用的是swarm而不仅仅是compose)
可能是一样的,但我已经用hue、juptyer、namenode和datanode编写了自己的docker,并用pyspark进行了测试