Menu Zamknij

MapReduce – w trybie local

Wprowadzenie

Nie zawsze program MapReduce jest na tyle prosty, że pierwsza próba jego napisania kończy się sukcesem.
Co jeśli nasz program jest na tyle skomplikowany, że wymaga długotrwałej implementacji? Długotrwałe korzystanie z klastra może wiązać się ze znacznymi kosztami. W takim przypadku byłoby dobrze móc uruchamiać nasz program MapReduce lokalnie.

Duża część narzędzi Big Data posiada możliwość uruchamiania w tzw. trybie local. Tryb ten z reguły wykorzystuje wątki JVM analogicznie jak w przypadku klastra Hadoop wykorzystywane byłyby kontenery YARN.

Taki sam tryb ma MapReduce. W dawnych jego wersjach (org.apache.hadoop.mapred.*) uzyskiwało się go ustawiając po prostu parametr konfiguracyjny

conf.set("mapreduce.framework.name", "local");

W przypadku nowszych bibliotek stosowane podejście wygląda nieco inaczej. Gotowi?

Punkt wyjścia

Zaczniemy od początku.

  • Utwórz projekt Javy w IntelliJ IDE o nazwie WordCount
  • Utwórz nową klasę Javy WordCount
  • Oczywiście brakuje nam kilku bibliotek. Przejdź do ustawień projektu na zakładkę Libraries
  • A następnie dodaj następujące biblioteki
    • org.apache.hadoop:hadoop-common:3.3.5
    • org.apache.hadoop:hadoop-mapreduce-client-common:3.3.5

I tu dość istotna uwaga.

Standardowo biblioteką MapReduce, którą potrzebujemy jest
org.apache.hadoop:hadoop-mapreduce-client-core:3.3.5

Jest ona właściwym rozwiązaniem jeśli chcemy uruchamiać zadania MapReduce w klastrach Hadoop, gdzie jest dostępny zarówno YARN jak i HDFS,
patrz: https://hadoop.apache.org/docs/r3.3.5/hadoop-mapreduce-client/hadoop-mapreduce-client-core/dependency-analysis.html

my skorzystaliśmy z biblioteki
org.apache.hadoop:hadoop-mapreduce-client-common:3.3.5

która takich możliwości nie posiada,
patrz: https://hadoop.apache.org/docs/r3.3.5/hadoop-mapreduce-client/hadoop-mapreduce-client-common/dependency-analysis.html

Jednak w zamian za to posiada np. klasę org.apache.hadoop.mapred.LocalJobRunner i dzięki niej pozwala na bezproblemowe uruchamianie i testowanie zadań MapReduce w trybie local, jak będziemy mieli się okazję za chwilę przekonać.

  • Powód jest oczywisty. Nasz kod wymaga podania parametrów
  • Wprowadźmy zatem zmiany w konfiguracji uruchamiania naszego programu. W założeniu katalog c:\tmp\output nie istnieje – będzie on utworzony przez zadanie MapReduce
  • Ponownie uruchom naszą aplikację.

i… jeśli masz ustawioną zmienną środowiskową HADOOP_HOME wskazującą na odpowiednie katalog domowy oprogramowania Hadoop to…
dane z katalogu c:\tmp\input zostały przetworzone, a wyniki umieszczone w katalogu c:\tmp\ouput

Jeśli jednak te zmiennej HADOOP_HOME nie posiadasz to rezultat jest zapewne podobny do tego poniżej

W takim przypadku potrzebny jest jeszcze jeden etap

Środowisko

W przypadku środowiska Linux wystarczy zapewne

W przypadku środowiska Windows sytuacja jest nieco odmienna. Apache Hadoop nie jest przeznaczony dla środowiska Windows. Na szczęście stworzone zostało specjalne oprogramowanie winutils, które ten problem rozwiązuje.

  • Następnie ustaw/dodaj zmienną środowiskową HADOOP_HOME, tak aby wskazywała na właściwy katalog.
  • Zmień też zmienną środowiskową PATH, tak aby zawierała %HADOOP_HOME%\bin
  • Zrestartuj IntelliJ IDEA, aby zmienne środowiskowe zostały ponownie zaczytane i… gotowe.

Dane z katalogu c:\tmp\input zostały przetworzone, a wyniki umieszczone w katalogu c:\tmp\ouput

Uwaga! Domyślnie silnik MapReduce wykorzystuje jeden reduktor.
Patrz: https://hadoop.apache.org/docs/r3.3.5/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

Pliki konfiguracyjne mogą to oczywiście zmienić.

Jednak należy pamiętać, że

Zatem pozostaje nam alternatywa polegająca na określeniu liczby reduktorów podczas konfiguracji zadania MapReduce.

Zdecydowanie zalecam dokonanie korekty tego elementu, aby lepiej odwzorować rozproszone działania, które mają miejsce w klastrze Hadoop.