Database
 sql >> Baza danych >  >> RDS >> Database

Zrozumienie typów i formatów MapReduce

Hadoop używa modelu programowania MapReduce do przetwarzania danych wejściowych i wyjściowych dla mapy oraz do redukcji funkcji reprezentowanych jako pary klucz-wartość. Podlegają równoległemu wykonywaniu zbiorów danych znajdujących się na szerokiej gamie maszyn w architekturze rozproszonej. Paradygmat programowania ma zasadniczo charakter funkcjonalny w łączeniu przy użyciu techniki mapowania i zmniejszania. W tym artykule przedstawiono model MapReduce, a w szczególności sposób wykorzystania danych w różnych formatach, od prostego tekstu po ustrukturyzowane obiekty binarne.

Typy MapReduce

Mapowanie to podstawowa technika przetwarzania listy elementów danych, które występują w parach kluczy i wartości. Funkcja map ma zastosowanie do poszczególnych elementów zdefiniowanych jako pary klucz-wartość listy i tworzy nową listę. Ogólną ideę mapowania i funkcji redukcji Hadoopa można zilustrować w następujący sposób:

map: (K1, V1) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Parametry wejściowe pary klucz-wartość, reprezentowane odpowiednio przez K1 i V1, różnią się od typu pary wyjściowej:K2 i V2. Funkcja zmniejszania akceptuje ten sam format wyjściowy przez mapę, ale typ wyjścia operacji zmniejszania jest inny:K3 i V3. W tym celu interfejs Java API jest następujący:

public interface Mapper<K1, V1, K2, V2> extends JobConfigurable,
      Closeable {
   void map(K1 key, V1 value, OutputCollector<K2, V2> output,
      Reporter reporter) throws IOException;
}

public interface Reducer<K2, V2, K3, V3> extends JobConfigurable,
      Closeable {
   void reduce(K2 key, Iterator<V2> values,
      OutputCollector<K3, V3> output, Reporter reporter)throws
         IOException;
}

Kolektor wyjściowy jest uogólnionym interfejsem struktury Map-Reduce ułatwiającym zbieranie danych wyjściowych przez Mapper lub Reduktor . Te wyniki są niczym innym jak pośrednimi wynikami pracy. Dlatego muszą być sparametryzowane z ich typami. Reporter ułatwia aplikacji Map-Reduce raportowanie postępu oraz aktualizowanie liczników i informacji o stanie. Jeżeli jednak używana jest funkcja łączenia, ma ona taką samą postać jak funkcja zmniejszania, a wyjście jest podawane do funkcji zmniejszania. Można to zilustrować w następujący sposób:

map: (K1, V1) -> list (K2, V2)
combine: (K2, list(V2)) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Zauważ, że funkcje łączenia i zmniejszania używają tego samego typu, z wyjątkiem nazw zmiennych, w których K3 to K2 a V3 to V2.

Funkcja partycji działa na pośrednich typach klucz-wartość. Kontroluje partycjonowanie kluczy pośrednich wyjść mapy. Klucz wyprowadza partycję za pomocą typowej funkcji skrótu. Całkowita liczba partycji jest taka sama jak liczba zadań redukcji dla zadania. Partycja jest określana tylko przez klucz ignorujący wartość.

public interface Partitioner<K2, V2> extends JobConfigurable {
   int getPartition(K2 key, V2 value, int numberOfPartition);
}

To jest w skrócie kluczowa esencja typów MapReduce.

Formaty wejściowe

Hadoop musi akceptować i przetwarzać różne formaty, od plików tekstowych po bazy danych. Fragment danych wejściowych, zwany podziałem danych wejściowych , jest przetwarzany przez pojedynczą mapę. Każdy podział jest dalej podzielony na rekordy logiczne przypisane do mapy do przetworzenia w parze klucz-wartość. W kontekście bazy danych podział oznacza odczytanie zakresu krotek z tabeli SQL, tak jak robi to DBInputFormat i produkowanie LongWritables zawierające numery rekordów jako klucze i DBWritables jako wartości. Interfejs Java API do podziału danych wejściowych jest następujący:

public interface InputSplit extends Writable {
   long getLength() throws IOException;
   String[] getLocations() throws IOException;
}

InputSplit reprezentuje dane, które mają być przetwarzane przez Mappera . Zwraca długość w bajtach i ma odniesienie do danych wejściowych. Przedstawia zorientowany bajtowo widok danych wejściowych i jest odpowiedzialny za RecordReader zadania, aby przetworzyć to i przedstawić pogląd zorientowany na rekordy. W większości przypadków nie zajmujemy się InputSplit bezpośrednio, ponieważ są tworzone przez InputFormat . Za to odpowiada InputFormat aby utworzyć podziały wejściowe i podzielić je na rekordy.

public interface InputFormat<K, V> {
   InputSplit[] getSplits(JobConf job, int numSplits) throws
      IOException;

   RecordReader<K, V> getRecordReader(InputSplit split,
      JobConf job, throws IOException;
}

JobClient wywołuje getSplits() metoda z odpowiednią liczbą podzielonych argumentów. Podana liczba jest wskazówką, ponieważ rzeczywista liczba podziałów może różnić się od podanej liczby. Po obliczeniu podziału jest on wysyłany do Jobtrackera. Jobtracker planuje zadania mapy dla Tasktrackerów przy użyciu lokalizacji przechowywania. Następnie narzędzie do śledzenia zadań przekazuje podział, wywołując getRecordReader() metoda na InputFormat zdobyć RecordReader do podziału.

FileInputFormat jest klasą bazową źródła danych pliku. Jest odpowiedzialny za zidentyfikowanie plików, które mają zostać uwzględnione jako dane wejściowe zadania, oraz definicję generowania podziału.

Hadoop obejmuje również przetwarzanie nieustrukturyzowanych danych, które często mają format tekstowy. TextInputFormat jest domyślnym Formatem wejściowym dla takich danych.

SequenceInputFormat zajmuje wejścia binarne i przechowuje sekwencje binarnych par klucz-wartość.

Podobnie DBInputFormat zapewnia możliwość odczytu danych z relacyjnej bazy danych za pomocą JDBC.

Formaty wyjściowe

Klasy formatu wyjściowego są podobne do odpowiadających im klas formatu wejściowego i działają w odwrotnym kierunku.

Na przykład TextOutputFormat jest domyślnym formatem wyjściowym, który zapisuje rekordy jako zwykłe pliki tekstowe, podczas gdy pary klucz-wartość any są dowolnego typu i przekształca je w ciąg przez wywołanie funkcji toString() metoda. Znak klucz-wartość jest oddzielony znakiem tabulacji, chociaż można to dostosować, manipulując właściwością separatora formatu wyjściowego tekstu.

W przypadku wyjścia binarnego istnieje SequenceFileOutputFormat zapisać sekwencję wyjścia binarnego do pliku. Wyjścia binarne są szczególnie przydatne, jeśli dane wyjściowe stają się danymi wejściowymi do kolejnego zadania MapReduce.

Formaty wyjściowe dla relacyjnych baz danych i do HBase są obsługiwane przez DBOutputFormat . Wysyła zredukowane dane wyjściowe do tabeli SQL. Na przykład TableOutputFormat . HBase umożliwia programowi MapReduce pracę na danych przechowywanych w tabeli HBase i używa ich do zapisywania danych wyjściowych do tabeli HBase.

Wniosek

To jest w skrócie sedno typów i formatów MapReduce. Zapoznaj się z listą w odnośniku poniżej, aby uzyskać więcej informacji na ich temat. Istnieje wiele zawiłych szczegółów na temat funkcji API Java, które stają się jaśniejsze dopiero po zagłębieniu się w programowanie. Zapoznaj się z dokumentacją Apache Hadoop Java API, aby uzyskać więcej informacji i zacznij kodować kilka praktyk.

Referencje

  • Tom White, Hadoop The Definitive Guide O’Reilly
  • Dokumentacja Apache Hadoop Java API

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie tabel JavaFX do organizowania danych

  2. Sterownik ODBC Quickbooks

  3. Więcej ulepszeń showplanu? Tak proszę!

  4. Ogranicz serwer połączony do pojedynczego logowania lokalnego (przykład T-SQL)

  5. Sztuka agregacji danych w SQL od prostych do agregacji przesuwnych