Több gépünk is van, ami nincs 100%-ban kihasználva, ezért úgy gondoltam, telepítek rájuk Hadoopot. Már csak a HDFS is megérné, hiszen a tárolt adatok így is több gépen vannak össze-vissza, gyakran aszerint, hogy éppen hol van hely. Ha emellett még MapReduce alkalmazásokat is bevethetünk, hogy a feladatokat gyorsabban megcsináljuk, az csak újabb jó pont.
Négy gépet akartam befogni. Mi tagadás, ennél heterogénebb rendszert elég nehéz elképzelni: OpenSUSE 12.0 Java 1.6-al, 3 Kubuntu 14.10, de az egyik 1.7 Oracle Javaval, kettő OpenJDK-val. A teljesítmény is elég ingadozó. Van 4, 8, 48 és 70 GB memória, 3 négy magos és egy 8 magos gép.
Az első és legfontosabb, hogy minél kevesebb gép specifikus elérési út legyen, ezért az /opt/hadoop-2.2.0 könyvtárba kerültek a Hadoop fájljai. A dokumentáció szerint a JAVA_HOME-t és a HADOOP_HOME-ot minden esetben be kell állítani. Ezek a .bashrc-ben kerültek beállításra.
A második legfontosabb, de ezt minden fórum és leírás hangoztatja, a jelszó mentes SSH belépés. Erre tonnányi anyag van a neten, nem térnék ki rá. Egy fontos momentum viszont hiányzik a dokumentációból, és csak a fórumok probléma megoldásai között találhatunk rá: az /etc/hosts-ban a gépek nevéhez ugyan az a bejegyzés legyen! Tehát ha egy gép neve slave12, akkor minden más hadoop gépen a slave12-höz ugyan az az IP cím szerepeljen, és ne 127.0.0.1.
A dokumentáció szerint a konfigurációs állományok a HADOOP_HOME/conf könyvtárban vannak, de ez nem igaz. A HADOOP_HOME/etc/hadoop könyvtárban vannak. XML-ben vannak a programok paraméterei, míg a programok futásához szükséges környezeti változók .sh kiterjesztésű szkriptekben kerülnek beállításra. Célszerű ezeket úgy módosítani, hogy az egész konfigurációs könyvtárat tudjuk mozgatni az összes gépre. Ez igazából könnyen megoldható, mert a master és slave gépek csak abban különböznek, hogy más démonokat indítanak el rajtuk.
Ha minden démont egy gépen indítunk, akkor kapjuk az úgynevezett pseudo distributive módot. Ez igazából csak a konfiguráció helyességének tesztelésére jó, sok értelme szerintem nincs. Mint már említettem, a gépek két csoportba sorolhatóak: master és slave. A master gépek ha nem működnek, akkor nincs Hadoop. Alapvetően két démon tartozik ide: NameNode és Yarn (ResourceManager/JobTracker). Előbbi az elosztott fájlrendszer adatait tartja nyilván, utóbbi a MapReduce folyamatok működéséért felelős. Nagyobb rendszerek esetén mindegyikből lehet tartalékot is fenntartani (pl. másodlagos NameNode), de nálunk erre nincs sem lehetőség, sem igény.
A slave gépek vannak többen. Meghibásodásuk esetén a feladatot át tudja venni másik gép. Itt a DataNode és NodeManager démonok futnak.
A konfigurációs XML-ek felépítése egyszerű:
<property>
<name> </name>
<value> </value>
<property>
A nevek listáját ne a dokumentációból szedjük, hanem nézzük meg a default tartalmú fájlokat. Ezeket a find HADOOP_HOME -name "*default*xml" paranccsal találhatjuk meg. Az XML fájlokban mindegyik bejegyzéshez van leírás, amiből megtudjuk, mit állíthatunk be. A legfontosabb, hogy a slave gépek tudják, hol találják a master gépeket: A core-site.xml-ben az fs.defaultFS mondja meg, hol van a NameNode. A mapred-site.xml-ben a mapreduce.jobtracker.address azonosítja a JobTrackert, a yarn-site.xml-ben a yarn.resourcemanager.hostname pedig ahogy neve is mutatja a ResourceManager-t tartja nyilván. Természetesen egyéb beállításokat is tehetünk, de ez a minimum.
Ahogy a master gépeket azonosítottuk, ugyan úgy ismerni kell a slave gépek nevét is. A slaves fájlban fel kell sorolni valamennyit, valamint a yarn-site.xml-ben a yarn.nodemanager.xml-t állítsuk localhostra. A hdfs-site.xml-ben állíthatjuk be, hogy az adott gép milyen erőforrásokkal járuljon hozzá az elosztott fájlrendszerhez. Sajnos a mi esetünkben ez a leggyengébb pontja a konfigurációnak, mert minden gépen mást kell beállítani.
Jöhet a démonok indítása! Minden slave gépen el kell indítani a DataNode és NodeManager démonokat. Előbbi a HDFS-ért, utóbbi a MapReduce-ért felelős:
HADOOP_HOME/sbin/hadoop-daemon.sh --script hdfs start datanode
HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager
A mi esetünkben csak egy master gép van, minden azzal kapcsolatos démont azon indítunk el. Még akkor is, ha a dokumentáció ezt nem javasolja.
HADOOP_HOME/sbin/hadoop-daemon.sh --script hdfs start namenode
HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager
A rendszert a böngészőből lehet ellenőrizni, a 9000-es porton. Ha nem látjuk a weboldalt, akkor nem megy a NameNode. Ha a slave gépek közül hiányzik valamelyik, akkor nézzük át annak a gépnek a log fájljait. Ezeket a HADOOP_HOME/logs könyvtárban találjuk.