despliegue y pruebas en el servidor

Transcripción

despliegue y pruebas en el servidor
I+D+i
DESPLIEGUE Y PRUEBAS EN EL
SERVIDOR
BIG DATA
Autor: Oliver O.
1. DESPLIEGUE DE LA DISTRIBUCIÓN CLOUDERA
Como se explicaba en el artículo anterior (Conclusiones del Proyecto BIG
DATA) una vez configurado el clúster con la versión 12.04 de Ubuntu
y tras la instalación y configuración de la distribución de BIG DATA
proporcionada por Cloudera, el siguiente paso es el despliegue de dicha
distribución en el clúster, para lo que Cloudera proporciona un interface
gráfico por medio de un navegador web, lo que facilitará en gran medida el trabajo a partir de este punto.
indicar qué despliegue se desea realizar, en nuestro caso “Cloudera
Standard”, qué configuración del clúster se desea utilizar, seleccionando
en nuestro caso de un namenode y de cinco datanodes (todos los nodos
disponibles del clúster). Tras esto, se pregunta el tipo de servicio que se
desea instalar inicialmente, seleccionando “Hadoop Core” (que incluye
HDFS, MapReduce, Zookeeper, Oozie, Hive y Hue). Con estos datos se
finalizará la configuración del clúster y se realizará la instalación de los
servicios seleccionados:
Nada más acceder a la interface, se muestra un menú en el que se debe
HDFS
MAPREDUCE
ZOOKEEPER
HIVE
Hadoop Distributed
File System, está diseñado para almacenar
de forma fiable archivos muy grandes a
través de las máquinas
en un clúster grande.
Es el modelo de
programación para
Hadoop, hay procesos
map y procesos
reduce. Estos procesos
generalmente están
desarrollados en Java,
aunque se pueden
utilizar otros lenguajes
mediante una utilidad
llamada Hadoop
Streaming.
Administra la
sincronización del
clúster, aunque es una
herramienta que está
corriendo en background y sobre la que
no se accede de forma
directa.
Proporciona un
lenguaje similar a SQL
llamado HiveQL que
puede transformarse
en trabajos MapReduce. No permite beneficiarse de un completo
entorno ANSI-SQL,
pero sí ofrece una
escalabilidad multipetabyte.
HUE
Ofrece una interfaz
gráfica basada en
navegador web para
hacer su trabajo en
Hive.
OOZIE
Administra el flujo de
trabajo Hadoop. Esto
no reemplaza el planificador o herramientas
BPM, pero proporciona ramificación
if-then-else y control
dentro de los trabajos
Hadoop.
www.alten.es
BIG DATA
Una vez finalizado el despliegue en el clúster, se muestra una pantalla
principal donde aparecerán todos los servicios desplegados y el estado
de los mismos, debiendo asegurarnos que no se hayan producido
errores o warnings durante dicho despliegue, solventándolos en caso
de haberse producido.
FlumeNG: Es un cargador en tiempo real para el streaming de datos en
Hadoop. Almacena datos en HDFS y HBase. Ofrece una mejora sobre
la herramienta Flume inicial.
Al igual que antes, una vez instalado cada servicio la herramienta indica que servicios hay que reiniciar, siendo necesario finalmente realizar
un nuevo despliegue del clúster para que se apliquen correctamente
todos los cambios de configuración realizados.
En nuestro caso, tuvimos que realizar tres ajustes en la configuración:
El tamaño del heap del proceso de Java: hubo que modificarlo a los
valores por defecto (1Gb).
2. LA HERRAMIENTA HUE
La velocidad del interface de red: aunque por defecto viene a “Gigabit” hubo que ajustarlo a “fast”.
Impala no presente en Hue: hubo que acceder a la configuración de
Hue y marcar la opción de Impala Service a “none”.
Para cada una de estas modificaciones, la herramienta indica qué servicios se necesitan reiniciar o si es preciso realizar un nuevo despliegue
para que se apliquen los cambios. Finalmente, se obtendrá una pantalla principal sin alertas ni errores y con todos los servicios activos.
1.1/ AÑADIR NUEVOS SERVICIOS
En este punto, se irán añadiendo otros servicios al clúster que facilitarán las pruebas que se realizarán posteriormente:
HBase: Es un almacén de claves-valores escalable. Funciona muy parecido a un hash-map persistente. No es una base de datos relacional a
pesar de su nombre HBase.
Sqoop: Proporciona una transferencia de datos bidireccional entre
Hadoop (HDFS) y una base de datos relacional.
Solr: Es un servicio distribuido para los datos de indexación y búsqueda almacenados en HDFS.
La herramienta Hue, centraliza los portales y editores de todas las
herramientas instaladas en el clúster. Para acceder a ella se necesita establecer un túnel ssh, que haga corresponder el puerto local
127.0.0.1:8888 con la ip/puerto en el cual corre Hue; en nuestro caso
10.1.1.10:8888. Es entonces, cuando se puede acceder desde un
navegador web a la herramienta a través de una url del tipo: http://
localhost:8888/
Después de una pequeña configuración de la herramienta, donde se
pueden cargar ejemplos y modificar la base de usuarios, la herramienta estaría lista.
3. COLECCIÓN DE PRUEBAS
Para la realización de las pruebas, se descarga la base de datos de
muestra Sakila, y se carga tanto en la base de datos MySql (que utiliza
el clúster para almacenar su propia configuración) como en la base
de datos PostgreSQL (que instalaremos para dichas pruebas). Para la
realización de las diferentes pruebas es conveniente revisar la documentación relativa a la Shell de Hadoop para familiarizarse con los
comandos propios de los que dispone. Para ello podemos acceder a la
documentación oficial disponible en:
http://hadoop.apache.org/docs/r0.19.0/index.html
www.alten.es
BIG DATA
3.1/ PRUEBA UNO: PONER DATOS EN HDFS
El primer paso para utilizar Hadoop es poner los datos en HDFS. Para
la primera prueba, que se muestra a continuación, se recibe una copia
de un libro de Mark Twain y una de un libro de James Fenimore Cooper y se copian estos textos en HDFS.
Para ello descargamos dichos libros accediendo a la página http://
www.gutenberg.org mediante el comando wget, llamando después a
hadoop para que lleve ambos ficheros a HDFS mediante la sentencia:
hadoop fs -put <localsrc>...<dst>
3.2/ PRUEBA DOS: CONTADOR DE PALABRAS
La mayoría de los tutoriales de Hadoop utilizan el ejemplo del contador
de palabras que se incluye en el archivo de ejemplo jar de Hadoop.
Resulta que una gran parte del análisis consiste en contar y agregar. Es
por eso que aprovecharemos los ficheros cargados en la prueba uno,
para realizar esta prueba en nuestro clúster.
La ejecución del trabajo de conteo de palabras genera una gran cantidad de mensajes. Hadoop proporciona una gran cantidad de detalles
sobre las tareas de Mapeo y Reducción de los programas que ejecuta
en su nombre. El significado de cada uno de esos mensajes viene a
reflejar todo el trabajo realizado por Hadoop, en resumen muestra
información sobre:
o
Chequeo para ver si existe el archivo de entrada.
o
Chequeo para ver si el directorio de salida existe y en caso negativo, cancelar el trabajo. Nada peor que sobrescribir horas de
computación por un simple error de tecla.
o
Distribuye el archivo jar de Java para todos los nodos responsables de hacer el trabajo.
o
Ejecuta la fase de asignación del trabajo. Normalmente, éste
analiza el archivo de entrada y emite un par de clave-valor. Hay
que tener en cuenta que la clave y el valor pueden ser objetos.
o
Ejecuta la fase de clasificación, que ordena la salida del mapeador basada en la clave.
o
Ejecuta la fase de reducción, por lo general esto se sintetiza en el
flujo de clave-valor y escribir la salida a HDFS.
o
Creando muchas métricas sobre la marcha.
Desde la herramienta Hue se vería así:
3.3/ PRUEBA TRES: FLESCH KINCAID
En este caso de uso, Hadoop puede proporcionar cierta crítica literaria
haciendo una sencilla comparación entre los libros que habíamos
descargado anteriormente de Twain y Cooper. La prueba Flesch-Kincaid
calcula el nivel de lectura de un texto en particular. Uno de los factores
en este análisis es la longitud media de la frase aunque el análisis sintáctico de frases resulta ser más complicado que sólo buscar el carácter
punto. El paquete OpenNLP y el paquete Python NLTK, tienen excelentes programas de análisis de frases. Para este ejemplo, se utilizará la
longitud de la palabra como un sustituto para el número de sílabas en
una palabra.
Como se ha comentado en alguna ocasión, no es necesario conocer
Java para programar trabajos de MapReduce. En este ejemplo de MapReduce se utiliza Hadoop Streaming para procesar un “map” escrito
en Python y un “reduce” usando AWK para obtener la crítica literaria.
Los comandos para ello serían:
hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/
hadoop-streaming-2.0.0-mr1-cdh4.6.0.jar -input Twain.txt -output Tstats
-file ./mapper.py -file ./statsreducer.awk -mapper ./mapper.py -reducer
./statsreducer.awk
hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.6.0.jar -input Cooper.txt -output Cstats
-file ./mapper.py -file ./statsreducer.awk -mapper ./mapper.py -reducer
./statsreducer.awk
Las longitudes de las palabras se clasifican en orden numérico y se presentan al reductor de forma ordenada. En los ejemplos obtenidos vemos
que la clasificación de los datos está integrada en la infraestructura de
MapReduce, aunque no se requiere para obtener la salida correcta.
Tras el análisis de ambos textos, los fans de Mark Twain, felizmente
pueden relajarse sabiendo que Hadoop encuentra que Cooper usa
palabras más largas, con una desviación estándar impactante. Eso, por
supuesto, asumiendo que las palabras más cortas son mejores.
3.4/ PRUEBA CUATRO: MOVER DATOS DE HDFS A MYSQL
CON SQOOP
El Proyecto Sqoop es un proyecto Apache basado en JDBC de código
abierto para el movimiento de datos entre base de datos y Hadoop.
Sqoop fue creado originalmente en un hackathon en Cloudera y después paso a código abierto.
Mover datos de HDFS a una base de datos relacional es un caso de
uso común. HDFS y Map-Reduce son muy buenos para hacer el trabajo
pesado. Para consultas sencillas o almacenamiento de back-end de un
sitio web, almacenamiento en caché de la salida Map-Reduce en un
almacén relacional es un buen patrón de diseño. Se puede evitar volver
a ejecutar el Map-Reduce del contador de palabras con sólo Sqooping
los resultados en MySQL.
En esta prueba se van a pasar los datos que se han generado anteriormente sobre Twain y Cooper a una base de datos relacional previamente creada utilizando Sqoop, con una llamada parecida a esta:
www.alten.es
BIG DATA
sqoop export -D sqoop.export.records.per.statement=1 --connect
“jdbc:mysql://localhost/mydemo” --table wordcount --fields-terminatedby ‘\t’ --username userDemo --password pass1 --export-dir /user/userDemo/HF.out
Finalmente, los datos estarán cargados en la base de datos y se podrán
visualizar mediante una consulta del tipo:
select * from wordcount;
3.5/ PRUEBA CINCO: IMPORTAR DATOS EN HDFS DESDE
MYSQL O PROSTGRESQL CON SQOOP
Sqoop también permite insertar datos en Hadoop HDFS, la funcionalidad bidireccional se controla a través del parámetro de importación.
La base de datos de ejemplo que viene con el producto tiene algunos
conjuntos de datos simples que se pueden utilizar para este propósito.
Para importar datos desde una base de datos MySql mediante Sqoop
se utilizará una llamada como ésta:
3.6/ PRUEBA SEIS: UNIR DATOS MYSQL A DATOS POSTGRESQL MEDIANTE HIVE
Esta prueba consiste en unificar datos de MySQL y datos de PostgreSQL . No es un ejemplo especialmente relevante para las dos tablas
triviales que se usarán en el ejemplo, pero sí será de gran importancia
cuando existan múltiples terabytes o petabytes de datos a tratar.
Existen dos enfoques fundamentales para unir diferentes fuentes de
datos. Dejando los datos en reposo y utilizar una tecnología frente a
mover los datos a un único almacenamiento para realizar la unión. Por
lo económico de Hadoop y por su rendimiento, la opción de mover los
datos en HDFS y realizar el trabajo pesado con MapReduce resulta
una elección sencilla ya que las limitaciones de ancho de banda de red
crearían una barrera fundamental si se tratara de unir datos en reposo
con otra tecnología.
Y para realizar esa misma importación de datos mediante Sqoop, pero
desde una base de datos PostgreSQL, se modificaría la llamada para
ajustar los datos de conexión de la nueva base de datos:
Para usar el lenguaje de consulta de Hive, existe un subconjunto de
SQL llamado Hiveql que requiere los metadatos de la tabla. Hive puede
definir los metadatos con los archivos existentes en HDFS, para esto,
Sqoop proporciona un atajo muy conveniente con la opción create-hivetable. Hive no proporciona las semánticas de transacción y no es un
reemplazo para MySQL o PostgreSQL, pero si se tiene algún trabajo
pesado en forma de uniones de tablas, incluso si se tienen algunas
tablas más pequeñas, o si se tienen que hacer productos cartesianos
desagradables, Hadoop es la herramienta de elección.
sqoop import --connect jdbc:postgresql://localhost:5432/dvdrental
--table language --username userDemo --password ****
Para realizar esta prueba se puede utilizar la consola del clúster o bien
la herramienta Hue y su interfaz gráfica en el navegador.
Para ambos casos, se puede observar que se obtienen los siguientes
ficheros resultantes:
En ambos casos se importarán los datos desde MySql y desde PostgreSQL (tal y como se realizó anteriormente), y se utilizará Hive para crear
dos tablas, que interpretarán los datos contenidos en cada uno de esos
dos ficheros. Una vez creadas dichas tablas, bastará realizar el join de
ambas para obtener la unión de los datos.
sqoop import --connect “jdbc:mysql://localhost/sakila” --table language
--username userDemo --password ****
hadoop fs -ls language
Found 6 items
0 2014-04-14 15:06 language/_SUCCESS
0 2014-04-14 15:05 language/_logs
90 2014-04-14 15:06 language/part-m-00000
45 2014-04-14 15:06 language/part-m-00001
45 2014-04-14 15:06 language/part-m-00002
90 2014-04-14 15:06 language/part-m-00003
¿Por qué hay cuatro archivos diferentes? ¿Cada uno de ellos contiene
sólo una parte de los datos?
La explicación radica en que Sqoop es una utilidad altamente parale-
Para importar la tabla staff de PostgreSQL de la BD dvdrental en hdfs:
sqoop import --connect jdbc:postgresql://localhost:5432/dvdrental
--table staff --username userDemo --password pass1
Para importar la tabla customer de MySQL de la BD sakila en hdfs:
sqoop import --connect “jdbc:mysql://localhost/sakila” --table customer
--username userDemo --password pass1
Ahora simplemente habría que crear las tablas y realizar el join correspondiente mediante el lenguaje sql clásico.
lizada que tiene un límite por defecto de cuatro conexiones JDBC. Por
eso existen cuatro ficheros de datos en HDFS, generados por cada una
de las conexiones.
www.alten.es
BIG DATA
3.7/ PRUEBA SIETE: UNIFICAR DATOS DE POSTGRESQL Y
MYSQL MEDIANTE PIG
Pig es un lenguaje procedural que al igual que Hive, por detrás genera
código MapReduce. Para esta prueba, se unirá la tabla de clientes y
la tabla de gerentes de la prueba anterior, pero en esta ocasión con la
ayuda de la herramienta Pig. De la misma manera que en la prueba
anterior, aunque se puede trabajar sobre la línea de comandos, hay
varias interfaces gráficas de usuario (como Hue) que funcionan muy
bien con Hadoop.
Con el acceso NFS a HDFS, se puede montar el clúster HDFS como un
volumen en los equipos cliente y tener una línea de comandos nativa,
secuencias de comandos o la interfaz de usuario del explorador de
archivos para ver los archivos HDFS y cargar datos en HDFS.
En esta prueba, se realiza la instalación y configuración de esta herramienta, para ello hay que descargarlo mediante el comando “apt-get
install hadoop-hdfs-fuse”. A continuación se crea la carpeta fusemnt y
se define un punto de montaje con el comando “hadoop-fuse-dfs dfs://
namenode:8020 /fusemnt”. Una vez montado, ya se pueden ejecutar
operaciones como si estuvieran en el punto de montaje.
3.9/ PRUEBA NUEVE: CREAR UN ARCHIVO LISTO PARA
CARGAR CON FLUME (INYECTOR DE DATOS)
Flume es un servicio distribuido para agregar y mover grandes cantidades de datos a HDFS. Cuenta con una arquitectura simple y flexible
basada en el streaming de flujos de datos.
3.8/ PRUEBA OCHO: ACCEDER A LOS ARCHIVOS HDFS A
TRAVÉS DE NFS MEDIANTE FUSE
El sistema de archivos de red (NFS) es un protocolo de sistema de
archivos distribuido que permite el acceso a archivos en un equipo
remoto en una manera similar a cómo se accede al sistema de archivos
local. Con una puerta de enlace para NFS Hadoop, se permite así a
las aplicaciones basadas en archivos realizar operaciones de lectura y
escritura operaciones directamente sobre Hadoop, simplificando enormemente la gestión de datos y ampliando la integración de Hadoop en
conjuntos de herramientas existentes.
En esta prueba se define un fichero para ser inyectado en la base de
datos MySQL, para ello seleccionamos el fichero “part_m_00001”
generado en una de las anteriores pruebas y modificamos el fichero de
configuración de Flume “flumeconf/hdfs2dbloadfile.conf” para asignar
el fichero seleccionado como primer agente. Una vez configurado, se
lanza la inyección de datos mediante el comando “flume-ng agent -f ./
flumeconf/hdfs2dbloadfile.conf -n agent1” y podremos observar cómo
los datos contenidos en el fichero se cargaron en la base de datos.
www.alten.es
BIG DATA
3.10/ PRUEBA DIEZ: AÑADIENDO FLUJO DE TRABAJO PARA
MÚLTIPLES TAREAS CON OOZIE
Oozie es un sistema de planificación de flujos de trabajo para
gestionar los trabajos de Hadoop. Es un motor basado en un servidor
especializado en la gestión de flujos de trabajo con las acciones que se
ejecutan en MapReduce y Pig.
En esta prueba, Oozie encadenará a voluntad varios trabajos de
Hadoop. Para ello se utilizará un buen conjunto de ejemplos incluidos
en el fichero oozie-examples.tar.gz, contenido en la propia distribución
de Cloudera.
El primer paso será modificar el workflow de sqoop para que use nuestra base de datos de ejemplo y modificar el fichero de configuración
“examples/apps/sqoop/job.properties” para ajustarlo a las pruebas
que vamos a realizar. Una vez configurado, se cargan los ejemplos en
HDFS y se remiten los trabajos a Oozie:
3.11/ PRUEBA ONCE: HBASE
HBase es un almacén de clave-valor de alto rendimiento. Si el caso de
uso requiere escalabilidad y sólo requiere de la base de datos el equivalente a las transacciones de confirmación automática, HBase hace
realmente un excelente trabajo en el almacenamiento de clave-valor de
alto rendimiento y fácilmente puede ser la tecnología a usar.
Esta última prueba usará la interfaz REST ofrecida con HBase para
insertar clave-valores en una tabla HBase mediante llamadas curl. Esta
prueba es el código para dar conocimientos básicos de Hbase. Es
simple por su diseño y de ninguna manera representa el alcance de
la funcionalidad de HBase. Para conocer todas sus funcionalidades es
recomendable la lectura del libro “HBase, The Definitive Guide“, de
Lars George.
Para la prueba, los pasos a realizar desde la interface Shell serían:
o Acceder a la línea de comandos mediante “hbase shell”
o Crear una tabla con una única columna
o Insertar un registro en esa tabla
o Ver la descripción de la tabla con “describe ‘mytable’ ”
o Escanear la tabla con “scan ‘mytable’ ”
Desde la interface REST:
o Comprobar el estado del servidor mediante “curl http://namenode:20550/status/cluster”
o Escanear el contenido de la tabla que habíamos creado
mediante “curl http://namenode:20550/mytable/*”
- Este escaneo proporciona el schema necesario para
poder insertar datos en la tabla de Hbase
o Añadir con curl una entrada mediante “RESTinsertedKey”
o Comprobar desde la interface Shell que el dato fue insertado
correctamente mediante “scan ‘mytable’ ”
En la interface web se visualizaría así:
www.alten.es

Documentos relacionados