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.
Awesome, thanks –
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
@libjack Dzięki za złapanie tego. Naprawiono powyżej. –