Разница между внутренними таблицами Hive и внешними таблицами?

110

Может ли кто-нибудь сказать мне разницу между внешней таблицей Hive и внутренними таблицами. Я знаю, что разница наступает, когда вы бросаете стол. Я не понимаю, что вы имеете в виду, говоря, что данные и метаданные удаляются во внутренних таблицах, а во внешних таблицах удаляются только метаданные. Кто-нибудь может объяснить мне, пожалуйста, узлы.

ДрюРоуз
источник

Ответы:

118

У Hive есть реляционная база данных на главном узле, которую он использует для отслеживания состояния. Например, когда выCREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/'; , эта схема таблицы хранится в базе данных.

Если у вас многораздельная таблица, разделы хранятся в базе данных (это позволяет улью использовать списки разделов, не обращаясь к файловой системе и не находя их, и т. Д.). Такие вещи являются «метаданными».

Когда вы удаляете внутреннюю таблицу, она удаляет данные, а также метаданные.

Когда вы удаляете внешнюю таблицу, она удаляет только метаданные. Это означает, что теперь улей не знает этих данных. Сами данные не трогает.

prestomation
источник
хорошо .. например, я создал внешнюю таблицу .. и я отбрасываю ее. что случается? что значит данные не тронуты? если я выберу * эту таблицу, будет ли она отображаться? я не могу представить разницу.
DrewRose
11
Если вы отбрасываете таблицу, Hive возвращает состояние, в котором он находился до того, как вы сбросили таблицу. если вы запустите запрос 'select * from foo' после того, как сбросите foo, hive сообщит вам, что таблица не существует. Это потому, что вы сказали улью забыть об этой таблице. Данные все еще существуют в той файловой системе, в которой они были раньше. Думайте о метаданных как о «указателе» на то, где находятся данные.
предварительная установка
1
Итак, вы говорите, есть ли у меня данные в расположении opt / nancy / foo.txt, и я загружаю их во внешнюю таблицу и отбрасываю, метаданные теряются, но данные в этом месте opt / nancy / foo.txt остаются?
DrewRose
Хорошо, теперь это место в HDFS или в моей локальной системе? Если он находится в локальной системе, когда я загружаю данные во внутреннюю таблицу и отбрасываю таблицу, файл foo.txt все равно останется в этом месте. я прав до сих пор?
DrewRose
3
Таблицы Hive находятся в поддерживаемой файловой системе (Hbase, HDFS, S3 и т. Д.). Я предполагаю, что вы используете «ЗАГРУЗИТЬ ДАННЫЕ» для загрузки данных из локального файла в таблицу куста? В этом случае вы копируете локальный файл в таблицу куста. Когда вы отбрасываете эту таблицу, копия данных во внутренней таблице будет удалена, но исходный файл из команды «ЗАГРУЗИТЬ ДАННЫЕ» останется нетронутым.
prestomation
102

Таблицы улья могут быть ВНЕШНИМИ или ВНУТРЕННИМИ. Это выбор, который влияет на то, как данные загружаются, контролируются и управляются.

Используйте ВНЕШНИЕ таблицы, когда:

  1. Данные также используются за пределами Hive. Например, файлы данных читаются и обрабатываются существующей программой, которая не блокирует файлы.
  2. Данные должны оставаться в базовом расположении даже после DROP TABLE. Это может применяться, если вы указываете несколько схем (таблиц или представлений) на один набор данных или повторяете различные возможные схемы.
  3. Вы хотите использовать настраиваемое местоположение, например ASV.
  4. Hive не должен владеть данными и настройками управления, каталогами и т. Д., У вас есть другая программа или процесс, которые будут делать эти вещи.
  5. Вы не создаете таблицу на основе существующей таблицы (КАК ВЫБРАТЬ).

Используйте ВНУТРЕННИЕ таблицы, когда:

Данные временные.

Вы хотите, чтобы Hive полностью управлял жизненным циклом таблицы и данных.

Света
источник
2
Предоставлено blogs.msdn.microsoft.com/cindygross/2013/02/05/…
Аноним,
будет ли создание ВНУТРЕННЕЙ таблицы удалять данные из HDFS, или она делает копию и использует исключительно для куста, оставляя исходный (HDFS) нетронутым?
luckyluke
@swetha Привет, я пришел сюда, потому что я полностью удалил metastore.db, но данные остались на hdfs. Поэтому, когда я показываю таблицы, ничего не отображается. Есть ли способ воссоздать метаданные?
awadhesh14 04
47

Чтобы ответить на ваш вопрос:

Для внешних таблиц Hive хранит данные в МЕСТЕ, указанном при создании таблицы (обычно не в каталоге хранилища). Если внешняя таблица удаляется, то удаляются метаданные таблицы, но не данные.

Для внутренних таблиц Hive хранит данные в своем каталоге хранилища. Если таблица будет удалена, будут удалены и метаданные таблицы, и данные.


Для справки,

Разница между внутренними и внешними таблицами:

Для внешних таблиц -

  • Внешняя таблица хранит файлы на сервере HDFS, но таблицы не связаны с исходным файлом полностью.

  • Если вы удалите внешнюю таблицу, файл все равно останется на сервере HDFS.

    Например, если вы создаете внешнюю таблицу с именем «table_test» в HIVE с помощью HIVE-QL и связываете таблицу с файлом «file» , то удаление table_test из HIVE не приведет к удалению «file» из HDFS .

  • Файлы внешних таблиц доступны всем, у кого есть доступ к файловой структуре HDFS, поэтому безопасность необходимо контролировать на уровне файлов / папок HDFS.

  • Метаданные хранятся на главном узле, и при удалении внешней таблицы из HIVE удаляются только метаданные, а не данные / файл.


Для внутренних таблиц-

  • Хранятся в каталоге на основе настроек hive.metastore.warehouse.dir, по умолчанию внутренние таблицы хранятся в следующем каталоге «/ user / hive / inventory», вы можете изменить его, обновив местоположение в файле конфигурации.
  • При удалении таблицы удаляются метаданные и данные с главного узла и HDFS соответственно.
  • Безопасность внутренних файлов таблиц контролируется исключительно через HIVE. Безопасность необходимо контролировать в рамках HIVE, возможно, на уровне схемы (зависит от организации).

У Hive могут быть внутренние или внешние таблицы, это выбор, который влияет на то, как данные загружаются, контролируются и управляются.

Используйте ВНЕШНИЕ таблицы, когда:

  • Данные также используется вне улья . Например, файлы данных читаются и обрабатываются существующей программой, которая не блокирует файлы.
  • Данные должны оставаться в базовом расположении даже после DROP TABLE. Это может применяться, если вы указываете несколько схем (таблиц или представлений) на один набор данных или повторяете различные возможные схемы.
  • Hive не должен владеть данными и параметрами управления, каталогами и т . Д., У вас может быть другая программа или процесс, который будет делать эти вещи.
  • Вы не создаете таблицу на основе существующей таблицы (КАК ВЫБРАТЬ).

Используйте ВНУТРЕННИЕ таблицы, когда:

  • Данные временно .
  • Вы хотите, чтобы Hive полностью управлял жизненным циклом таблицы и данных .

Источник :

HDInsight: внутренние и внешние таблицы Hive, введение

Внутренние и внешние таблицы в Hadoop-HIVE

Ани Менон
источник
1
@CapturedTree Но ответ неверный. «Hive перемещает данные в свой каталог хранилища» - это совершенно неверно, это не так. Данные хранятся в месте таблицы. Не имеет значения внешний или управляемый.
leftjoin
6

Данные внутренней таблицы хранятся в папке хранилища, тогда как данные внешней таблицы хранятся в месте, указанном вами при создании таблицы.

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

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

Hadoop Learner
источник
4

Единственная разница в поведении (не предполагаемое использование), основанная на моих ограниченных исследованиях и тестировании (с использованием Hive 1.1.0 -cdh5.12.0), похоже, заключается в том, что при удалении таблицы

  • данные внутренних (управляемых) таблиц удаляются из файловой системы HDFS
  • в то время как данные внешних таблиц НЕ удаляются из файловой системы HDFS.

(ПРИМЕЧАНИЕ. См. Раздел «Управляемые и внешние таблицы» в https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL, в котором перечислены некоторые другие различия, которые я не полностью понял)

Я считаю, что Hive выбирает место, где ему нужно создать таблицу, на основе следующего приоритета сверху вниз

  1. Местоположение определено во время создания таблицы
  2. Местоположение определено в Создании базы данных / схемы, в которой создается таблица.
  3. Каталог хранилища Hive по умолчанию (свойство hive.metastore.warehouse.dir в hive.site.xml)

Когда параметр «Местоположение» не используется во время «создания таблицы куста», используется указанное выше правило приоритета. Это применимо как для внутренних, так и для внешних таблиц. Это означает, что внутренняя таблица не обязательно должна находиться в каталоге хранилища и может располагаться где-нибудь еще.

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

  1. Создание таблицы с опцией Location и без нее
  2. Создание таблицы с опцией разделения и без нее
  3. Добавление новых данных с помощью операторов Hive Load и Insert
  4. Добавление файлов данных в расположение таблицы вне Hive (с помощью команд HDFS) и обновление таблицы с помощью команды «MSCK REPAIR TABLE»
  5. Удаление столов
НаллаАнанд
источник
хорошее исследование. Это единственный ответ, объясняющий, как hive обрабатывает опцию местоположения для внутренней и внешней таблицы.
d2207197 08
3

Во внешних таблицах, если вы отбрасываете его, удаляется только схема таблицы, данные таблицы существуют в физическом месте. Итак, чтобы удалить данные, используйте hadoop fs - rmr tablename. Управляемый куст таблиц будет иметь полный контроль над таблицами. Во внешних таблицах пользователи будут контролировать это.

Аджайкумар
источник
Я сталкиваюсь с ситуацией, когда каталог не всегда удаляется после DROP TABLE во внутренней таблице, созданной с помощью CREATE TABLE foo (id INT). Метаданные, по-видимому, в порядке, потому что SHOW TABLES согласован - таблица не появляется в этом списке после удаления. Как ни странно, я иногда замечал, что каталог / is / удаляется, но я не могу постоянно его воссоздавать. Любые идеи?
Мэтью Корнелл,
Проверены ли разрешения таблиц? Возможно, вы сменили владельца местоположения в HDFS на другого пользователя.
Милинд Джиндал
1

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

Мутху Паланиаппан
источник
1

Преимущество внешней таблицы-улья заключается в том, что она не удаляет файлы, когда мы удаляем таблицы, мы можем установить форматы строк с различными настройками, такими как serde .... с разделителями.

пользователь3485352
источник
1

Также имейте в виду, что Hive - это хранилище больших данных. Когда вы хотите удалить таблицу, вы не хотите терять гигабайты или терабайты данных. Создание, перемещение и копирование данных в таком масштабе может занять много времени. Когда вы отбрасываете «управляемый» куст таблицы, он также удаляет свои данные. Когда вы удаляете «внешнюю» таблицу, удаляется только определение схемы из мета-хранилища улья. Данные о hdfs все еще остаются.

Урвишсин Махида
источник
1

Рассмотрим этот сценарий, который лучше всего подходит для внешней таблицы:

Задание MapReduce (MR) фильтрует огромный файл журнала для вывода nвспомогательных файлов журнала (например, каждый вспомогательный файл журнала содержит журнал определенного типа), а выходные данные, то есть nвспомогательные файлы журнала, хранятся в hdfs.

Эти файлы журналов должны быть загружены в таблицы Hive для выполнения дальнейшей аналитики, в этом сценарии я бы рекомендовал внешние таблицы, потому что фактические файлы журналов создаются и принадлежат внешнему процессу, то есть заданию MR, кроме того, вы можете избежать дополнительный шаг загрузки каждого сгенерированного файла журнала в соответствующую таблицу Hive.

Суреш Вадали
источник
1

Наилучший вариант использования внешней таблицы в улье - это когда вы хотите создать таблицу из файла CSV или текста.

анубхав
источник
0

hive хранит только метаданные в хранилище метаданных, а исходные данные - вне улья, когда мы используем внешнюю таблицу, мы можем указать местоположение '', поэтому наши исходные данные не будут влиять, когда мы отбрасываем таблицу

user5080458
источник
0

Если в HDFS уже есть данные, можно создать внешнюю таблицу Hive для описания данных. Он называется ВНЕШНИМ, потому что данные во внешней таблице указаны в свойствах LOCATION вместо каталога хранилища по умолчанию.

При хранении данных во внутренних таблицах Hive полностью управляет жизненным циклом таблицы и данных. Это означает, что данные удаляются после удаления внутренней таблицы. Если внешняя таблица удаляется, метаданные таблицы удаляются, но данные сохраняются. В большинстве случаев рекомендуется использовать внешнюю таблицу, чтобы избежать ошибочного удаления данных вместе с таблицами.

Саят Сатыбальд
источник
0

Для управляемых таблиц Hive контролирует жизненный цикл своих данных. Hive хранит данные для управляемых таблиц в подкаталоге в каталоге, определенном по умолчанию hive.metastore.warehouse.dir.

Когда мы удаляем управляемую таблицу, Hive удаляет данные из нее, но управляемые таблицы менее удобны для совместного использования с другими инструментами. Например, предположим, что у нас есть данные, которые создаются и используются в основном Pig, но мы хотим выполнить некоторые запросы к ним, но не передавать Hive право владения данными.

В это время определяется внешняя таблица, которая указывает на эти данные, но не принимает на себя ответственность за них.

Анкит Нандвал
источник
0

ВНУТРЕННИЙ : таблица создается первой, а данные загружаются позже.

ВНЕШНИЙ : Данные в настоящее время и таблица будет создана поверх него.

Прасад L
источник
0

В Hive мы также можем создать внешнюю таблицу. Он сообщает Hive о необходимости ссылаться на данные, которые находятся в существующем месте за пределами каталога хранилища. Удаление внешних таблиц приведет к удалению метаданных, но не данных.

Харсимранджит Сингх Клер
источник
0

Я хотел бы добавить это

  1. Внутренние таблицы используются, когда необходимо обновить данные или удалить некоторые строки, потому что свойства ACID могут поддерживаться во внутренних таблицах, но свойства ACID не могут поддерживаться во внешних таблицах.
  2. Убедитесь, что есть резервная копия данных во внутренней таблице, потому что при удалении внутренней таблицы данные также будут потеряны.
джатин
источник
-2

Проще говоря, есть две вещи:

Hive может управлять вещами на складе, т.е. не удаляет данные со склада. Когда мы удаляем таблицу:

1) Для внутренних таблиц данные обрабатываются внутри хранилища. Так будет удален.

2) Для внешних таблиц данные управляются вечно из хранилища. Таким образом, его нельзя удалить, и клиенты, кроме улья, также могут его использовать.

Сону
источник