Este primer tutorial trata de explicar los pasos necesarios para desplegar la librería XGBOOST sobre CentOS con soporte HDFS, y más concretamente sobre un clúster Hadoop / YARN, pues pese a existir la "Installation Guide" en su página principal sobre cómo hacerlo, ésta 'sólo' cubre los sistemas operativos Ubuntu/Debian, Windows y OSX.
Entorno
Entorno
Antes de pasar a realizar cualquier tipo de acción, me gustaría detallar cual es el entorno sobre el que voy a trabajar y desplegar la librería XGBOOST,
- CentOS 6.7
- Hortonworks Data Platform (HDP) v.2.4.2 => Hadoop v2.7.1
Requisitos
G++ >= 4.6
Decir que CentOS 6.7 dispone de un compilador GCC y G++ bastante 'desactualizados' en sus repositorios oficiales, por lo que recurrí al siguiente procedimiento para la instalación de una versión 'más reciente' y superior incluso a la requerida:
yum install wget git -y // En caso de no disponer previamente de estos paquetes
cd /etc/yum.repos.d
wget https://people.centos.org/tru/devtools-2/devtools-2.repo
Instalamos a continuación los siguientes paquetes:
devtoolset-2-gcc.x86_64
devtoolset-2-gcc-c++.x86_64
devtoolset-2-gcc-plugin-devel.x86_64
devtoolset-2-binutils.x86_64
devtoolset-2-binutils-devel.x86_64
Una vez instalados, comprobar la versión desplegada:
/opt/rh/devtoolset-2/root/usr/bin/gcc -v
…
gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC)
Python v2.7
Además, en CentOS 6.7, por defecto, el Python incluido en los repositorios suele ser el de la versión 'obsoleta' 2.6.6, por lo que también deberemos actualizarla para poder trabajar posteriormente con la librería XGBOOST. Las versiones aceptadas por XGBOOST son Python 2.7 o superior, o Python 3.4 o superior.
En mi caso vamos a recurrir a la versión 2.7.6 de Python:
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
cd /opt
wget --no-check-certificate https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
tar xf Python-2.7.6.tar.xz
cd Python-2.7.6
./configure --prefix=/usr/local
make && make altinstall
¡¡¡Importante!!! Usar altinstall en lugar de install porque sino acabaremos con dos versiones diferentes de Python instaladas en nuestro sistema y ambas nombradas Python.
Tras este tipo de instalación convivirán en nuestro sistema ambas versiones:
python -V
Python 2.6.6
python2.7 -V
Python 2.7.6
Pip 2.7
Para facilitar las futuras instalaciones de paquetes de Python, es aconsejable también actualizar la versión de Pip.
wget https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py
/usr/local/bin/python2.7 ez_setup.py
/usr/local/bin/easy_install-2.7 pip
Comprobamos su correcto funcionamiento gracias a la instalación del paquete argparse que será necesario posteriormente para ejecutar y obtener la ayuda del comando xgboost.
pip2.7 install argparse
Java
Debido a la instalación de la suite HDP de Hortonworks ya dispondremos de una versión de Java instalada en nuestro clúster, pero no viene mal repasar y asegurarse de su correcta instalación y configuración de las variables de entorno, $JAVA_HOME y $PATH.
[XGBOOST] XGBOOST con soporte HDFS
Una vez cumplidos con los requerimientos, podemos pasar a construir la librería compartida de XGBOOST sobre CentOS con soporte HDFS.
cd /usr/local
git clone --recursive https://github.com/dmlc/xgboost
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
cp make/config.mk ./config.mk
vim config.mk // Descomentar las siguientes líneas y modificar su contenido de acuerdo a:
export CC=/opt/rh/devtoolset-2/root/usr/bin/gcc
export CPP=/opt/rh/devtoolset-2/root/usr/bin/cpp
export CXX=/opt/rh/devtoolset-2/root/usr/bin/c++
USE_HDFS = 1
cd dmlc-core/
cp make/config.mk config.mk
vim config.mk // Descomentar las siguientes líneas y modificar su contenido de acuerdo a:
export CC=/opt/rh/devtoolset-2/root/usr/bin/gcc
export CPP=/opt/rh/devtoolset-2/root/usr/bin/cpp
export CXX=/opt/rh/devtoolset-2/root/usr/bin/c++
USE_HDFS = 1
cd /usr/local/xgboost
make clean_all
make -j4
make -j4
ls /usr/local/xgboost/lib/libxgboost.so
-rwxr-xr-x 1 root root 2374684 dic 15 16:48 lib/libxgboost.so
Una vez finalizada su construcción satisfactoriamente, deberemos editar el fichero dmlc-submit para que use la versión 2.7 de Python en lugar de la 2.6. Para ello bastará con modificar la primera línea de dicho fichero:
vim /usr/local/xgboost/dmlc-core/tracker/dmlc-submit
vim /usr/local/xgboost/dmlc-core/tracker/dmlc-submit
#!/usr/bin/env python2.7
Problema hdfs.h / libdmlc.a
En un primer intento a la hora de construir la librería, me surgió el error que podéis observar más abajo. Realmente el fallo no se debe a la falta del archivo o libreria libdmlc.a. Observando con detenimiento un poco más arriba del comentado error, detecté otro fallo "hdfs.h: No existe el fichero o el directorio" el cual desencadena el error final.
Problema:
In file included from src/io.cc:16:0:
src/io/hdfs_filesys.h:10:18: fatal error: hdfs.h: No existe el fichero o el directorio
#include <hdfs.h>
…
c++: error: dmlc-core/libdmlc.a: No existe el fichero o el directorio
make: *** [lib/libxgboost.so] Error 1
make: *** Se espera a que terminen otras tareas....
Solución: Me bastó con buscar la librería hdfs.h en el sistema y modificar la definición de la siguiente línea dentro del fichero de configuración dmlc.mk:
vim /usr/local/xgboost/dmlc-core/make/dmlc.mk
HDFS_INC_PATH=/usr/hdp/2.4.2.0-258/usr/includeProblema:
In file included from src/io.cc:16:0:
src/io/hdfs_filesys.h:10:18: fatal error: hdfs.h: No existe el fichero o el directorio
#include <hdfs.h>
…
c++: error: dmlc-core/libdmlc.a: No existe el fichero o el directorio
make: *** [lib/libxgboost.so] Error 1
make: *** Se espera a que terminen otras tareas....
Solución: Me bastó con buscar la librería hdfs.h en el sistema y modificar la definición de la siguiente línea dentro del fichero de configuración dmlc.mk:
vim /usr/local/xgboost/dmlc-core/make/dmlc.mk
Por útlimo, volvemos a ejecutar los comandos necesarios para construir la librería compartida de XGBOOST.
make clean_all
make -j4
[+Info] Para ver un ejemplo de su ejecución en modo YARN: XGBOOST & Hadoop/YARN (II): Ejemplo
[+Info] Para ver un ejemplo de su ejecución en modo YARN: XGBOOST & Hadoop/YARN (II): Ejemplo
0 comentarios:
Publicar un comentario