Таблица обновлений внешнего куста и восстановление MSCK
У меня есть внешняя таблица улья, хранящаяся как паркет, разделенная на столбец as_of_dt
и данные вставляются с помощью искровой потоковой передачи. Теперь каждый день добавляется новый раздел. я делаю msck repair table
так что улей метастафа получает информацию о недавно добавленном разделе. Это единственный способ или есть лучший способ? Я обеспокоен, если нижестоящие пользователи, запрашивающие таблицу, msck repair
вызвать какие-либо проблемы с отсутствием данных или устаревших данных? Я проходил через HiveContext
API и посмотреть refreshTable
вариант. Любая идея, если это имеет смысл использовать refreshTable
вместо?
2 ответа
Чтобы напрямую ответить на ваш вопрос msck repair table, проверим, активны ли разделы для таблицы. Это означает, что если вы удалили несколько разделов и не хотите, чтобы они отображались в команде show partitions для таблицы, таблица восстановления msck должна их удалить. Восстановление Msck может занять больше времени, чем утверждение о недействительности или обновлении, однако метаданные Invalidate выполняются только в Hive, обновляя только Hive Metastore. Обновление выполняется только в Spark SQL и обновляет хранилище метаданных Spark.
Метасервис Hive может подойти, если вы выполняете этап добавления раздела где-то в процессе обработки, однако, если вы когда-нибудь захотите получить доступ к таблице кустов через Spark SQL, вам потребуется обновить метаданные через Spark (или Impala или другой процесс, который обновляет искру). метаданные).
Каждый раз, когда вы обновляете или изменяете содержимое таблицы улья, метасторное хранилище Spark может перестать синхронизироваться, что приведет к невозможности запроса данных через набор команд spark.sql. Это означает, что если вы хотите запросить эти данные, вам нужно синхронизировать метасторское хранилище Spark.
Если у вас есть версия Spark, которая допускает это, вы должны обновить и добавить разделы в таблицы Hive в Spark, чтобы все метастазы были синхронизированы. Вот как я это делаю:
//Non-Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation)
spark.sql("refresh table " + tableName)
//Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation + "/" + partition)
val addPartitionsStatement = "alter table" + tableName = " add if not exists partition(partitionKey='" + partition + "') location '" + fileLocation + "/" + partition + "'"
spark.sql(addPartitionsStatement)
spark.sql("refresh table " + tableName)
Похоже, что refreshTable обновляет кэшированные метаданные, не влияя на метаданные Hive.
Док говорит:
Сделайте недействительными и обновите все кэшированные метаданные данной таблицы. По соображениям производительности Spark SQL или используемая им библиотека внешних источников данных могут кэшировать определенные метаданные о таблице, например расположение блоков. Когда они изменяются вне Spark SQL, пользователи должны вызывать эту функцию для аннулирования кэша.
Метод не обновляет метаданные Hive, поэтому восстановление необходимо.