Перекрыть основные данные паркета для таблицы Impala - PullRequest
3 голосов
/ 10 марта 2020

У меня есть стол Impala, подкрепленный паркетными файлами, который используется другой командой. Каждый день я запускаю пакетное задание Spark, которое перезаписывает существующие файлы паркета (создавая новый набор данных, существующие файлы будут удаляться и новые файлы будут создаваться)

Наш код Spark выглядит следующим образом

dataset.write.format("parquet").mode("overwrite").save(path)

Во время этого обновления (перезаписать файл данных паркета, а затем REFRESH таблица Impala), если кто-то получит доступ к таблице, он получит ошибку, сообщив, что базовые файлы данных отсутствуют.

Есть ли какое-либо решение или обходное решение для этой проблемы? Потому что я не хочу, чтобы другие команды видели ошибку в любой момент времени, когда они обращаются к таблице.

Может быть, я могу записать новые файлы данных в другое место, а затем настроить таблицу Impala на это местоположение?

1 Ответ

0 голосов
/ 11 марта 2020

Поведение, которое вы видите, связано с тем, как Импала предназначена для работы. Impala выбирает метаданные таблицы, такие как структура таблицы, сведения о разделах, пути к файлам HDFS из HMS и сведения о блоке соответствующих путей к файлам HDFS из NameNode. Все эти детали извлекаются из Каталога и будут распределяться по демонам Impala для их выполнения.

Когда основные файлы таблицы удаляются и новые файлы записываются вне Impala, необходимо выполнить REFRE SH, чтобы новые данные файла (такие как файлы и сведения о соответствующем блоке) были выбраны и распределены по демонам. Таким образом, Impala узнает о недавно написанных файлах.

Поскольку вы перезаписываете файлы, запросы Impala не смогут найти файлы, о которых она знает, поскольку они уже удалены, а новые файлы записываются. Это ожидаемое событие.

В качестве решения вы можете выполнить одно из следующих действий:

  1. Добавить новые файлы в тот же путь HDFS таблицы вместо перезаписи. Таким образом, запросы Impala, запущенные для таблицы, все равно будут возвращать результаты. Однако результатом будут только более старые данные (поскольку Impala еще не знает о новых файлах), но, как вы сказали, ошибки можно избежать во время перезаписи. После создания новых файлов в каталогах таблицы вы можете выполнить операцию HDFS, чтобы удалить файлы, а затем выполнить инструкцию Impala REFRE SH для этой таблицы.

ИЛИ

Как вы сказали, вы можете записать новые файлы паркета в другой путь HDFS, и после завершения записи вы можете [ удалить старые файлы, переместить новые файлы в фактический путь HDFS таблицы с последующим REFRE SH] ИЛИ [ Выполните инструкцию ALTER для таблицы, чтобы изменить расположение данных таблицы, указывающих на новый каталог ]. Если это ежедневный процесс, вам, возможно, придется реализовать его с помощью сценария, который запускается после успешного процесса записи, выполняемого Spark путем передачи каталогов (новых и старых каталогов) в качестве аргументов.

Надеюсь, это поможет!

...