Infrastructure as Code – AWS Redshift (Boto3)

The following is an example/template of Infrastructure as Code (IAC) for deploying an AWS Redshift cluster using Python and Boto3. Here’s the target architecture:

Target Redshift AWS Architecture

For this to work, you will need to create an AWS account and IAM user with appropriate permissions to Redshift and S3. After that, just input your own user secret and key into the attached notebook.

You can download the ipynb notebook. Or just check the Jupyter notebook below:

On the next post, we will discuss how to Extract, Transform and Load (ETL) data into this Redshift Database via parallel imports using S3.

Hadoop – Ejemplos de hadoop-mapreduce-examples.jar

Hadoop MapReduce Una de las formas tradicionales de asegurarnos que un ambiente de Hadoop recién instalado funciona correctamente, es ejecutando el siempre presente jar de ejemplos map-reduce incluido con toda instalación de hadoop. Hablamos del hadoop-mapreduce-examples.jar.

 

En este tutorial, haremos un ejercicio que consiste en encontrar todas las apariciones de una palabra usando una expresión regular. Para hacerlo, crearemos un directorio llamado input en nuestro directorio de inicio y copiaremos los archivos de configuración (los xml) de Hadoop para usar esos archivos como nuestros datos de entrada.

Nota: la tilde (~) es un atajo muy útil en Bash para no tener que escribir la ruta de nuestra carpeta de usuario.

mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

A continuación, podemos usar el siguiente comando para ejecutar el programa (jar) hadoop-mapreduce-examples, un archivo Java con varias opciones. Invocaremos grep, uno de los muchos ejemplos incluidos en hadoop-mapreduce-examples, seguido por el directorio de entrada inputy el directorio de salida grep_example. El programa MapReduce grep contará las coincidencias de una palabra literal o expresión regular. Finalmente, proporcionaremos una expresión regular para encontrar ocurrencias de la palabra principaldentro o al final de una oración declarativa. La expresión distingue entre mayúsculas y minúsculas, por lo que no encontraríamos la palabra si estuviera en mayúscula al comienzo de una oración:

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar grep ~/input ~/grep_example 'principal[.]*'

El comando consta de las siguientes partes:

  1. /usr/local/hadoop/bin/hadoop Es el directorio donde esta el ejecutable de hadoop en el sistema.
  2. jar Le indica a hadoop que deseamos ejecutar una aplicacion empaquetada de Java. (Jar)
  3. /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar Es la ruta donde esta el Jar que deseamos ejecutar. Note que la versión del jar depende de la versión de hadoop instalada.
  4. grep Es un parámetro de los muchos que se le pueden pasar al Jar de ejemplos que trae Hadoop. grep sirve para encontrar y contar ocurrencias de strings haciendo uso de expresiones regulares. Para ver una lista de los ejemplos que trae, click aquí.
  5. ~/input El directorio de entrada. Es donde el programa va a buscar los archivos de entrada a la tarea de map-reduce. Aquí copiamos unos archivos de prueba en un comando anterior.
  6. ~/grep_example El directorio de salida. Es donde el programa va a escribir el resultado de la corrida de la aplicación. En este caso, la cantidad de veces que la palabra del parámetro siguiente, aparece en los archivos de entrada.
  7. ‘principal[.]*’ Es la expresión regular que deseamos buscar. Esta expresión regular en particular coincide con la palabra ‘principal’ y ‘principal.’ (con y sin punto al final). Si desean saber un poco mas de expresiones regulares, les recomiendo este sitio web.

Cuando la tarea finaliza, proporciona un resumen de lo que se ha procesado y los errores que ha encontrado, pero esto no contiene los resultados reales.

. . .
 File System Counters
 FILE: Number of bytes read=1247674
 FILE: Number of bytes written=2324248
 FILE: Number of read operations=0
 FILE: Number of large read operations=0
 FILE: Number of write operations=0
 Map-Reduce Framework
 Map input records=2
 Map output records=2
 Map output bytes=37
 Map output materialized bytes=47
 Input split bytes=114
 Combine input records=0
 Combine output records=0
 Reduce input groups=2
 Reduce shuffle bytes=47
 Reduce input records=2
 Reduce output records=2
 Spilled Records=4
 Shuffled Maps =1
 Failed Shuffles=0
 Merged Map outputs=1
 GC time elapsed (ms)=61
 Total committed heap usage (bytes)=263520256
 Shuffle Errors
 BAD_ID=0
 CONNECTION=0
 IO_ERROR=0
 WRONG_LENGTH=0
 WRONG_MAP=0
 WRONG_REDUCE=0
 File Input Format Counters
 Bytes Read=151
 File Output Format Counters
 Bytes Written=37

Nota: Si el directorio de salida ya existe, el programa fallará, y en lugar de ver el resumen, la salida se verá algo así como:

 . . .
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

Los resultados se almacenan en el directorio de salida (~/grep_example/) y se pueden verificar ejecutando caten el directorio de salida:

cat ~/grep_example/*
 6 principal
 1 principal.

La tarea MapReduce encontró una aparición de la palabra principal seguida de un punto y seis apariciones en las que no estaba el punto. La ejecución del programa de ejemplo ha verificado que nuestra instalación autónoma (standalone, un solo servidor) funciona correctamente y que los usuarios no privilegiados del sistema pueden ejecutar Hadoop para su exploración o depuración.

Otros Ejemplos de Hadoop MapReduce

Vale la pena probar otros ejemplos contenidos en el jar, como por ejemplo:

  • Terasort: Se usa normalmente para hacer Benchmarking en clusters de hadoop.
  • PI: Calcula los decimales de PI usando MapReduce!

Python, primero en el ranking de la IEEE

Fuente: IEEE

Python ha continuado su trayectoria ascendente desde el año pasado y saltó dos lugares a la ranura N º 1, aunque los cuatro primeros (Python, C, Java y C++) – siguen estando muy cerca de popularidad.

Sin embargo, por segundo año consecutivo, no se han introducido nuevos idiomas en el ranking:

Parece que hemos entrado en un período de consolidación en la codificación como programadores digerir las herramientas creadas para atender a la explosión de la nube, móviles y grandes aplicaciones de datos.

Fuente: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017

Referencia Rápida: Scikit-learn de Python

Scikit-learn es una librería de código abierto para Python, que implementa un rango de algoritmos de Machine Learning, pre-procesamiento, referencias cruzadas y visualización usando una interfaz unificada.

Un Ejemplo Básico

from sklearn import neighbors, datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X, y = iris.data[:, :2], iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33)
scaler = preprocessing.StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
knn = neighbors.KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy_score(y_test, y_pred)

Cargar la data

Nuestra data debe ser numérica y estar almacenada como arreglos de NumPy o matrices de SciPy. Otro tipo de data que pueda convertirse en arreglos numericos tambien se aceptan, como los DataFrames de Panda.

import numpy as np
X = np.random.random((10,5))
y = np.array(['M','M','F','F','M','F','M','M','F','F','F'])
X[X < 0.7] = 0 Preprocessing The Data Standardization
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X_train)
standardized_X = scaler.transform(X_train)
standardized_X_test = scaler.transform(X_test)
NORMALIZACIÓN
from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(X_train)
normalized_X = scaler.transform(X_train)
normalized_X_test = scaler.transform(X_test)
BINARIZACIÓN
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0.0).fit(X)
binary_X = binarizer.transform(X)
CODIFICAR ATRIBUTOS CATEGÓRICOS
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
y = enc.fit_transform(y)
IMPUTAR VALORES FALTANTES
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit_transform(X_train)
GENeraR atributos polinomiales
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(5)
oly.fit_transform(X)
entrenaR y probaR la data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)

Crear el Modelo

Estimadores Supervisados

REGRESIÓN lineal
from sklearn.linear_model import LinearRegression
lr = LinearRegression(normalize=True)
Support Vector Machines (SVM)
from sklearn.svm import SVC
svc = SVC(kernel='linear')
Naive Bayes
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
KNN
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier(n_neighbors=5)

Estimadores No Supervisados

ANÁLISIS de Componente principal (PCA)
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)
K Means
from sklearn.cluster import KMeans
k_means = KMeans(n_clusters=3, random_state=0)

Ajustar el Modelo

Aprendizaje supervisado
lr.fit(X, y)
knn.fit(X_train, y_train)
svc.fit(X_train, y_train)
aprendizaje no supervisado
k_means.fit(X_train)
pca_model = pca.fit_transform(X_train)

Predecir

 

estimadores supervisados
y_pred = svc.predict(np.random.random((2,5)))
y_pred = lr.predict(X_test)
y_pred = knn.predict_proba(X_test))
estimadores no supervisados
y_pred = k_means.predict(X_test)

Evaluar el Desempeño del Modelo

Métricas de Clasificación

puntaje de exactitud
knn.score(X_test, y_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
reporte de CLASIFICACIÓN
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred)))
matriz de CONFUSIÓN
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred)))

Métricas de Regresión

error absoluto promedio
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2])
mean_absolute_error(y_true, y_pred))
error medio cuadrado
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred))
puntaje R2
from sklearn.metrics import r2_score
r2_score(y_true, y_pred))

Metricas de Agrupacion

ÍNDICE Ajustado en Radianes
from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(y_true, y_pred))
Homogeneidad
from sklearn.metrics import homogeneity_score
homogeneity_score(y_true, y_pred))
V-measure
from sklearn.metrics import v_measure_score
metrics.v_measure_score(y_true, y_pred))
VALIDACIÓN cruzada
print(cross_val_score(knn, X_train, y_train, cv=4))
print(cross_val_score(lr, X, y, cv=2))

Ajustar el Modelo

BÚSQUEDA de Cuadrillas
from sklearn.grid_search import GridSearchCV
params = {"n_neighbors": np.arange(1,3), "metric": ["euclidean", "cityblock"]}
grid = GridSearchCV(estimator=knn,param_grid=params)
grid.fit(X_train, y_train)
print(grid.best_score_)
print(grid.best_estimator_.n_neighbors)
OPTIMIZACIÓN DE PARÁMETROS ALEATORIZADOS
from sklearn.grid_search import RandomizedSearchCV
params = {"n_neighbors": range(1,5), "weights": ["uniform", "distance"]}
rsearch = RandomizedSearchCV(estimator=knn,
param_distributions=params,
cv=4,
n_iter=8,
random_state=5)
rsearch.fit(X_train, y_train)
print(rsearch.best_score_)

Tomado DataCamp, donde hay una version descargable muy practica para imprimir y tener a la mano!.

Contenedor Docker: Herramientas de Big Data

Para todos los que trabajamos con Big Data, es evidente que uno de los mayores retos es la configuración y puesta a punto de un ambiente funcional. Por mucho tiempo, la solución rápida para esto han sido las imágenes de sistemas para su virtualización. Sin embargo, existe una mejor solución: Los contenedores de Docker.

Les comparto un contenedor Docker que tiene el ambiente  Big Data mas usado en la actualidad:

  • Apache Hadoop (HDFS & YARN).
  • Apache Spark.
  • Apache Hive (on Spark).
  • Python 3 y herramientas para HDFS.

Descargar haciendo click en la imagen!

 

Para instalar directamente desde los repositorios de Docker:

docker build  -t sequenceiq/hadoop-docker:2.7.1 .
docker pull sequenceiq/spark:1.6.0

Spark y Project Tungsten

Sin duda alguna, Spark es el nuevo gran protagonista en la escena Big Data. La meta de Spark siempre ha sido ofrecer una plataforma unica donde los usuarios puedan obtener los mejores algoritmos distribuidos para cualquier tarea de procesamiento de datos.spark-logo-trademarkPara hacer esto, Spark cuenta con una herramienta llamada RDD, o Resilient Distributed Dataframe. Sin embargo los RDD’s han sido completamente mejorados con Project Tungsten. Los beneficios de Tungsten podran verse a partir de Spark V 1.6+ y lo mejor: Cloudera Manager lo tiene disponible desde la version 5.8.

Acceder data en HDFS desde Python

Cuando se trabaja con Big Data, independientemente de si usamos Spark o trabajos Map-Reduce, generalmente nos encontraremos con el sistema de archivos distribuidos de Hadoop, HDFS.

El problema con HDFS siempre ha sido que acceder/modificar la data es un proceso tedioso, que casi siempre involucra realizar comandos dfs en una consola. Esto dificulta muchísimo automatizar scripts (a excepción de shell scripts) para realizar nuestras consultas.  Por esta razón, el equipo de Hadoop creó HttpFs, el cual es un portal hacia HDFS haciendo uso de servicios Rest que corren en el Namenode.

hdfsstatus

Para Python, les recomiendo el excelente proyecto Open-Source HdfsCLIEl mismo no es más que una atadura al propio servicio de HttpFS (y WebHDFS) que provee la mayoría de los métodos relevantes a través de un API y una interfaz de CLI.

La documentación está disponible en: https://hdfscli.readthedocs.io/en/latest/