En aquesta entrada, aprendrem a crear un clúster de 3 nodes d’Ubuntu allotjats en màquines virtuals amb VirtualBox en un equip amb Windows 10.
Les màquines estan pensades per provar aplicacions de Big Data amb un sistema de fitxers distribuït i, per tant, es presenten uns requisits concrets:
Abans de començar, ens hem d’assegurar que tenim instal·lat VirtualBox i haver descarregat una imatge d’Ubuntu Server 16.04.
Obrim VirtualBox i pitgem a Nova per crear una nova Màquina Virtual (a partir d’ara VM).
Els següents paràmetres dependran de l’ús que es vulgui donar a les VM i de les característiques de l’equip des del que s’estigui treballant. En el meu cas, he fet servir:
Un cop creada la VM, configurarem els paràmetres de xarxa de manera que ens permetin:
Seleccionem la VM, en aquest cas la node1, i entrem a paràmetres. S’obrirà una nova finestra on es poden acabar d’ajustar alguns aspectes de configuració.
Seleccionem Xarxa, i ens assegurem de que els Adaptadors 1 i 2:
Els altres paràmetres seran els que ja estan per defecte. Els adaptadors 3 i 4 els deixarem deshabilitats.
Amb tots els paràmetres configurats, arranquem la VM per primera vegada. Se’ns demanarà un disc d’arrencada. Cerquem la imatge d’Ubuntu Server 16.04 i la marquem com a dic d’arrencada. A partir d’aquí haurem de seguir els passos habituals per a instal·lar Ubuntu amb els paquets i configuracions mínims.
NOTA: És important fer servir aquesta versió d’Ubuntu, ja que en les versions posteriors han canviat algunes instruccions de configuració i aquest tutorial, possiblement, no serà vàlid.
Amb el Sistema Operatiu ja funcionant, comprovem que hi podem accedir sense problemes introduint el nom d’usuari i la contrasenya. Els següents passos seran instal·lar Python i el paquet d’OpenSSH per tal de poder accedir a la màquina via SSH.
$sudo apt-get update $sudo apt-get install python $sudo apt-get install openssh-server
A continuació, caldrà configurar l’adaptador de xarxa de la VM per a que compleixi els requisits ja esmentats.
Podem consultar el nom de la màquina i l’adreça IP assignada de manera automàtica pel DHCP mitjançant les comandes:
$hostname $hostname -I
Se’ns retornarà el nom de la màquina que haguem introduït durant la instal·lació i la seva adreça IP. Aquesta adreça és dinàmica i pot canviar o, fins i tot, ser assignada a una altra màquina. Per ara servirà per connectar-se a la VM des de la màquina hoste via ssh.
Si volem canviar el nom de la màquina, podem fer-ho editant el fitxer de configuració de hostnames obrint-lo en un editor amb la comanda
$sudo nano /etc/network/hostname
Hem de tenir en compte que cada màquina ha de ser fàcilment identificable, així que ens assegurarem de que cadascuna tingui un nom únic.
Ara, configurarem un segon adaptador de xarxa amb una IP estàtica. Per fer-ho haurem d’editar el fitxer de configuració d’interfícies de xarxa
$sudo nano /etc/network/interfaces
Que en obrir-lo s’hauria d’assemblar a una cosa així
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto enp0s3 iface enp0s3 inet dhcp
A continuació del fitxer, haurem d’afegir una nova secció que configuri un adaptador de xarxa secundari que ens assigni l’IP estàtica
# The secondary network interface auto enp0s8 iface enp0s8 inet static address 192.168.0.50 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255
Guardem el fitxer i sortim de l’editor. Amb aquest pas s’ha definit el segon adaptador de xarxa amb el nom enp0s8, que és estàtic i assigna l’adreça IP 192.168.0.50 al nostre servidor. Per a que els canvis siguin efectius, cal reiniciar la xarxa.
$sudo service networking restart
Per verificar que les dues interfícies funcionen correctament, podem executar la comanda
$hostname -I
Hauríem d’obtenir les dues IP, la primera assignada per DHCP i la segona estàtica.
192.168.1.55 192.168.0.50
Arribats a aquest punt, és un bon moment per crear els altres dos nodes del clúster. Fer-ho serà tan fàcil com clonar dues vegades la VM en la que hem estat treballant i modificar el hostname i l’adreça IP estàtica de les VM resultants.
A la finestra principal de VirtualBox, ubiquem el ratoli sobre la VM del primer node i premem el botó dret. Al menú desplegable seleccionarem l’opció “Clona“. S’obrirà una nova finestra on haurem de posar nom a la nova màquina virtual, node2, i hi indicarem que es “generin noves adreces MAC per a tots els adaptadors de xarxa“. A la finestra següent especificarem que volem realitzar una “clonació completa“.
Acte seguit, entrarem a les noves VM i modificarem els fitxers hostnames i interfaces per assignar-los els noms node2 i node3 i les IP estàtiques 192.168.0.51 i 192.168.0.52 respectivament. Ara hauríem de ser capaços de fer crides via ssh entre les màquines virtuals. Per exemple, per connectar-nos des del node1 al node2 executarem aquesta comanda.
xavi@node1:~$ ssh 192.168.0.51
Si es la primera vegada que ens connectem d’una màquina a l’altra, se’ns pregunarà si volem afegir-la a la llista de connexions de confiança, haurem d’escriure ‘yes’ i acceptar. Si la connexió dóna problemes proveu a reiniciar les màquines.
Ja tenim una xarxa de maquines virtuals que poden comunicar-se entre elles, però des de la màquina hoste (l’equip amb Windows 10 des d’on ho estem aixecant tot) som incapaços de connectar-nos via SSH a qualsevol d’aquestes tres màquines. Posem-hi solució.
Obrim un terminal de Windows i excutem la comanda
ipconfig /all
Obtindrem la informació de tots els dispositius de xarxa actius a la sessió de Windows. Ens interessen les dades del nostre dispositiu principal, que alhora serà el que sortia per defecte quaan configuravem la VM des del VirtualBox. El resultat hauria de ser similar a això:
Adaptador de LAN inalámbrica Wi-Fi: Sufijo DNS específico para la conexión. . : Descripción . . . . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 8260 Dirección física. . . . . . . . . . . . . : 44-85-00-E0-66-DB DHCP habilitado . . . . . . . . . . . . . : no Configuración automática habilitada . . . : sí Vínculo: dirección IPv6 local. . . : fe80::9c97:3ab5:1d63:d4da%24(Preferido) Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.37(Preferido) Máscara de subred . . . . . . . . . . . . : 255.255.255.0 Puerta de enlace predeterminada . . . . . : 192.168.1.1 IAID DHCPv6 . . . . . . . . . . . . . . . : 155485440 DUID de cliente DHCPv6. . . . . . . . . . : 00-01-00-01-1F-76-2C-B7-44-85-00-E0-66-DB Servidores DNS. . . . . . . . . . . . . . : 8.8.8.8 8.8.4.4 NetBIOS sobre TCP/IP. . . . . . . . . . . : habilitado
Prendrem nota d’aquests valors (podem fer-ne una captura o guardar-los en un document de text) per fer-los servir ens els següents passos.
Obrim el Centre de xarxes i recursos compartits de Windows i pitgem sobre el valor de connexions (al costat de les barres de cobertura de la xarxa Wi-Fi).
Entrem a Propietats per veure la finestra de propetats de al connexió wi-fi
Seleccionem Protocol d’Internet versió 4 (TCP/IPv4) de la llista i anem a Propietats. A la nova finestra que s’obrirà, normalment hi ha marcada l’opció d’obtenir una adreça IP de manera automàtica. Haurem de marcar la casella Utilitzar la sigüent direcció IP per poder introduir manualment els valors que hem obtingut i apuntat fa uns moments.
Completem tots els camps i acceptem els canvis per tancar la finestra. És probable que durant uns segons perdem la connexió a Internet, ja que la xarxa s’està reconfigurant.
Un cop recuperada la connexió a internet tornem a obrir la finestra de propietats que acabame de tancar per comprovar que tot segueix com ho havíem definit. Seguidament pitgem a Opcions avançades… per obrir una nova finestra.
A la secció d’adreces IP agregarem un nou registre amb la IP 192.168.0.49 i la màscara de xarxa 255.255.255.0. Aquesta acció unirà la nostra màquina a la xarxa privada del clúster.
Guardem els canvis i ja podem tancar totes les finestres de configuració de les connexions de xarxa. Ara ja hauríem de ser capaços de connectar-nos via SSH des de la màquina Windows a qualsevol de les tres VM configurades al nostre clúster.
Per obrir una connexió SSH des de Windows hi ha diversos programes disponibles. A mi m’agrada fer servir MobaXterm, que a més inclou un gestor sFTP per a les connexions obertes, facilitant així l’intercanvi de fitxers entre dispositius.
Per comprovar que la connexió es pot realitzar, ens hem d’asssegurar que les VM estan engegades i obrir un nou terminal a mobaXterm per connectar-nos al primer node introduint la comanda
ssh [nomUsuari]@192.168.0.50
Ja ens podem connectar a totes les màquines, però haver d’introduir la contrasenya cada vegada pot resultar incòmode. A més, si volem crear un clúster que realitzi tasques de manera automatitzada, ens interessa que les VM es reconeguin entre sí i que no donin cap tipus d’error quan intentin intercanviar paquets de dades. Per resoldre-ho, crearem les claus SSH de cada màquina i les compartirem amb les altres màquines del clúster.
Primer de tot hem de crear a totes les VM la carpeta on emmagatzemar tota la informació referent a les claus. Executarem les següents comandes a totes les màquines virtuals.
$ mkdir ~/.ssh $ chmod 700 ~/.ssh
Seguidament, cal crear les claus SSH de cada VM. Els següents passos caldrà que els realitzem a les tres VM.
Iniciem sessió al node1, executem la comanda:
$ ssh-keygen
I n’acceptem tots els valors que surten per defecte. Aquesta acció ens haurà creat una clau privada (id_rsa) i una clau pública (id_rsa.pub) al directori ~/.ssh.
Per evitar confusions quan haguem de compartir les claus entre les màquines, crearem una còpia de la clau on poguem veure’n el nom:
$ cp .ssh/id_rsa.pub .ssh/id_rsa_node1.pub
A través de la connexió SSH, enviarem la clau pública recentment generada a les altres màquines, a l’exemple l’enviarem del node1 al node2, i l’afegirem al fitxer de claus autoritzades.
$ scp ~/.ssh/id_rsa_node1.pub [nomUsuari]@192.169.0.51:~ $ ssh [nomUsuari]@192.168.0.51 $ cat ~/id_rsa_node1.pub >> ~/.ssh/authorized_keys $ chmod 644 ~/.ssh/authorized_keys $ exit
Arribats a aquest punt, el node1 hauria de poder connectar-se al node2 i al node3 sense demanar autenticació.
Repetim aquest procés per als altres 2 nodes per a que el clúster es pugui comunicar sense problemes. No oblideu renombrar les claus públiques per evitar confusions.
Ens interessa que el nostre equip es pugui connectar al clúster, però no volem que el clúster es connecti al nostre equip.
Per generar les claus de l’equip hoste seguirem els mateixos passos que hem utilitzat per crear les claus dels nodes fent ús de la tarminal de MobaXterm. A l’exemple les enviarem al node1, però també les haurem d’enviar als altres dos nodes modificant la IP al connectar-nos.
ssh-keygen cp ~/.ssh/id_rsa.pub ~/.ssh/id_rsa_win10.pub scp ~/.ssh/id_rsa_win10.pub [nomUsuari]@192.168.0.50:~ ssh [nomUsuari]@192.168.0.50 cat ~/id_rsa_win10.pub >> ~/.ssh/authorized_keys exit
Ara ja hauríem de ser capaços de connectar-nos lliurement a totes les VM del clúster.
Quan hem de treballar connectant-nos reiteradament entre nodes, treballar amb les IP pot generar confusions. Per tal d’estalviar-nos ensurts, podem assignar un àlies a cada IP del clúster de manera que ens poguem connectar via SSH amb una comanda de l’estil
$ ssh node2
Per aconseguir-ho, només cal modificar el fitxer de hosts de cada node:
$ sudo nano /etc/hosts
A continuació veiem l’exemple de com hauria de quedar el fitxer del node1
192.168.0.50 node1 192.168.0.50 localhost 127.0.0.1 localhost # cluster 192.168.0.49 win10 192.168.0.51 node2 192.168.0.52 node3
És important que es respecti aquest ordre en les IP i noms de node , ja que és l’ordre en que es resolen les peticions, altrament podríem tenir problemes quan treballessim amb un sistema de fitxers distribuït, com podria ser HDFS de Hadoop.
A aquestes alçades hauríem de tenir completament operatiu un clúster de 3 nodes instal·lats en màquines virtuals, capaços de comunicar-se automàticament entre ells i accessibles des d’un equip hoste a través de connexió SSH.
Aquesta configuració hauria de servir de base per configurar un sistema distribuït capaç de gestionar un ecosistema Hadoop, incloent HDFS, HBase i Spark.