Докер Hadoop Spark, где pyspark выдает исключение BlockMissingException, но файл в порядке - PullRequest
0 голосов
/ 18 ноября 2018

На основе https://github.com/gotthardsen/docker-hadoop-spark-workbench/tree/master/swarm У меня есть настройка Docker Swarm с настройками Hadoop, Spark, Hue и Jupyter для ноутбука.

Используя Hue, я загрузил файл в hdfs, и у меня нет проблем с загрузкой или просмотром файла из hue или в hdfs в namenode. Отсутствуют пропущенные блоки и проверка файлов говорит, что все в порядке.

Но когда я пытаюсь получить к нему доступ, используя pyspark в jupyter, я получаю:

org.apache.hadoop.hdfs.BlockMissingException: Не удалось получить блок: BP-296583215-10.0.0.6-1542473394293: blk_1073741833_1009 Файл = / 20170930.csv

Я знаю, что дело не в пропущенном блоке, а скорее в чем-то другом. Но я не могу понять, почему. Код Python кода из рабочей книги с использованием ядра Python2:

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 ]

0 голосов
/ 31 марта 2019

Дело в том, что мы не можем публиковать порты, если мы используем endpoint-mode = dnsrr (и мы должны использовать dnsrr, иначе у Hadoop возникнут некоторые проблемы).

Итак, чтобы выставить порты, мыможет запустить другой контейнер для публикации портов и маршрутизации трафика на узлы HDFS.Одним из доступных инструментов является socat.

Конечно, вам все еще нужно установить хосты на этом узле.

см. https://blog.newnius.com/setup-distributed-hadoop-cluster-with-docker-step-by-step.html

0 голосов
/ 18 ноября 2018

Поскольку контейнеры Docker эфемерны, возможно, контейнер датододы умер, и, следовательно, данные внутри него, но наменод все еще знает, что файл раньше существовал.

Я не знаю о правилах привязки узлов в Swarm, но вы должны попытаться добавить монтирования томов в контейнеры namenode и datanode, а также убедиться, что они могут быть запланированы только на одной машине (при условии, что у вас большечем один, так как вы используете Swarm, а не просто Compose)

Возможно, то же самое, но я сделал свой собственный Docker Compose с Hue, Juptyer, NameNode и Datanode, и я сделалпроверить это с PySpark

...