Різниця між внутрішніми таблицями вуликів від зовнішніх таблиць?


110

Хто-небудь може сказати мені різницю між зовнішньою та внутрішньою таблицями Hive. Я знаю, що різниця виникає при опусканні столу. Я не розумію, що ви маєте на увазі під тим, що дані та метадані видаляються у внутрішніх, а лише метадані видаляються у зовнішніх таблицях. Хто-небудь може мені пояснити з точки зору вузлів.

Відповіді:


117

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

Якщо у вас є розділена таблиця, розділи зберігаються в базі даних (це дозволяє вулику використовувати списки розділів без відвідування файлової системи та їх пошуку тощо). Такі речі - це "метадані".

Коли ви опускаєте внутрішню таблицю, вона скидає дані, а також метадані.

Коли ви скидаєте зовнішню таблицю, вона скидає лише метадані. Це означає, що вулик зараз не знає цих даних. Це не торкається самих даних.


Ок .. наприклад, я створив зовнішню таблицю .. і я її скидаю. Що станеться? що ви розумієте, під даними не чіпаєте? якщо я даю виділити * цієї таблиці, вона відображатиметься? я не в змозі зрозуміти різницю.
DrewRose

11
Якщо ви кинете стіл, Hive повертає стан, в якому він був, перш ніж ви скинули стіл. якщо ви запустите запит "select * from foo" після того, як ви скинете foo, вулик скаже вам, що таблиці не існує. Це тому, що ви сказали вулику забути про той стіл. Дані все ще існують у будь-якій файловій системі, в якій вона була раніше. Подумайте про метадані як на "вказівник" на те, де є дані.
престомація

1
Отже, ви повідомляєте, чи є у мене дані в розділі opt / nancy / foo.txt, і я завантажую їх у зовнішню таблицю та скидаю, метадані втрачаються, але дані в цьому місці opt / nancy / foo.txt залишаються?
DrewRose

Гаразд, зараз це місце у HDFS чи моїй локальній системі? Якщо він знаходиться в локальній системі, коли я завантажую дані у внутрішню таблицю і скидаю таблицю, файл foo.txt все ще залишиться в цьому місці. я правий поки що?
DrewRose

3
Таблиці вуликів знаходяться на підтримуваній файловій системі (Hbase, HDFS, S3 тощо). Я припускаю, що ви використовуєте "LOAD DATA" для завантаження даних з локального файлу в таблицю вулика? У цьому випадку ви копіюєте локальний файл у таблицю вулика. Коли ви скинете цю таблицю, копія даних у внутрішній таблиці буде видалена, але вихідний файл команди "LOAD DATA" все одно буде недоторканим.
престомація

100

Таблиці вуликів можуть бути створені як ЗОВНІШНІ або ВНУТРІШНІ. Це вибір, який впливає на завантаження, контроль та управління даними.

Використовуйте зовнішні таблиці, коли:

  1. Дані також використовуються поза вуликом. Наприклад, файли даних зчитуються та обробляються існуючою програмою, яка не блокує файли.
  2. Дані повинні залишатися в базовому розташуванні навіть після СТОЛІВ ДРОП. Це може застосовуватися, якщо ви вказуєте на декілька схем (таблиць або представлень) на одному наборі даних або якщо ви повторюєте різні можливі схеми.
  3. Ви хочете скористатися спеціальним розташуванням, таким як ASV.
  4. Вулик не повинен володіти налаштуваннями даних і контролю, грязями тощо, у вас є інша програма або процес, який буде робити ці речі.
  5. Ви не створюєте таблицю на основі існуючої таблиці (AS SELECT).

Використовуйте внутрішні таблиці, коли:

Дані є тимчасовими.

Ви хочете, щоб Hive повністю керував життєвим циклом таблиці та даними.



створить ВНУТРІШНУ таблицю видалення даних з HDFS або вона робить копію та використовує виключно для вулика, залишаючи джерело (HDFS) недоторканим?
luckyluke

@swetha Привіт, я прийшов сюди, тому що повністю видалив metastore.db, але дані залишаються на hdfs. Тож коли я показую таблиці, нічого не відображається. Чи є спосіб відтворити метадані?
awadhesh14

46

Щоб відповісти на Ваше запитання:

Для зовнішніх таблиць Hive зберігає дані у LOCATION, зазначених під час створення таблиці (як правило, не у каталозі складів). Якщо зовнішня таблиця випадає, метадані таблиці видаляються, але не дані.

Для внутрішніх таблиць Hive зберігає дані у своєму каталозі складів. Якщо таблиця випадає, і метадані таблиці, і дані будуть видалені.


Для довідки,

Різниця між внутрішніми та зовнішніми таблицями:

Для зовнішніх таблиць -

  • Зовнішня таблиця зберігає файли на сервері HDFS, але таблиці не пов'язані з вихідним файлом повністю.

  • Якщо ви видалите зовнішню таблицю, файл все ще залишається на сервері HDFS.

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

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

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


Для внутрішніх таблиць-

  • Зберігається в каталозі на основі налаштувань у hive.metastore.warehouse.dir, внутрішні таблиці за замовчуванням зберігаються в наступній папці «/ користувач / вулик / склад», ви можете змінити його, оновивши розташування в конфігураційному файлі.
  • Видалення таблиці видаляє метадані та дані відповідно з головного вузла та HDFS.
  • Захист внутрішніх файлів таблиці контролюється виключно через HIVE. Безпекою потрібно керувати в HIVE, ймовірно, на рівні схеми (залежить від організації).

У вулику можуть бути внутрішні чи зовнішні таблиці. Це вибір, який впливає на завантаження, контроль та управління даними.

Використовуйте зовнішні таблиці, коли:

  • Дані також використовується поза вуликом . Наприклад, файли даних зчитуються та обробляються існуючою програмою, яка не блокує файли.
  • Дані повинні залишатися в базовому розташуванні навіть після СТОЛІВ ДРОП. Це може застосовуватися, якщо ви вказуєте на декілька схем (таблиць або представлень) на один набір даних або якщо ви повторюєте різні можливі схеми.
  • У вулику не повинно бути власників даних та налаштувань управління, каталогів тощо . У вас може бути інша програма або процес, який буде виконувати ці дії.
  • Ви не створюєте таблицю на основі існуючої таблиці (AS SELECT).

Використовуйте внутрішні таблиці, коли:

  • Дані тимчасово .
  • Ви хочете, щоб Hive повністю керував життєвим циклом таблиці та даними .

Джерело:

HDInsight: вулик внутрішніх і зовнішніх таблиць, вступ

Внутрішні та зовнішні таблиці в Hadoop-HIVE


1
@CapptedTree Але відповідь не вірна. "Вулик переміщує дані у свій складський каталог". - Це абсолютно неправильно, це не так. Дані зберігаються у розташуванні таблиці. Не має значення зовнішніх чи керованих.
зліва приєднатися

6

Дані внутрішньої таблиці зберігаються у папці складу, тоді як дані зовнішньої таблиці зберігаються у тому місці, яке ви згадали у створенні таблиці.

Отже, коли ви видаляєте внутрішню таблицю, вона видаляє схему, а також дані в папці складу, але для зовнішньої таблиці це лише схема, яку ви втратите.

Отже, коли ви хочете знову повернути зовнішню таблицю, після видалення її можна знову створити таблицю з тією ж схемою і вказати її на вихідне місце розташування даних. Сподіваюся, це зрозуміло зараз.


4

Єдиною різницею в поведінці (а не за призначенням) на основі моїх поки що обмежених досліджень та тестувань (використовуючи вулик 1.1.0 -cdh5.12.0), здається, є те, що при падінні таблиці

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

(ПРИМІТКА. Див. Розділ "Керовані та зовнішні таблиці" на https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL, у якому перелічено деякі інші відмінності, які я не повністю зрозумів)

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

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

Коли параметр "Місце розташування" не використовується під час "створення таблиці вуликів", використовується вищевказане правило пріоритету. Це стосується як внутрішніх, так і зовнішніх таблиць. Це означає, що внутрішня таблиця не обов'язково повинна знаходитися в каталозі Склад і може розміщуватися деінде.

Примітка. Можливо, я пропустив деякі сценарії, але на основі мого обмеженого дослідження поведінка як внутрішньої, так і розширеної таблиці схоже, за винятком однієї різниці (видалення даних), описаної вище. Я спробував такі сценарії як для внутрішніх, так і для зовнішніх таблиць.

  1. Створення таблиці з опцією "Місце і без"
  2. Створення таблиці з опцією розділу та без неї
  3. Додавання нових даних за допомогою звітів про завантаження та вставлення вуликів
  4. Додавання файлів даних до місця Table поза Hive (за допомогою команд HDFS) та оновлення таблиці за допомогою команди "MSCK REPAIR TABLE"
  5. Відкидання таблиць

приємна розвідка. Це єдина відповідь, яка пояснює, що як вулик обробляє варіант розташування для внутрішнього та зовнішнього столу.
d2207197

3

У зовнішніх таблицях, якщо ви скинете її, вона видаляє лише схему таблиці, дані таблиці існують у фізичному розташуванні. Тому для видалення даних використовуйте табельну таблицю hadoop fs - rmr. Керований вуликовий стіл матиме повний контроль над столами. У зовнішніх таблицях користувачі матимуть контроль над нею.


Я стикаюся з ситуацією, коли каталог не завжди видаляється після DROP TABLE у внутрішній таблиці, створеній за допомогою CREATE TABLE foo (id INT). Метадані, мабуть, нормально, оскільки SHOW TABLES є послідовним - таблиця не відображається в цьому списку після її скидання. Блукаючи, я помічав dir / is / delete іноді, але не можу послідовно це відтворити. Якісь ідеї?
Меттью Корнелл

Чи перевірені дозволи таблиць? Можливо, ви змінили право власності на розташування на HDFS на іншого користувача.
Мілінд Джіндал

1

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


1

Зовнішня таблиця вуликів має переваги в тому, що вона не видаляє файли, коли ми скидаємо таблиці, ми можемо встановлювати формати рядків з різними налаштуваннями, як, наприклад, serde ....


1

Також пам’ятайте, що Hive - це великий склад даних. Коли ви хочете опустити таблицю, ви не хочете втрачати дані Гігабайт або Терабайт. Генерування, переміщення та копіювання даних у такому масштабі може зайняти багато часу. Якщо ви скинете таблицю "Керований", таблиця вуликів також видалить її дані. Якщо ви скинете таблицю "Зовнішня", вилучено лише визначення схеми з мета-магазину вулика. Дані про hdfs все ще залишаються.


1

Розглянемо цей сценарій, який найкраще підходить для зовнішньої таблиці:

Завдання MapReduce (MR) фільтрує величезний файл журналу, щоб виплюнути nфайли суб-журналу (наприклад, кожен файл під-журналу містить певний журнал типу повідомлень) та вихід, тобтоn файли підлогічного підлогічного файли, файли підлогічного журналу, зберігаються у hdfs.

Ці файли журналів потрібно завантажувати в таблиці Hive для подальшої аналітичної роботи. У цьому сценарії я рекомендую зовнішню таблицю (ів), оскільки фактичні файли журналів генеруються та належать зовнішньому процесу, тобто MR запису, крім того, ви можете уникнути додатковий крок завантаження кожного створеного файлу журналу у відповідну таблицю Hive.


1

Найкращий випадок використання зовнішньої таблиці у вулику - це коли ви хочете створити таблицю з файлу або CSV, або з тексту


0

вулик зберігає лише метадані в металосервісі та оригінальні дані у вулиці поза вуликом, коли ми використовуємо зовнішню таблицю, ми можемо дати розташування '' за допомогою цих наших оригінальних ефектів даних, коли ми скидаємо таблицю


0

Коли в HDFS вже є дані, для опису даних може бути створена зовнішня таблиця вуликів. Він називається ВНУТРІШНІМ, оскільки дані у зовнішній таблиці вказані у властивостях LOCATION замість каталогу складів за замовчуванням.

Зберігаючи дані у внутрішніх таблицях, Hive повністю керує життєвим циклом таблиці та даними. Це означає, що дані видаляються, коли внутрішня таблиця випадає. Якщо зовнішня таблиця випадає, метадані таблиці видаляються, але дані зберігаються. У більшості випадків зовнішню таблицю вважають за краще уникати видалення даних разом із таблицями помилково.


0

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

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

Тоді визначається зовнішня таблиця, яка вказує на ці дані, але не приймає на себе право власності на неї.


0

ВНУТРІШНЯ : Таблиця створена спочатку, а дані завантажуються пізніше

ЗОВНІШНІЙ : Дані в даний час і таблиця буде створена поверх нього.


0

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


0

Я хотів би додати це

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

-2

Простими словами, є дві речі:

Вулик може керувати речами на складі, тобто він не видаляє дані зі складу. Коли ми видаляємо таблицю:

1) Для внутрішніх таблиць даними управляються внутрішньо на складі. Так буде видалено.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.