Hadoop Spark docker 群,其中 pyspark 给出 BlockMissingException 但文件正常
Hadoop Spark docker swarm where pyspark gives BlockMissingException but file is fine
基于 https://github.com/gotthardsen/docker-hadoop-spark-workbench/tree/master/swarm,我有一个 docker swarm 设置,其中包含 hadoop、spark、hue 和 jupyter notebook 设置。
我使用 Hue 将文件上传到 hdfs,从 hue 或名称节点上的 hdfs 下载或查看文件没有问题。没有丢失的块,文件检查说一切都很好。
但是当我尝试在 jupyter 中使用 pyspark 访问它时,我得到一个:
org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block:
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')
我在不同的日志中看不到任何给我线索的信息。只有信息行
任何人都可以提供线索寻找什么?
由于Docker 容器是短暂的,因此数据节点容器可能已死亡,因此其中的数据也可能已死亡,但名称节点仍然知道该文件曾经存在。
我不知道 Swarm 中的节点亲和性规则,但你应该尝试将卷装载添加到名称节点和数据节点容器,并确保它们只能在单台机器上调度(假设你有超过一,因为您使用的是 Swarm 而不仅仅是 Compose)
可能是一样的,但我已经用 Hue、Juptyer、NameNode 和 Datanode 制作了自己的 Docker Compose,并且我确实用 PySpark 对其进行了测试
关键是如果我们使用 endpoint-mode=dnsrr 我们不能发布端口(我们必须使用 dnsrr 否则 Hadoop 会出现一些问题)。
所以为了公开端口,我们可以启动另一个容器来发布端口并将流量路由到 HDFS 节点。一种可用的工具是 socat。
当然,您仍然需要在该节点上设置主机。
见https://blog.newnius.com/setup-distributed-hadoop-cluster-with-docker-step-by-step.html
基于 https://github.com/gotthardsen/docker-hadoop-spark-workbench/tree/master/swarm,我有一个 docker swarm 设置,其中包含 hadoop、spark、hue 和 jupyter notebook 设置。
我使用 Hue 将文件上传到 hdfs,从 hue 或名称节点上的 hdfs 下载或查看文件没有问题。没有丢失的块,文件检查说一切都很好。
但是当我尝试在 jupyter 中使用 pyspark 访问它时,我得到一个:
org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: 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')
我在不同的日志中看不到任何给我线索的信息。只有信息行
任何人都可以提供线索寻找什么?
由于Docker 容器是短暂的,因此数据节点容器可能已死亡,因此其中的数据也可能已死亡,但名称节点仍然知道该文件曾经存在。
我不知道 Swarm 中的节点亲和性规则,但你应该尝试将卷装载添加到名称节点和数据节点容器,并确保它们只能在单台机器上调度(假设你有超过一,因为您使用的是 Swarm 而不仅仅是 Compose)
可能是一样的,但我已经用 Hue、Juptyer、NameNode 和 Datanode 制作了自己的 Docker Compose,并且我确实用 PySpark 对其进行了测试
关键是如果我们使用 endpoint-mode=dnsrr 我们不能发布端口(我们必须使用 dnsrr 否则 Hadoop 会出现一些问题)。
所以为了公开端口,我们可以启动另一个容器来发布端口并将流量路由到 HDFS 节点。一种可用的工具是 socat。
当然,您仍然需要在该节点上设置主机。
见https://blog.newnius.com/setup-distributed-hadoop-cluster-with-docker-step-by-step.html