5

Czy istnieje sposób na pouczenie Hive, aby podzielił dane na wiele plików wyjściowych? A może ograniczyć rozmiar plików wyjściowych.Hive - dzielenie danych między plikami

Zamierzam użyć przesunięcia ku czerwieni, zalecający dzielenie danych na wiele plików, aby umożliwić równoległe ładowanie http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

Mamy Preprocesuj całość danych w ulu, a ja zastanawiałem się, czy istnieje sposób, aby tworzyć, powiedzmy 10 1 GB plików, które mogą przyspieszyć kopiowanie do redshift.

Szukałem na https://cwiki.apache.org/Hive/adminmanual-configuration.html i https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties ale nie mogę znaleźć coś

Odpowiedz

10

Istnieje kilka sposobów, można iść o podzielenie wyjście ula. Pierwszym i najprostszym sposobem jest ustawienie liczby reduktorów. Ponieważ każdy redukuje zapis do własnego pliku wyjściowego, liczba określonych reduktorów będzie odpowiadać liczbie zapisanych plików wyjściowych. Zauważ, że niektóre zapytania Hive nie spowodują określonej liczby reduktorów (na przykład SELECT COUNT(*) FROM some_table zawsze daje jeden reduktor). Aby określić liczbę reduktorów uruchomić to przed zapytaniu:

set mapred.reduce.tasks=10 

Innym sposobem można podzielić na wiele plików wyjściowych byłoby mieć Hive wstawić wyniki kwerendy na partycje tabeli. Spowoduje to utworzenie co najmniej jednego pliku na partycję. Aby to miało sens, musisz mieć odpowiednią kolumnę do partycjonowania. Na przykład nie chcesz dzielić na jedną unikalną kolumnę lub mieć jeden plik dla każdego rekordu. Takie podejście zagwarantuje co najmniej plik wyjściowy na partycję i co najwyżej numPartitions * numReducers. Oto przykład (nie martw się zbytnio o hive.exec.dynamic.partition.mode, należy go ustawić, aby to zapytanie działało).

hive.exec.dynamic.partition.mode=nonstrict 

CREATE TABLE table_to_export_to_redshift (
    id INT, 
    value INT 
) 
PARTITIONED BY (country STRING) 

INSERT OVERWRITE TABLE table_to_export_to_redshift 
PARTITION (country) 
SELECT id, value, country 
FROM some_table 

Aby uzyskać dokładniejsze sterowanie, można napisać własny skrypt redukujący, który zostanie przekazany do ula i zredukuje zapis skryptu do wielu plików. Kiedy piszesz swój własny reduktor, możesz zrobić prawie wszystko, co chcesz.

W końcu możesz zrezygnować z próbkowania Hive w celu uzyskania żądanej liczby plików i po prostu rozdzielić je po zakończeniu Hive. Domyślnie Hive przechowuje nieskompresowane tabele i zawiera zwykły tekst w jego katalogu magazynów (np. /apps/hive/warehouse/table_to_export_to_redshift). Możesz użyć poleceń powłoki Hadoop, zadania MapReduce, Pig lub przeciągnąć je do Linuksa i rozdzielić je, jak chcesz.

Nie mam żadnego doświadczenia z Redshift, więc niektóre z moich sugestii mogą nie być odpowiednie do wykorzystania przez Redshift z jakiegokolwiek powodu.

Kilka uwag: Dzielenie plików na mniejsze i mniejsze pliki jest generalnie niekorzystne dla Hadoop. Możesz uzyskać wzrost prędkości dla Redshift, ale jeśli pliki zostaną zużyte przez inne części ekosystemu Hadoop (MapReduce, Hive, Pig, itp.), Możesz zauważyć utratę wydajności, jeśli pliki są zbyt małe (chociaż 1GB byłoby w porządku) . Upewnij się także, że dodatkowy czas przetwarzania/wywoływania jest wart oszczędności czasu na równoległe ładowanie danych Redshift.

+0

Awesome, thanks –

+1

Twój przykład nie powoduje podziału na partycje. Zarówno polecenia 'CREATE TABLE' i' INSERT OVERWRITE' muszą określać partycje do użycia. – libjack

+0

@libjack Dzięki za złapanie tego. Naprawiono powyżej. –

Powiązane problemy