2016-05-19 3 views
1

Допустим, у нас есть улей таблицу, хранящуюся на HDFS в каталоге, как это:Улей: что произойдет, если я удалю файл, который запрашивается в данный момент?

data/ 
|-- file1 
|-- file2 
|-- file3 

Что произойдет, если я начать длинный запрос через этот каталог, а затем удалить один из файлов?


я могу думать о 3-х сценариев:

  1. Дескрипторы файлов открыты в начале и данные не хранятся до конца запроса, даже если пути к файлам не доступны для новых запросов больше ,
  2. Hive запоминает пути к файлу и не выполняет запрос, если он не может найти удаленные файлы.
  3. Улей не запоминает пути к файлу и принимает только файлы, находящиеся в каталоге прямо сейчас.

Если улей ведет себя как (2), и это не безопасно удалять файлы при запросе, , что такое правильный способ сбросить старые данные из каталога выполняется запрос?

ответ

1

Как заявил @Shankarsh, улей пытается координировать свои запросы с помощью «блокировки» таблицы в metastore БД. Попробуйте запустить команду show locks ;, в то время как на другом сеансе выполняется длинный запрос SELECT или INSERT, а другой сеанс пытается добавить ALTER в таблицу (нужно подождать, пока она не сможет получить эксклюзивную блокировку), чтобы увидеть ее самостоятельно.

К сожалению, это не помешает прямому доступу HDFS к файлам и каталогам. AFAIK существует только один тип блокировки в HDFS, и это эксклюзивный замок, используемый для создания/добавления/усечения файла (или последнего блока в существующий файл).

Типичный сценарий: вы отправляете запрос; Hive извлекает список файлов и блоков файлов при запросе времени компиляции затем запускает некоторые считыватели из этих блоков; Тем временем другая работа требует удаление одного из файлов ==> один из картографов будет аварии с FileNotFoundException(я был там!)

Другой типичный сценарий: ... Тем временем другая работа создает новый файл или добавляет новый блок в существующий файл ==>, что данные никогда не будут доступны - и это не плохо.

В нижней строке: избегайте удаления файлов в каталоге HDFS, используемом таблицей Hive (независимо от того, управляется или не используется) , если только вы не можете проверить, что запрос не запущен в данный момент. Если вы хотите удалить все файлы за один раз, для управляемой таблицы используйте TRUNCATE на уровне таблицы/раздела и пусть Hive сделает грязную информацию о координации.

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

+0

... плюс любые данные INSERTed в betwen будут отправлены в limbo последним EXCHANGE (если только вы НЕ ВСТАВЛЯте его снова из таблицы temp в обычную таблицу сразу после этого). –

+0

Все необходимое для отличного ответа: ответ на конкретные вопросы и описание того, как преодолеть навязанные проблемы. Спасибо! – ffriend

0

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

Пожалуйста, посмотрите на этот пост, а также:

Hive Locks entire database when running select on one table

+0

Спасибо за ваш ответ. Однако я не собираюсь удалять данные из Hive, я считаю ** напрямую удалять файлы ** (например, используя 'hadoop fs -rm'). Таким образом, у улья не будет возможности заблокировать его или даже узнать об изменении. – ffriend

Смежные вопросы