Jaka jest różnica między wewnętrznymi tabelami Hive a zewnętrznymi tabelami?

110

Czy ktoś może mi powiedzieć, jaka jest różnica między tabelą zewnętrzną Hive a tabelami wewnętrznymi. Wiem, że różnica pojawia się, gdy upuszczasz stół. Nie rozumiem, co masz na myśli, mówiąc, że dane i metadane są usuwane w wewnętrznych, a tylko metadane są usuwane z tabel zewnętrznych. Czy ktoś może mi wyjaśnić w zakresie węzłów?

DrewRose
źródło

Odpowiedzi:

118

Hive ma relacyjną bazę danych w węźle głównym, której używa do śledzenia stanu. Na przykład, gdy ty CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';, ten schemat tabeli jest przechowywany w bazie danych.

Jeśli masz tabelę partycjonowaną, partycje są przechowywane w bazie danych (pozwala to gałęzi na używanie list partycji bez wchodzenia do systemu plików i znajdowania ich itp.). Tego typu rzeczy to „metadane”.

Usunięcie tabeli wewnętrznej powoduje usunięcie danych, a także metadanych.

Usunięcie tabeli zewnętrznej powoduje jedynie usunięcie metadanych. Oznacza to, że hive nie zna teraz tych danych. Nie dotyka samych danych.

prestomation
źródło
ok .. na przykład utworzyłem tabelę zewnętrzną ... i upuszczam ją. co się dzieje? co masz na myśli mówiąc, że dane nie zostały dotknięte? jeśli podam opcję Select * tej tabeli, czy zostanie ona wyświetlona? nie jestem w stanie wyobrazić sobie różnicy.
DrewRose,
11
Jeśli usuniesz tabelę, Hive zwróci stan, w jakim znajdował się przed usunięciem tabeli. Jeśli po usunięciu foo uruchomisz zapytanie „select * from foo”, gałąź poinformuje, że tabela nie istnieje. Dzieje się tak, ponieważ kazałeś ulowi zapomnieć o tym stole. Dane nadal istnieją w jakimkolwiek systemie plików, w którym były wcześniej. Potraktuj metadane jako „wskaźnik” do miejsca, w którym znajdują się dane.
przedsmak
1
Więc mówisz, że jeśli mam dane w lokalizacji opt / nancy / foo.txt i ładuję je do zewnętrznej tabeli i upuszczam, metadane są tracone, ale dane w tej lokalizacji opt / nancy / foo.txt pozostają?
DrewRose,
OK, czy teraz jest to lokalizacja w HDFS czy w moim systemie lokalnym? Jeśli jest w systemie lokalnym, po załadowaniu danych do wewnętrznej tabeli i usunięciu tabeli plik foo.txt pozostanie w tej lokalizacji. czy mam rację do tej pory?
DrewRose
3
Tabele gałęzi znajdują się w obsługiwanym systemie plików (Hbase, HDFS, S3 itp.). Zakładam, że używasz „LOAD DATA” do ładowania danych z pliku lokalnego do tabeli gałęzi? W takim przypadku kopiujesz plik lokalny do tabeli gałęzi. Po usunięciu tej tabeli kopia danych w tabeli wewnętrznej zostanie usunięta, ale plik źródłowy z polecenia „LOAD DATA” pozostanie nienaruszony.
prestomowa
102

Tabele gałęzi można tworzyć jako ZEWNĘTRZNE lub WEWNĘTRZNE. Jest to wybór, który wpływa na sposób ładowania, kontrolowania i zarządzania danymi.

Użyj tabel EXTERNAL, gdy:

  1. Dane są również używane poza Hive. Na przykład pliki danych są odczytywane i przetwarzane przez istniejący program, który ich nie blokuje.
  2. Dane muszą pozostać w podstawowej lokalizacji nawet po DROP TABLE. Może to mieć zastosowanie, jeśli wskazujesz wiele schematów (tabel lub widoków) na pojedynczy zestaw danych lub jeśli wykonujesz iterację przez różne możliwe schematy.
  3. Chcesz użyć niestandardowej lokalizacji, takiej jak ASV.
  4. Hive nie powinien być właścicielem danych i ustawień kontrolnych, katalogów itp., Masz inny program lub proces, który będzie to robić.
  5. Nie tworzysz tabeli na podstawie istniejącej tabeli (JAK WYBIERZ).

Użyj tabel WEWNĘTRZNYCH, gdy:

Dane są tymczasowe.

Chcesz, aby Hive całkowicie zarządzał cyklem życia tabeli i danych.

swetha
źródło
2
Dzięki uprzejmości blogs.msdn.microsoft.com/cindygross/2013/02/05/…
Anonimowa osoba
czy utworzenie tabeli WEWNĘTRZNEJ usunie dane z HDFS lub zrobi kopię i będzie używać wyłącznie dla gałęzi, pozostawiając źródło (HDFS) nienaruszone?
luckyluke
@swetha Cześć, przyszedłem tutaj, ponieważ całkowicie usunąłem metastore.db, ale dane pozostają na hdfs. Więc kiedy pokazuję tabele, nic nie jest pokazywane. Czy istnieje sposób na odtworzenie metadanych?
awadhesh 14
47

Aby odpowiedzieć na pytanie:

W przypadku tabel zewnętrznych gałąź Hive przechowuje dane w LOKALIZACJI określonej podczas tworzenia tabeli (zazwyczaj nie w katalogu hurtowni). Jeśli tabela zewnętrzna zostanie usunięta, metadane tabeli zostaną usunięte, ale nie dane.

W przypadku tabel wewnętrznych Hive przechowuje dane w swoim katalogu magazynu. Jeśli tabela zostanie usunięta, zarówno metadane tabeli, jak i dane zostaną usunięte.


W celach informacyjnych,

Różnica między tabelami wewnętrznymi i zewnętrznymi:

W przypadku tabel zewnętrznych -

  • Zewnętrzna tabela przechowuje pliki na serwerze HDFS, ale tabele nie są w pełni połączone z plikiem źródłowym.

  • Jeśli usuniesz tabelę zewnętrzną, plik nadal pozostaje na serwerze HDFS.

    Na przykład, jeśli utworzysz zewnętrzną tabelę o nazwie „table_test” w HIVE za pomocą HIVE-QL i połączysz tabelę z plikiem „file” , to usunięcie „table_test” z HIVE nie spowoduje usunięcia „pliku” z HDFS .

  • Zewnętrzne pliki tabel są dostępne dla każdego, kto ma dostęp do struktury plików HDFS, dlatego zabezpieczeniami należy zarządzać na poziomie plików / folderów HDFS.

  • Metadane są przechowywane w węźle głównym, a usunięcie tabeli zewnętrznej z programu HIVE powoduje usunięcie tylko metadanych, a nie danych / pliku.


Do stołów wewnętrznych

  • Przechowywane w katalogu na podstawie ustawień w hive.metastore.warehouse.dir, domyślnie tabele wewnętrzne są przechowywane w następującym katalogu „/ user / hive / hurtownia” można to zmienić aktualizując lokalizację w pliku konfiguracyjnym.
  • Usunięcie tabeli powoduje usunięcie metadanych i danych odpowiednio z węzła głównego i HDFS.
  • Wewnętrzne bezpieczeństwo plików tabel jest kontrolowane wyłącznie przez HIVE. Bezpieczeństwo należy zarządzać w ramach HIVE, prawdopodobnie na poziomie schematu (w zależności od organizacji).

Hive może mieć tabele wewnętrzne lub zewnętrzne, jest to wybór wpływający na sposób ładowania, kontrolowania i zarządzania danymi.

Użyj tabel EXTERNAL, gdy:

  • Dane są również stosowane na zewnątrz ula . Na przykład pliki danych są odczytywane i przetwarzane przez istniejący program, który ich nie blokuje.
  • Dane muszą pozostać w podstawowej lokalizacji nawet po DROP TABLE.Może to mieć zastosowanie, jeśli wskazujesz wiele schematów (tabel lub widoków) na pojedynczy zestaw danych lub jeśli wykonujesz iterację przez różne możliwe schematy.
  • Hive nie powinien być właścicielem danych i ustawień kontrolnych, katalogów itp ., Możesz mieć inny program lub proces, który będzie wykonywał te czynności.
  • Nie tworzysz tabeli na podstawie istniejącej tabeli (JAK WYBIERZ).

Użyj tabel WEWNĘTRZNYCH, gdy:

  • Danych jest tymczasowy .
  • Chcesz, aby Hive w pełni zarządzał cyklem życia tabeli i danych .

Źródło :

HDInsight: wprowadzenie do tabel wewnętrznych i zewnętrznych gałęzi Hive

Stoły wewnętrzne i zewnętrzne w Hadoop-HIVE

Ani Menon
źródło
1
@CapturedTree Ale odpowiedź jest nieprawidłowa. „Hive przenosi dane do swojego katalogu hurtowni” - jest to całkowicie błędne, a nie. Dane są przechowywane w lokalizacji tabeli. Nie ma znaczenia zewnętrzne lub zarządzane.
leftjoin
6

Dane tabeli wewnętrznej są przechowywane w folderze hurtowni, natomiast dane tabeli zewnętrznej są przechowywane w miejscu, które wskazałeś podczas tworzenia tabeli.

Więc kiedy usuwasz wewnętrzną tabelę, usuwa ona zarówno schemat, jak i dane w folderze hurtowni, ale w przypadku tabeli zewnętrznej stracisz tylko schemat.

Jeśli więc po usunięciu chcesz odzyskać tabelę zewnętrzną, możesz ponownie utworzyć tabelę z tym samym schematem i wskazać pierwotną lokalizację danych. Mam nadzieję, że teraz jest jasne.

Hadoop Learner
źródło
4

Jedyna różnica w zachowaniu (nie zamierzonym użyciu) oparta na moich ograniczonych badaniach i testach do tej pory (przy użyciu Hive 1.1.0 -cdh5.12.0) wydaje się polegać na tym, że po upuszczeniu tabeli

  • dane tabel wewnętrznych (zarządzanych) są usuwane z systemu plików HDFS
  • podczas gdy dane tabel zewnętrznych NIE są usuwane z systemu plików HDFS.

(UWAGA: patrz sekcja „Tabele zarządzane i zewnętrzne” w https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL, w której wymieniono inne różnice, których nie do końca rozumiem)

Uważam, że Hive wybiera lokalizację, w której musi utworzyć tabelę, na podstawie następującego pierwszeństwa od góry do dołu

  1. Lokalizacja zdefiniowana podczas tworzenia tabeli
  2. Lokalizacja zdefiniowana w tworzeniu bazy danych / schematu, w której tworzona jest tabela.
  3. Domyślny katalog magazynu Hive (Property hive.metastore.warehouse.dir in hive.site.xml)

Jeśli opcja „Lokalizacja” nie jest używana podczas „tworzenia tabeli gałęzi”, stosowana jest powyższa reguła pierwszeństwa. Dotyczy to zarówno tabel wewnętrznych, jak i zewnętrznych. Oznacza to, że tabela wewnętrzna niekoniecznie musi znajdować się w katalogu magazynu i może znajdować się w dowolnym innym miejscu.

Uwaga: mogłem przegapić niektóre scenariusze, ale w oparciu o moją ograniczoną eksplorację, zachowanie zarówno tabeli wewnętrznej, jak i zewnętrznej wydaje się być takie samo, z wyjątkiem jednej różnicy (usuwanie danych) opisanej powyżej. Wypróbowałem następujące scenariusze zarówno dla tabel wewnętrznych, jak i zewnętrznych.

  1. Tworzenie tabeli z opcją lokalizacji i bez niej
  2. Tworzenie tabeli z opcją partycji i bez niej
  3. Dodawanie nowych danych za pomocą instrukcji Hive Load i Insert
  4. Dodawanie plików danych do lokalizacji tabeli poza Hive (za pomocą poleceń HDFS) i odświeżanie tabeli za pomocą polecenia „MSCK REPAIR TABLE
  5. Upuszczanie stołów
NallaAnand
źródło
niezła eksploracja. To jedyna odpowiedź, która wyjaśniła, jak gałąź obsługuje opcję lokalizacji tabeli wewnętrznej i zewnętrznej.
d2207197
3

W tabelach zewnętrznych, jeśli go upuścisz, usunie tylko schemat tabeli, dane tabeli istnieją w fizycznej lokalizacji. Aby usunąć dane, użyj hadoop fs - rmr tablename. Zarządzana gałąź tabeli będzie mieć pełną kontrolę nad tabelami. W zewnętrznych tabelach użytkownicy będą mieli nad tym kontrolę.

Ajaykumar
źródło
Mam do czynienia z sytuacją, w której katalog nie zawsze jest usuwany po DROP TABLE w tabeli wewnętrznej utworzonej za pomocą CREATE TABLE foo (id INT). Metadane są najwyraźniej w porządku, ponieważ SHOW TABLES jest spójne - tabela nie pojawia się na tej liście po jej usunięciu. Myląco, czasami zauważyłem katalog / jest / usunięty, ale nie mogę tego konsekwentnie odtworzyć. Jakieś pomysły?
Matthew Cornell
Czy uprawnienia do tabel są sprawdzane? Być może zmieniłeś własność lokalizacji w HDFS na innego użytkownika.
Milind Jindal,
1

Tabele wewnętrzne są przydatne, jeśli chcesz, aby Hive zarządzał całym cyklem życia danych, w tym ich usuwaniem, podczas gdy tabele zewnętrzne są przydatne, gdy pliki są używane poza programem Hive.

Muthu Palaniappan
źródło
1

Zewnętrzna tabela gałęzi ma zalety polegające na tym, że nie usuwa plików, gdy usuwamy tabele, możemy ustawić formaty wierszy z różnymi ustawieniami, takimi jak serde .... delimited

user3485352
źródło
1

Należy również pamiętać, że Hive to hurtownia dużych zbiorów danych. Gdy chcesz upuścić tabelę, nie chcesz stracić gigabajtów lub terabajtów danych. Generowanie, przenoszenie i kopiowanie danych na taką skalę może być czasochłonne. Po upuszczeniu gałęzi tabeli „Zarządzana” również dane zostaną usunięte. Po usunięciu tabeli „Zewnętrzna” usuwana jest tylko definicja schematu z meta-magazynu gałęzi. Dane na temat hdfs wciąż pozostają.

Urvishsinh Mahida
źródło
1

Rozważ ten scenariusz, który najlepiej pasuje do tabeli zewnętrznej:

Zadanie MapReduce (MR) filtruje ogromny plik dziennika, aby wypluć npodrzędne pliki dziennika (np. Każdy podrzędny plik dziennika zawiera określony typ komunikatu), a dane wyjściowe, tj n. Podrzędne pliki dziennika, są przechowywane w plikach hdf.

Te pliki dziennika mają być ładowane do tabel programu Hive w celu przeprowadzenia dalszych analiz. W tym scenariuszu zalecałbym tabelę zewnętrzną (tabele zewnętrzne), ponieważ rzeczywiste pliki dziennika są generowane i są własnością zewnętrznego procesu, tj. Zadania MR, poza tym można uniknąć dodatkowy krok ładowania każdego wygenerowanego pliku dziennika również do odpowiedniej tabeli Hive.

Suresh Vadali
źródło
1

Najlepszym przypadkiem użycia zewnętrznej tabeli w gałęzi jest utworzenie tabeli z pliku CSV lub tekstowego

anubhav
źródło
0

hive przechowuje tylko metadane w metastore, a oryginalne dane poza ulem, gdy używamy tabeli zewnętrznej, możemy podać lokalizację '' przez te nasze oryginalne dane nie będą miały wpływu, gdy usuniemy tabelę

user5080458
źródło
0

Gdy dane są już w HDFS, można utworzyć zewnętrzną tabelę Hive w celu opisania danych. Nazywa się EXTERNAL, ponieważ dane w tabeli zewnętrznej są określone we właściwościach LOCATION zamiast w domyślnym katalogu hurtowni.

Przechowując dane w tabelach wewnętrznych, Hive w pełni zarządza cyklem życia tabeli i danych. Oznacza to, że dane są usuwane po usunięciu wewnętrznej tabeli. Jeśli tabela zewnętrzna zostanie usunięta, metadane tabeli zostaną usunięte, ale dane pozostaną. W większości przypadków preferowana jest tabela zewnętrzna, aby uniknąć przypadkowego usuwania danych wraz z tabelami.

Sayat Satybald
źródło
0

W przypadku tabel zarządzanych Hive kontroluje cykl życia ich danych. Hive przechowuje dane tabel zarządzanych w podkatalogu w katalogu zdefiniowanym domyślnie przez hive.metastore.warehouse.dir.

Kiedy usuwamy tabelę zarządzaną, Hive usuwa dane z tabeli, ale tabele zarządzane są mniej wygodne do udostępniania innym narzędziom. Na przykład, powiedzmy, że mamy dane, które są tworzone i używane głównie przez Pig, ale chcemy uruchomić dla nich kilka zapytań, ale nie dać Hive własności danych.

W tym czasie zdefiniowano tabelę zewnętrzną, która wskazuje na te dane, ale nie przejmuje ich na własność.

Ankit Nandwal
źródło
0

WEWNĘTRZNE : tabela jest tworzona jako pierwsza, a dane są ładowane później

ZEWNĘTRZNE : daneobecne, a na nich tworzona jest tabela .

Prasad L
źródło
0

W Hive możemy również stworzyć tabelę zewnętrzną. Informuje Hive, aby odwołał się do danych znajdujących się w istniejącej lokalizacji poza katalogiem hurtowni. Usunięcie tabel zewnętrznych spowoduje usunięcie metadanych, ale nie danych.

Harsimranjit Singh Kler
źródło
0

Chciałbym to dodać

  1. Tabele wewnętrzne są używane, gdy dane muszą zostać zaktualizowane lub niektóre wiersze muszą zostać usunięte, ponieważ właściwości ACID mogą być obsługiwane w tabelach wewnętrznych, ale właściwości ACID nie mogą być obsługiwane w tabelach zewnętrznych.
  2. Upewnij się, że istnieje kopia zapasowa danych w tabeli wewnętrznej, ponieważ w przypadku usunięcia tabeli wewnętrznej dane również zostaną utracone.
jatin
źródło
-2

Krótko mówiąc, są dwie rzeczy:

Hive może zarządzać elementami w hurtowni, tj. Nie usuwa danych z magazynu. Kiedy usuwamy tabelę:

1) W przypadku tabel wewnętrznych dane są zarządzane wewnętrznie w hurtowni. Więc zostanie usunięty.

2) W przypadku tabel zewnętrznych dane są zarządzane wiecznie z magazynu. Nie można więc go usunąć, a klienci inni niż hive również mogą go używać.

Sonu
źródło