Apache HADOOP. Niektórzy mawiają, że przekleństwo naszych czasów inni, że błogosławieństwo… a może zwykły postęp? Nieokiełznane parcie do przodu, niezaspokojona ciekawość i wieczne pytania jak, gdzie i kiedy. Może i faktycznie trochę w tym zniewolenia, ale odpowiedzmy sobie na pytanie, kiedy, ostatnio tak naprawdę byliśmy wolni?

Na podstawie: http://www.flickr.com/photos/alexkerhead/3100294481/in/photolist-5HXPx8-5NNqvL-5QwTEh-5QGQV6-5ZqLWi-5ZuXKJ-5ZyBfe-621KTh-65ZKxX-6hWQma-6i1JgC-6i1JY9-6irZgX-6vuSCE-6wcaGy-6wdavS-6wSNwb-6xXD7w-6GHt7k-6KgDKe-6Y338r-77AjGT-7f3wo2-7pCyrH-9uVCyf-9uVCmS-9uSCAe-9vkWz3-aj5sRk-9vfJc5-bpvFwh-bCqCzT-bCqBNr-bpvH3d-bpvF8E-9VATSc-96kJo9-96hH5x-96hHyF-a5aTKY-btCADk-btCAxD-bUgBzL-bUgBCJ-bUgBy5-bUgBDS-9vjjXR-9vnkcm-8SL6cp-8JkA1X-7MTkDR/

Za podstawę naszej maszyny-zagłady-prywatności wziąłem sobie Ubuntu 12.04 LTS. Wydaje mi się, że wybór padł trochę z przekory, gdyż słowo „ubuntu” w języku plemion Zulu i Xhosa zamieszkujących południową Afrykę oznacza „człowieczeństwo wobec innych”, a rajskie jabłko przecież też było czerwone i słodkie.

Po zainstalowaniu Ubuntu 12.04 LTS jesteśmy zmuszeni do ręcznej instalacji Javy. Na początku trzeba ją pobrać z strony Oracle:

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

Następnie czeka nas przeniesienie plików Javy w odpowiednie miejsca i aktualizacja informacji systemowych, robimy to za pomocą następujących komend:

tar -xvf jdk-7u25-linux-x64.gz

mkdir -p /usr/lib/jvm/jdk1.7.0

mv jdk1.7.0_25/* /usr/lib/jvm/jdk1.7.0/

update-alternatives –install „/usr/bin/java” „java” „/usr/lib/jvm/jdk1.7.0/bin/java” 1

update-alternatives –install „/usr/bin/javac” „javac” „/usr/lib/jvm/jdk1.7.0/bin/javac” 1

update-alternatives –install „/usr/bin/javaws” „javaws” „/usr/lib/jvm/jdk1.7.0/bin/javaws” 1

Voile! Java na pokładzie, aby sprawdzić czy na pewno nam wyszło należy wywołać komendę:

root@u-hadoop-01:/home/ml# java -version

java version „1.7.0_25”

Java(TM) SE Runtime Environment (build 1.7.0_25-b15)

Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

Jeżeli uzyskujecie podobny rezultat to znaczy, że wszytko się udało i Java zadziałała prawidłowo, a co za tym idzie rozgrzewkę mamy za sobą – czas na diabła pod postacią żółtego, pociesznego słonika. Oto na scenie przed Państwem… HADOOP!

Dodajemy użytkownika, na którym będą uruchomione procesy hadoopa. Oczywiście, jeżeli lubisz i uważasz, że wszystko lepiej działa na koncie roota, nie mam zamiaru cię przekonywać i możesz pominąć ten krok.

addgroup hadoop

adduser –ingroup hadoop hduser

Węzły klastra porozumiewają się ze sobą za pomocą certyfikatów RSA (bez hasła), które musimy wygenerować, oraz przenieść do folderu odpowiedzialnego za składowanie kluczy do automatycznego logowania. Można to zrobić tak:

root@u-hadoop-01:/home/ml# su – hduser

hduser@u-hadoop-01:~$ ssh-keygen -t rsa -P „”

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hduser/.ssh/id_rsa):

Created directory ‚/home/hduser/.ssh’.

Your identification has been saved in /home/hduser/.ssh/id_rsa.

Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.

The key fingerprint is:

1c:7m:6e:5n:0t:7a:6r:8n:2a:fp:6o:el:dk:3a hduser@u-hadoop-01

The key’s randomart image is:

+——–[ RSA 2048]——–+

|      zatancz    |

|      ze mna     |

|       polke     |

|        c me   n |

|            ta   |

|                r|

|               n |

|               ą |

|                 |

+—————————————————+

hduser@u-hadoop-01:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Następnie wyłączamy IPv6 dla całego serwera, co implikuje również wyłączenie go dla HADOOP’a. Dzięki temu będziemy ograniczeni tylko do jednej wersji IP i zdecydowanie łatwiej będzie nam szukać ewentualnych problemów podczas jego działania. Jeżeli korzystasz z IPv6 to po pierwsze gratulacje, po drugie napisz do mnie maila z oferta współpracy 😀

nano /etc/sysctl.conf

 

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv6.conf.lo.disable_ipv6 = 1

 

reboot

Tak, jest konieczny. Po wykonaniu restartu serwera pobieramy i rozpakowujemy, oraz relokujemy pliki HADOOP’a na naszym systemie:

wget http://ftp.ps.pl/pub/apache/hadoop/core/stable/hadoop-1.1.2.tar.gz

tar -xvf hadoop-1.1.2.tar.gz

mv hadoop-1.1.2 /usr/local/

cd /usr/local/

ln -s hadoop-1.1.2/ hadoop

chown -R hduser:hadoop hadoop*

Następnie musimy zaktualizować plik $HOME/.bashrc dla użytkownika hduser i dodać informacje o Javie:

root@u-hadoop-01:/usr/local# nano /home/hduser/.bashrc

export HADOOP_PREFIX=/usr/local/hadoop

export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0/

Oraz w celu ułatwienia sobie życia poustawiać sobie powłokę:

unalias fs &> /dev/null

alias fs=”hadoop fs”

unalias hls &> /dev/null

alias hls=”fs -ls”

To w zasadzie wszystko, jeśli chodzi o instalację. Pozostaje tylko wstępna konfiguracja i już za chwilę będziemy mieli działający jedno węzłowy klaster 😉 Tak więc, na początku organizacja configów, tak aby nie szukać ich po całym systemie:

cd /etc/

ln -s /usr/local/hadoop/conf/ hadoop

Następnie przechodzimy do edycji pliku hadoop-env.sh, gdzie jak sama nazwa wskazuje będziemy edytować zmienne środowiskowe samego systemy HADOOP:

nano /etc/hadoop/hadoop-env.sh

 

# The java implementation to use.  Required.

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0/

Kolejnym krokiem jest dodanie folderu tmp dla Demona… chyba pierwszy raz nie mogę się bardziej zgodzić z nazwą „demon” niż w tym przypadku:

mkdir -p /opt/hadoop/tmp

chown hduser:hadoop /opt/hadoop/tmp

chmod 750 /opt/hadoop/tmp

Teraz czeka nas edycja plików konfiguracyjnych, wypadałoby aby wyglądały one podobnie, oczywiście możecie je dowolnie zmieniać, to jest bardzo podstawowa konfiguracja:

nano /etc/hadoop/core-site.xml

 

<?xml version=”1.0″?>

<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/hadoop/tmp</value>

</property>

<property>

<name>fs.default.name</name>

<value>hdfs://localhost:54310</value>

</property>

</configuration>

 

nano /etc/hadoop/mapred-site.xml

 

<?xml version=”1.0″?>

<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>

<property>

<name>mapred.job.tracker</name>

<value>localhost:54311</value>

</property>

</configuration>

 

nano /etc/hadoop/hdfs-site.xml

 

<?xml version=”1.0″?>

<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

</configuration>

Konfiguracja za nami. Czas na to co tygryski lubią najbardziej – formatowanie. Operację formatowania HDFS’a wykonuje się następująco:

root@u-hadoop-01:/# su – hduser

hduser@u-hadoop-01:~$ /usr/local/hadoop/bin/hadoop namenode -format

13/06/30 21:04:31 INFO namenode.NameNode: STARTUP_MSG:

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG:   host = u-hadoop-01/127.0.1.1

STARTUP_MSG:   args = [-format]

STARTUP_MSG:   version = 1.1.2

STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.1 -r 1440782; compiled by ‚hortonfo’ on Thu Jan 31 02:03:24 UTC 2013

************************************************************/

13/06/30 21:04:31 INFO util.GSet: VM type       = 64-bit

13/06/30 21:04:31 INFO util.GSet: 2% max memory = 19.33375 MB

13/06/30 21:04:31 INFO util.GSet: capacity      = 2^21 = 2097152 entries

13/06/30 21:04:31 INFO util.GSet: recommended=2097152, actual=2097152

13/06/30 21:04:32 INFO namenode.FSNamesystem: fsOwner=hduser

13/06/30 21:04:32 INFO namenode.FSNamesystem: supergroup=supergroup

13/06/30 21:04:32 INFO namenode.FSNamesystem: isPermissionEnabled=true

13/06/30 21:04:32 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100

13/06/30 21:04:32 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)

13/06/30 21:04:32 INFO namenode.NameNode: Caching file names occuring more than 10 times

13/06/30 21:04:33 INFO common.Storage: Image file of size 112 saved in 0 seconds.

13/06/30 21:04:33 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/opt/hadoop/tmp/dfs/name/current/edits

13/06/30 21:04:33 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/opt/hadoop/tmp/dfs/name/current/edits

13/06/30 21:04:33 INFO common.Storage: Storage directory /opt/hadoop/tmp/dfs/name has been successfully formatted.

13/06/30 21:04:33 INFO namenode.NameNode: SHUTDOWN_MSG:

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at u-hadoop-01/127.0.1.1

************************************************************/

Jeżeli uzyskaliście podobny rezultat jak ja powyżej to znaczy, że Wasz klaster jest gotowy do działania i należy go odpalić przy pomocy:

hduser@u-hadoop-01:~$ /usr/local/hadoop/bin/start-all.sh

starting namenode, logging to /usr/local/hadoop-1.1.2/libexec/../logs/hadoop-hduser-namenode-u-hadoop-01.out

localhost: starting datanode, logging to /usr/local/hadoop-1.1.2/libexec/../logs/hadoop-hduser-datanode-u-hadoop-01.out

localhost: starting secondarynamenode, logging to /usr/local/hadoop-1.1.2/libexec/../logs/hadoop-hduser-secondarynamenode-u-hadoop-01.out

starting jobtracker, logging to /usr/local/hadoop-1.1.2/libexec/../logs/hadoop-hduser-jobtracker-u-hadoop-01.out

localhost: starting tasktracker, logging to /usr/local/hadoop-1.1.2/libexec/../logs/hadoop-hduser-tasktracker-u-hadoop-01.out

Aby sprawdzić, czy się uruchomił należy wykonać netsata i poszukać procesów Javy:

hduser@u-hadoop-01:~$ netstat -npea | grep -i java

(Not all processes could be identified, non-owned process info

will not be shown, you would have to be root to see it all.)

tcp        0      0 0.0.0.0:50030           0.0.0.0:*               LISTEN      1001       12334       3014/java

tcp        0      0 0.0.0.0:47218           0.0.0.0:*               LISTEN      1001       12009       3014/java

tcp        0      0 0.0.0.0:37971           0.0.0.0:*               LISTEN      1001       11144       2429/java

tcp        0      0 0.0.0.0:50070           0.0.0.0:*               LISTEN      1001       11484       2429/java

tcp        0      0 127.0.0.1:54310         0.0.0.0:*               LISTEN      1001       11288       2429/java

tcp        0      0 127.0.0.1:54311         0.0.0.0:*               LISTEN      1001       12328       3014/java

tcp        0      0 127.0.0.1:54311         127.0.0.1:43254         ESTABLISHED 1001       12347       3014/java

tcp        0      0 127.0.0.1:54310         127.0.0.1:51719         ESTABLISHED 1001       11757       2429/java

tcp6       0      0 :::50060                :::*                    LISTEN      1001       12604       3243/java

tcp6       0      0 :::50010                :::*                    LISTEN      1001       11923       2685/java

tcp6       0      0 :::50075                :::*                    LISTEN      1001       11951       2685/java

tcp6       0      0 :::42459                :::*                    LISTEN      1001       11499       2685/java

tcp6       0      0 127.0.0.1:44447         :::*                    LISTEN      1001       12336       3243/java

tcp6       0      0 :::50020                :::*                    LISTEN      1001       12099       2685/java

tcp6       0      0 :::38020                :::*                    LISTEN      1001       11954       2938/java

tcp6       0      0 :::50090                :::*                    LISTEN      1001       12324       2938/java

tcp6       0      0 127.0.0.1:51719         127.0.0.1:54310         ESTABLISHED 1001       11756       2685/java

tcp6       0      0 127.0.0.1:43254         127.0.0.1:54311         ESTABLISHED 1001       12342       3243/java

unix  2      [ ]         STREAM     CONNECTED     12348    3014/java

unix  2      [ ]         STREAM     CONNECTED     12344    3243/java

unix  2      [ ]         STREAM     CONNECTED     12337    3243/java

unix  2      [ ]         STREAM     CONNECTED     12318    2938/java

unix  2      [ ]         STREAM     CONNECTED     12007    3014/java

unix  2      [ ]         STREAM     CONNECTED     11952    2938/java

unix  2      [ ]         STREAM     CONNECTED     11774    2685/java

unix  2      [ ]         STREAM     CONNECTED     11497    2685/java

unix  2      [ ]         STREAM     CONNECTED     11220    2429/java

unix  2      [ ]         STREAM     CONNECTED     11142    2429/java

hduser@u-hadoop-01:~$

Klaster zatrzymuje się następująco:

hduser@u-hadoop-01:~$ /usr/local/hadoop/bin/stop-all.sh

stopping jobtracker

localhost: stopping tasktracker

stopping namenode

localhost: stopping datanode

localhost: stopping secondarynamenode

Zazwyczaj w środowisku testowym pracuje jako root, tak więc łatwiej mi korzystać z poleceń uruchamianych od razu w SUDO na użytkowniku hduser:

sudo -u hduser /usr/local/hadoop/bin/start-all.sh

sudo -u hduser /usr/local/hadoop/bin/stop-all.sh

Tak więc nasz klaster HADOOP jest w pełni skonfigurowany I działa. Naturalnie rodzi się pytanie jak coś na niego wrzucić!? Robimy to komendą:

su hduser

/usr/local/hadoop/bin/start-all.sh

cd /home/hduser/

wget http://upload.wikimedia.org/wikipedia/en/d/d6/Doop.png

/usr/local/hadoop/bin/hadoop dfs -copyFromLocal /home/hduser/Doop.png /user/hduser/Doop.png

Aby sprawdzić czy plik jest na HADOOP’ie wykonujemy komendę:

bin/hadoop dfs -ls /user/hduser

Tak, więc nasz mikro HADOOP działa… Tylko, po co? W następnym odcinku przeprawa z instalacją FUSE-HDFS i próba montażu po NFS do vSphere. Zapraszam!

Artykuły powiązane:

About the author

Bloger i niezależny konsultant z wieloletnim doświadczeniem w branży IT. Specjalizujący się w wirtualizacji i cloud computingu. Posiada tytuły MCP, MCTS, VCP oraz VMware vExpert.
1 Response

Leave a Reply