листинг листает искры не удается, файл не существует - PullRequest
1 голос
/ 29 января 2020

После недавнего обновления до HDP 3.1, теперь использующего spark 2.3.x вместо 2.2.x, запрос типа:

spark.sql("SELECT * from mydb.mytable").filter('partition_date between "202001010000" and "202001020000").write.parquet("foo.out")

иногда завершается неудачно при чтении из таблицы кустов с поддержкой HDFS (нет хранилища объектов ). Вы должны знать, что базовые данные (ВНЕШНЯЯ таблица в Hive) имеют период хранения данных, и любые данные, которые старше этой даты, будут удалены. Иногда это удаление может происходить во время выполнения вышеупомянутого запроса. Удаление происходит каждые 5 минут.

Даже если:

PartitionFilters: [isnotnull(partition_date#3099), (partition_date#3099 >= 202001010000), (partition_date#3099 <= 202001020000)]

фильтрация разделов (предикатное нажатие), кажется, включена больше, чем желаемые разделы читаются во время начального обхода пути. После обновления до 2.3 Spark отображает в пользовательском интерфейсе ход создания списка файловых каталогов. Интересно, что мы всегда получаем две записи. Один для самого старого доступного каталога и один для нижней из двух интересующих границ:

Listing leaf files and directories for 380 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date==202001010000/sub_part=0, ...

Listing leaf files and directories for 7100 paths:
/path/to/files/on/hdfs/mydb.db/mytable/partition_date=201912301300/sub_part=0, ...

Примечание:

  • зарегистрированное количество файлов (308, 7100) оба кажется, не отражают то, что ручная проверка предложила бы
  • задание (иногда) не выполняется во время рекурсивного листинга листовых файлов
  • сообщение об ошибке:

    Файл не существует. перечислять только каталоги в желаемом интервале, а не за его пределами и потенциально конфликтовать с максимальной продолжительностью хранения данных?

    Похоже, что это связано:

Ответы [ 2 ]

1 голос
/ 30 января 2020

@ meniluca верен в том смысле, что должно быть несоответствие с тем, что доступно в HDFS, а метастационарное хранилище сообщает о том, что должно быть доступно.

Однако вместо использования представлений, которые выглядят немного жуткими / непросто понять (в контексте путей к файлам, включаемых в операцию чтения), я предпочитаю:

spark.read.option("basePath", "/path/to/mydb.db/mytable").orc("/path/to/mydb.db/mytable/partition_date=202001[1-2]*/*", "/path/to/mydb.db/mytable/partition_date=202001[3-4]*/*")

это заставляет spark перечислять правильные (нужные пути)

0 голосов
/ 29 января 2020

Вы пробовали с этим ?

spark.sql("MSCK REPAIR TABLE table_name")

это спасло мне жизнь много раз.

Редактировать.

После обсуждения в комментарии, пожалуйста, попробуйте создать представление. Проблема не может быть решена, если вы не запустите «select * from ...» сразу после удаления раздела.

Создание представления предоставит вам такой обходной путь:

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT * FROM mytable;

из Hive / LanguageManual + DDL

Затем замените таблицу вашим представлением. Если у вас нет права на создание такого представления, попросите администратора сделать это за вас. Они должны удовлетворить эту просьбу, так как кажется, что вы пытаетесь решить их проблему IMO.

...