Jeżeli chcesz przenosić dane z Hive zgodnie z dobrymi praktykami skorzystaj z tego tutorialu. Celem tego wpisu jest przedstawienie prostego mechanizmu, który pozwala na export i import tabel. Jak sama nazwa tych operacji wskazuje zapis danych obejmuje tabele, partycje oraz metadane w określonej lokalizacji. Po wykonaniu tej operacji możemy zdecydować czy chcemy przenieść nasze dane do innego klastra Hadoop czy do innego środowiska, na którym jest skonfigurowany Hive.
Jak wygląda składania polecenia export i import w Hive?
Polecenie Export
EXPORT TABLE nazwa_tabeli [PARTITION (kolumna_partycjonowana="wartosc"[, ...])]
TO '/docelowa_sciezka'
Polecenie Import
IMPORT [[EXTERNAL] TABLE nazwa_tabeli [PARTITION (kolumna_partycjonowana="wartosc"[, ...])]] FROM '/sciezka_zrodlowa/' [LOCATION '/docelowa/sciezka/importu/']
Przykład
Chcemy przenieść dane pomiędzy klastrami. Mamy ścieżkę, która zawiera tabelę lista_klientow i przenosimy ją na drugi klaster. W pierwszej kolejności wykonujemy operację exportu. Następnie wykorzystujemy narzędzie distcp do skopiowania danych pomiędzy klastrami. W ostatnim etapie dokonujemy importu z poziomu narzędzia Hive.
Na klastrze źródłowym, z którego pobieramy dane:
$ hive -e "EXPORT TABLE klienci.lista_klientow TO '/tmp/lista_klientow'"
Kopiowanie plików pomiędzy klastrami:
Polecenie w tej sytuacji uruchamiamy na klastrze docelowym. Jeżeli chcemy uruchomić distcp na klastrze źródłowym to wystarczy zamienić kolejność ścieżek.
$ hadoop distcp hdfs://klaster_zrodlowy:8020/tmp/lista_klientow/ /tmp/lista_klientow/
Jeżeli ilość danych, które musisz skopiować będzie duża, warto wykorzystać dodatkowe parametry. Przy lekkiej tabeli nie mają one znaczenia, bo czas kopiowania i tak będzie krótki, ale jeżeli chcesz kopiować sporą ilość danych (kilkaset GB lub kilka TB) to weź pod uwagę takie parametry jak zachowanie uprawnień podczas kopiowania, ilość mapperów, liczba wątków czy przepustowość. Po więcej informacji odsyłam do dokumentacji narzędzia distcp.
$ hadoop distcp -pugp -m 150 -strategy dynamic -numListstatusThreads 30 -bandwidth 600 -direct hdfs://klaster_zrodlowy:8020/tmp/lista_klientow/ /tmp/lista_klientow/
Na klastrze docelowym, na którym importujemy dane:
$ hive -e "IMPORT TABLE baza1.lista_klientow FROM '/tmp/lista_klientow' LOCATION '/docelowa/sciezka/hive/baza1.db/lista_klientow';"
W przypadku importu danych możesz zmienić nazwę importowanej tabeli, tzn. nie musi być taka sama jak eksportowana.
Korzystając z opcji import, export w Hive możesz w prostu sposób przeprowadzić migrację części danych pomiędzy środowiskami.