Compilar Hadoop para 64 bits

A estas aĺturas creo que todos sabemos lo que es Hadoop: el framework principal para el almacenamiento y procesamiento del Big Data en clusters de commodity hardware. Su versión 2 incorpora YARN (Yet Another Resource Negociator), que extiende las funcionalidades de Hadoop permitiéndolo ir más allá de la ejecución de trabajos MapReduce. YARN actúa como planificador del cluster gestionando la ejecución cualquier tipo de aplicaciones (MapReduce, MPI, servidores, etc.) y proporcionando las ventajas de Hadoop: distribución de carga, minimización del tráfico de red (la aplicación va a los datos, no al revés), replicación de datos, tolerancia a fallos,  etc.

Hacer una instalación básica de Hadoop es muy simple. Hadoop es una aplicación Java, y basta con descargar la release que queramos de http://hadoop.apache.org/releases.html (en estos momentos, la última es la 2.4.0) en formato tar.gz, descomprimirla, y empezar a trabajar. Alternativamente, se pueden obtener paquetes que incluyen Hadoop y otras aplicaciones de su ecosistema, con todo instalado como las que ofrecen Cloudera (última versión CDH5), Hortonworks (última versión HDP 2.1) o MapR (última versión MapR 4.0).  También aplicaciones como Apache Ambari permiten desplegar un cluster Hadoop en cuestión de minutos (incluyendo herramientas como Nagios y Ganglia para monitorizarlo).

En cualquier casi, si queremos un mayor control sobre el software instalado, lo mejor es descargar la release desde hadoop.apache.org y seguir los pasos indicados en la documentación (http://hadoop.apache.org/docs/r2.4.0/ para la última versión), ya sea para instalar un único nodo de prueba o un cluster completo.

Si lo hacemos así, un problema que nos puede surgir es que, al probar nuestra reluciente instalación nos encontremos con el siguiente warning:

$ hadoop fs -ls /
OpenJDK 64-Bit Server VM warning: You have loaded library /opt/yarn/hadoop-2.4.0/lib/native/libhadoop.so.1.0.0-32b which might have disabled stack guard. The VM will try to fix the stack guard now.
It’s highly recommended that you fix the library with ‘execstack -c <libfile>’, or link it with ‘-z noexecstack’.
14/06/02 18:32:18 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

¿Es preocupante este warning? ¿a qué se debe? En principio el warning no impide que todo funcione sin problemas, pero puede suponer una perdida de rendimiento importante. Se debe a que, a pesar de ser una aplicación Java, algunas funcionalidades de Hadoop tienen implementaciones nativas por razones de rendimiento (ver http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/NativeLibraries.html). Una de las funcionalidades afectadas es el manejo de ficheros comprimidos, de gran importancia cuando trabajamos con datos realmente Big (ver esta presentación para un análisis de los mecanismos de compresión usados en Hadoop).

Estas funcionalidades nativas se encuentran disponibles en una única librería, libhadoop.so, localizada en $HADOOP_HOME/lib/native. El warning anterior es debido a que en la release de Hadoop que descargamos desde la página oficial, esta librería está compilada para 32 bits, por lo que no funciona en nuestro sistema de 64 bits. La solución pasa por obtener una versión en 64 bits de esa librería, o compilarla en nuestro sistema.

Lo que vamos a hacer, entonces, es compilar Hadoop desde los ficheros fuente en un sistema CentOS 6.5 de 64 bits.  Es un proceso relativamente simple, pero hay que tener en cuenta las dependencias. También necesitamos bastante espacio de disco (el código fuente compilado ocupa más de 5GB) y tiempo, pues lleva un rato largo.

Pasos:

1. Obtener el código fuente de http://hadoop.apache.org/releases.html (la última versión a 5 de junio es la 2.4.0, fichero hadoop-2.4.0-src.tar.gz) y descomprimirlo (tar xvzf hadoop-2.4.0-src.tar.gz).

2. Instalar el software necesario para la compilación. Necesitamos:

a. JDK 1.6+. Sirve el OpenJDK. Instalamos con yum la versión 1.7

$ su # recordad que sudo es para cobardes!
# yum -y install java-1.7.0-openjdk-devel

b. Compilador de C, C++ para compilar el código nativo (en caso de que no las tengamos ya instaladas) y librerías adicionales (no indicadas en la documentación pero necesarias).

# yum -y install gcc gcc-c++ gawk
# yum -y install zlib-devel openssl-devel

c. CMake 2.6+. Se pueden instalar directamente con yum la versión 2.6.4

# yum -y install cmake

d. Maven 3.0+, para compilar el proyecto. No está disponible como paquete en los repositorios principales, pero es facilmente instalable:

# cd /usr/local/
# wget http://ftp.cixug.es/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
# tar xvzf apache-maven-3.2.1-bin.tar.gz
# ln -s apache-maven-3.2.1 apache-maven
# cd bin
# ln -s ../apache-maven/bin/mvn
# echo ‘export M2_HOME=/usr/local/apache-maven’ > /etc/profile.d/apache-maven.sh
# echo ‘export M2=$M2_HOME/bin’ >> /etc/profile.d/apache-maven.sh
# echo ‘setenv M2_HOME /usr/local/apache-maven’ > /etc/profile.d/apache-maven.csh
# echo ‘setenv M2 $M2_HOME/bin’ >> /etc/profile.d/apache-maven.csh
# exit
$ . /etc/profile.d/apache-maven.sh # si usamos bash
$ mvn -version #probamos que funciona

e. ProtocolBuffer 2.5.0. Protocol Buffers (o protobuf) es un formato de serialización de datos de Google, similar a Apache Thrift o Apache Avro. Google usa protobuf en casi todos sus protocolos RPC internos y formatos de fichero. Tenemos que compilarlo desde las fuentes:

$ cd; wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
$ tar xjf protobuf-2.5.0.tar.bz2; cd protobuf-2.5.0
$ ./configure
$ make
$ su -c ‘make install’

f. Snappy (opcional). Snappy es una librería de compresión/decompresión rápida de Google. Su instalación es opcional, pero por completitud es interesante tenerla. La versión disponible en los repositorios nos sirve

# yum -y install snappy-devel

g. Findbugs 1.3.9 (opcional?), un programa para encontrar bugs en Java. En teoría, su instalación es opcional, pero a mi no me funcionó la compilación de Hadoop sin ese programa. Podemos bajar el código ya compilado (Java).

$ cd /usr/local; su
# wget http://prdownloads.sourceforge.net/findbugs/findbugs-2.0.3.tar.gz
# tar xzf findbugs-2.0.3.tar.gz
# echo ‘export FINDBUGS_HOME=/usr/local/findbugs-2.0.3’ > /etc/profile.d/findbugs.sh
# echo ‘setenv FINDBUGS_HOME /usr/local/findbugs-2.0.3’ > /etc/profile.d/findbugs.csh
# exit
$ cd; . /etc/profile.d/findbugs.sh

4. Ya podemos pasar a crear la distribución de Hadoop para nustro sistema (saltándonos los tests, que llevan mucho tiempo, e incluyendo la documentación). En cualquier caso, la lleva su buen rato (unos 40 minutos).

$ cd; cd hadoop-2.4.0-src
$ mvn package -Pdist,native,docs -DskipTests -Dtar -Drequire.snappy

Una vez terminado, en el directorio hadoop-dist/target tendremos el fichero hadoop-2.4.0.tar.gz con las librerías nativas compiladas para 64 bits y también la documentación en hadoop-dist-2.4.0-javadoc.jar.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *