Как обновить метаданные раздела в Hive, когда данные раздела вручную удаляются из HDFS

Каким образом можно автоматически обновлять метаданные разделенных таблиц Hive?

Если в HDFS были добавлены новые данные раздела (без изменения команды добавления таблицы разделов). то мы можем синхронизировать метаданные, выполнив команду "msck repair".

Что делать, если из HDFS было удалено много секционированных данных (без выполнения коммандного выполнения перетаскивания перетаскиваемой таблицы).

Каким образом можно синхронизировать метаданные улья?

Ответ 1

РЕДАКТИРОВАТЬ: Начиная с Hive 3.0.0 MSCK теперь может обнаруживать новые разделы или удалять отсутствующие разделы (или оба), используя следующий синтаксис:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]

Это было реализовано в HIVE-17824


Как правильно заявил HakkiBuyukcengiz, MSCK MSCK REPAIR не удаляет разделы, если соответствующая папка в HDFS была удалена вручную, а добавляет только разделы, если создаются новые папки.

Выписка из официальной документации:

Другими словами, он добавит любые разделы, которые существуют в HDFS, но не находятся в metastore, в metastore.

Это то, что я обычно делаю при наличии external таблиц, если несколько папок с разделами удаляются вручную в HDFS и я хочу быстро обновить разделы:

  • Удалить таблицу (DROP TABLE table_name) (удаление внешней таблицы не удаляет файлы базовых разделов)
  • Создайте заново таблицу (CREATE EXTERNAL TABLE table_name...)
  • Восстановите это (MSCK REPAIR TABLE table_name)

В зависимости от количества разделов это может занять много времени. Другое решение состоит в том, чтобы использовать ALTER TABLE DROP PARTITION (...) для каждой папки удаленных разделов, но это может быть утомительно, если было удалено несколько разделов.

Ответ 2

Попробуйте использовать

MSCK REPAIR TABLE <tablename>;

Ответ 3

Убедитесь, что таблица настроена на внешний, отбросьте все разделы и запустите ремонт таблицы:

alter table mytable_name set TBLPROPERTIES('EXTERNAL'='TRUE')
alter table mytable_name drop if exists partition ('mypart_name' <> 'null');
msck repair table mytable_name;


Если ремонт msck вызывает ошибку, то запустите куст с терминала как:
hive --hiveconf hive.msck.path.validation=ignore
или set hive.msck.path.validation=ignore;