Download - 07.RHadoop
Data Science con R RHadoop
Diego J. Bodas Sagi – Julio de 2014
Data Science con R
Índice
Introducción RHadoop Instalación Interacción con HDFS Primeros ejemplos Trabajando con ficheros csv Ejercicio Rhadoop Regresión logística y clustering Resumen
2
Data Science con R
RHadoop
By Revolution Analytics (proveedor comercial líder de software para R) Se compone de tres paquetes independientes: • rhdfs: proporciona acceso a HDFS • rmr: permite ejecutar programas MapReduce (nueva
versión disponible rmr2) • rhbase: permite interactuar con Hbase
Además, tenemos algunos paquetes auxiliares • quick check: para depuración de procesos MapReduce
lanzados a través del paquete rmr • plyrmr: facilita operaciones de combinación y
manipulación de grandes conjuntos de datos. Buena eficiencia en algunas operaciones (superior a SQL)
3
Data Science con R
Preparación del entorno
Algunos elementos necesarios en el SO para que funcionen correctamente paquetes que trabajar con XML, Curl y HTTP
$ sudo yum update glib2 $ sudo yum install openssl-devel.x86_64
$ sudo yum -y install libxml2 libxml2-devel
$ sudo yum -y install curl
$ sudo yum -y install libcurl libcurl-devel
## Para manejo de imágenes
$ sudo yum install libpng-devel
$ sudo yum install libtiff
$ sudo yum install -y libjpeg-devel
4
Data Science con R
Instalación
Debemos gestionar adecuadamente las dependencias existentes. Los siguientes paquetes son exigidos como prerrequisito (instalar como root, desde la consola de R) (rJava ya lo hemos instalado en el tema anterior – no volver a instalar):
> install.packages(c(“rJava”, “Rcpp”,
“RJSONIO”,”itertools”,“bitops”,“digest”,
“functional”, “httr”, “devtools”,
“stringr”,“plyr”,“reshape2”),
dependencies=T)
Obligatorio – Opcional (mejoras) Chequear listado paquetes con: > library( )
5
Data Science con R
Variables de entorno
Editar el archivo Renviron como root $ nano /usr/lib64/R/etc/Renviron
Actualizar variables
###Environment variables for RHadoop
###Run file
HADOOP_CMD='/usr/bin/hadoop'
HADOOP_STREAMING='/usr/lib/hadoop-0.20-
mapreduce/contrib/streaming/hadoop‐streaming-2.0.0‐mr1-cdh4.4.0.jar'
6
Data Science con R
Instalando paquetes principales
rhdfs • https://github.com/RevolutionAnalytics/rhdfs/tree/master/build
rmr2 • https://github.com/RevolutionAnalytics/rmr2/tree/master/build
O, mucho mejor: • https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads
• Descargar las últimas versiones indicadas para linux de rhdfs y rmr2
7
Data Science con R
Instalación
Abrir en consola una sesión R como root >install.packages("/home/cloudera/Downloads/rhdfs
_1.0.8.tar.gz", dependencies=T, repos=NULL)
>install.packages("/home/cloudera/Downloads/rmr2_
3.1.2.tar.gz", dependencies=T, repos=NULL)
• Es posible que necesitemos instalar el paquete caTools que
contiene diversas utilidades y funciones de manipulación
8
Data Science con R
Interacción con HDFS a través de rhdfs # Load rhdfs library
library(rhdfs)
# Start rhdfs
hdfs.init()
# Basic "ls", path is mandatory
hdfs.ls("/user/cloudera")
# Create directory
work.dir <- "/user/cloudera/Hadoop_R_Course/AuxiliarTema7"
hdfs.mkdir(work.dir)
# And delete
hdfs.delete(work.dir)
# Create again
hdfs.mkdir(work.dir)
9
Data Science con R
Gross Product Ranking
Trabajaremos con datos del Producto Interior Bruto de varios países • http://data.worldbank.org/data-catalog/GDP-ranking-table
Los datos deben ser descargados y limpiados El profesor proporcionará los archivos necesarios
Country Code,Ranking,Country Name,GPD
USA,1,United States,16800000
CHN,2,China,9240270
JPN,3,Japan,4901530
DEU,4,Germany,3634823
FRA,5,France,2734949
GBR,6,United Kingdom,2522261
10
Data Science con R
Interacción con ficheros HDFS
# Write in HDFS our clean GPD file from World Bank
hdfs.put(
"/home/cloudera/Hadoop_R_Course/AuxiliarTema7/
Documents/cleanGDPfile.csv", work.dir)
# How to read file from HDFS
file.dir <- paste(work.dir, "cleanGDPfile.csv", sep = "/")
# Check file.dir
file.dir
# Get the file
theFile = hdfs.file(file.dir)
# Read
file.data = hdfs.read(theFile)
# What is file.data?
file.data
# raw data?????
11
Data Science con R
Accediendo a los datos
# raw to char
file.CharData = rawToChar(file.data)
# Now?
file.CharData
# Yes. See separators, but, is it not pretty?
# Try this
# textConnection creates a character vector
data = read.table(textConnection(file.CharData), quote = "", sep = ",")
# Problems? Maybe the text file is not correct
# See this line (5 elements not 4)
# IRN,32,Iran, Islamic Rep.;368904
# Oh no! Raw data!!!!!
# Problems with compose name like Iran, Islamic Rep.
12
Data Science con R
Solucionando algunos problemas
# Again with the new file
hdfs.put(
"/home/cloudera/Hadoop_R_Course/AuxiliarTema7
/Documents/ReallyCleanGDPfile.csv", work.dir)
file.dir <- paste(work.dir, "ReallyCleanGDPfile.csv",
sep = "/")
theFile = hdfs.file(file.dir)
# Read
file.data = hdfs.read(theFile)
file.CharData = rawToChar(file.data)
# Try this
data2 = read.table(textConnection(file.CharData),
quote = "", sep = ",")
# See data2. Fingers crossed!!!
data2
# Great!!!
13
Data Science con R
Otras opciones
# Other options. Line to line
reader = hdfs.line.reader(file.dir)
what.is.this = reader$read()
typeof(what.is.this)
what.is.this
# Some problems with no utf-8 characters
# Change encoding in textConnection o clean file
# See https://github.com/RevolutionAnalytics/rhdfs/blob/master/pkg/man/rhdfs.Rd
# list of functions available for rhdfs
14
Data Science con R
Más funciones
##### File Manipulations
# hdfs.copy, hdfs.move, hdfs.rename, hdfs.delete, hdfs.rm, hdfs.del,
# hdfs.chown, hdfs.put, hdfs.get
##### File Read/Write
# hdfs.file, hdfs.write, hdfs.close, hdfs.flush, hdfs.read, hdfs.seek,
# hdfs.tell, hdfs.line.reader, hdfs.read.text.file
##### Directory
# hdfs.dircreate, hdfs.mkdir
##### Utility
# hdfs.ls, hdfs.list.files, hdfs.file.info, hdfs.exists
##### Initialization
# hdfs.init, hdfs.defaults
15
Data Science con R
Procesos MapReduce
Los creadores de Rhadoop introducen una muy buena aproximación al concepto de mapeo Podría considerarse similar a las funciones de R lapply o tapply. Estas funciones nos permiten aplicar una función a un conjunto estructurado de datos small.ints = 1:1000
sapply(small.ints, function(x) x^2)
• Con MapReduce small.ints = to.dfs(1:1000)
mapreduce( input = small.ints,
map = function(k, v) cbind(v, v^2))
Evidentemente no es igual, ya que hadoop facilita la ejecución en paralelo de la fase de mapeo optimizando los recursos computacionales
16
Data Science con R
Funciones destacadas
“to.dfs”: forma principal de escribir en HDFS de forma escalable. Crea archivos temporales (“/tmp”). Comprueba el resultado de la sentencia en rojo anterior. Abandona la sesión de R (> quit()). Vuelve a comprobar. ¿Qué ha pasado?
17
Data Science con R
Nuestro primer proceso MapReduce
#################################
#IntroRHadoop.R
#################################
## laoding the libraries
library('rhdfs')
library('rmr2')
## initializaing the RHadoop
hdfs.init()
# defining the input data
small.ints = to.dfs(1:10) #1 to 10
# Hadoop object, can you see it?
small.ints
18
Data Science con R
The Job
## Defining the MapReduce job
mapreduce(
input = small.ints,
# The Mapper (no reducer)
map = function(k, v)
{
lapply(seq_along(v), function(r){
# The Uniform Distribution
# min = 0 and max = 1 by default
# Try z <- runif(3); z
x <- runif(v[[r]])
# keyval = (key, value) pair
keyval(r,c(max(x),min(x)))
})})
19
Data Science con R
Results
## Update here the path parameter collected from
last command output
## from.dfs to READ
output <- from.dfs('/tmp/file7db122119c22')
## Output in table format
# do.call constructs and executes a function call
table_output<- do.call('rbind',
lapply(output$val,"[[",2))
# Let's see it
table_output
20
Data Science con R
2nd Example
## Loading the RHadoop libraries
library('rhdfs')
library('rmr2')
## Initializaing the RHadoop
hdfs.init()
# This creates a sample from the binomial
groups = rbinom(32, n = 50, prob = 0.4)
# Check it
groups
# Now count how many times each outcome occurred
# Or, in other way...
# the length of each element of groups in groups
tapply(groups, groups, length)
21
Data Science con R
Lo mismo… con MapReduce # Write in HDFS
groups = to.dfs(groups)
# Run job and read results
# Other way, not needed to know the path to file
output <- from.dfs(
# The MapReduce Job
mapreduce(
input = groups,
# Emit 1 for each item
map = function(., v) keyval(v, 1),
# Reduce function = accumulate
reduce =
function(k, vv)
# easy, we only need to get the length of the
# iterable
keyval(k, length(vv))))
# Finally, let's see the results
output 22
Data Science con R
Ya está aquí… WordCount
Volveremos a leer el libro del Quijote Comienzo típico ## Loading the RHadoop libraries
library('rhdfs')
library('rmr2')
## Initializaing the RHadoop
hdfs.init()
23
Data Science con R
Encapsulando la función
wordcount = function(input,
# The output can be an HDFS path but
#if it is NULL some temporary file will
# be generated and wrapped in a big data
# object, like the ones generated by to.dfs
output = NULL,
pattern = " "){
# Defining wordcount Map function
wc.map = function(., lines) {
keyval(
unlist(strsplit(
x = lines,
split = pattern)),
1)}
24
Data Science con R
Reducer y Job
# Defining wordcount Reduce function
wc.reduce = function(word, counts ) {
keyval(word, sum(counts))}
# Defining MapReduce parameters by calling mapreduce function
mapreduce(input = input ,
output = output,
# You can specify your own input and output formats
# and produce binary formats with the functions
# make.input.format and make.output.format
input.format = "text",
map = wc.map,
reduce = wc.reduce,
# With combiner
combine = T)}
25
Data Science con R
Ejecución y resultados
# The Quijote again
# Running MapReduce Job by passing the Hadoop
# input directory location as parameter
wordcount('/user/cloudera/Hadoop_R_Course/
AuxiliarTema6/BookWordCount/quijote.txt')
# Retrieving the RHadoop MapReduce output
# data by passing output
# directory location as parameter
from.dfs("/tmp/file1b0817a5bcd0")
26
Data Science con R
Algunos formatos personalizados: csv
Ejecutaremos ahora un ejemplo típico en el proceso de aprendizaje de Rhadoop Analizaremos los datos comerciales de una compañía aérea El fichero de entrada está formateado como csv (separado por comas) La lectura y el trabajo se facilita si declaramos un tipo personalizado Los datos se pueden descargar en el directorio Download y descomprimir • http://stat-computing.org/dataexpo/2009/1987.csv.bz2
27
Data Science con R
Airline.R
library(rmr2)
library('rhdfs')
library(plyr)
hdfs.init()
# Put data in HDFS
hdfs.data.root = '/user/cloudera/rhadoop/airline'
hdfs.data = file.path(hdfs.data.root, 'data')
hdfs.mkdir(hdfs.data)
hdfs.put("/home/cloudera/Downloads/1987.csv",
hdfs.data)
hdfs.out = file.path(hdfs.data.root, 'out')
28
Data Science con R
Indicando el formato del fichero
29
Data Science con R
Mapper
# the mapper gets keys and values from the input formatter
# in our case, the key is NULL and the value is a data.frame from
# read.table()
#
mapper.year.market.enroute_time = function(key, val.df) {
# Remove header lines, cancellations, and diversions:
val.df = subset(val.df, Year != 'Year' & Cancelled == 0 &
Diverted == 0)
# We don't care about direction of travel, so construct a new
# 'market' vector
# with airports ordered alphabetically (e.g, LAX to JFK becomes
#'JFK-LAX')
market = with( val.df, ifelse(Origin < Dest,
paste(Origin, Dest, sep='-'),
paste(Dest, Origin, sep='-')) )
30
Data Science con R
Mapper (2)
# key consists of year, market
output.key = data.frame(year=as.numeric(val.df$Year),
market=market, stringsAsFactors=F)
# emit data.frame of gate-to-gate elapsed times (CRS and actual)
# + time in air
output.val = val.df[,c('CRSElapsedTime', 'ActualElapsedTime', 'AirTime')]
colnames(output.val) = c('scheduled', 'actual', 'inflight')
# and finally, make sure they're numeric while we're at it
output.val = transform(output.val,
scheduled = as.numeric(scheduled),
actual = as.numeric(actual),
inflight = as.numeric(inflight)
)
return( keyval(output.key, output.val) )
}
31
Data Science con R
Reducer
#
# the reducer gets all the values for a given key
# the values (which may be multi-valued as here) come in
# the form of a data.frame
#
reducer.year.market.enroute_time = function(key, val.df) {
output.key = key
output.val = data.frame(flights = nrow(val.df),
scheduled = mean(val.df$scheduled, na.rm=T),
actual = mean(val.df$actual, na.rm=T),
inflight = mean(val.df$inflight,
na.rm=T) )
return( keyval(output.key, output.val) )
}
32
Data Science con R
Job y ejecución
mr.year.market.enroute_time = function (input, output) {
mapreduce(input = input,
output = output,
input.format = asa.csv.input.format,
map = mapper.year.market.enroute_time,
reduce = reducer.year.market.enroute_time,
backend.parameters = list(
hadoop = list(D = "mapred.reduce.tasks=2")
),
verbose=T)
}
out = mr.year.market.enroute_time(hdfs.data, hdfs.out)
33
Data Science con R
Resultados
results = from.dfs( out )
results.df = as.data.frame(results,
stringsAsFactors=F )
colnames(results.df) = c('year', 'market',
'flights', 'scheduled', 'actual', 'inflight')
print(head(results.df))
34
Data Science con R
¡TU TURNO!
35
Data Science con R
Requisitos
Vamos a seguir trabajando con un archivo csv Nos apoyaremos en el ejemplo anterior Y en los datos que hemos obtenido del Banco Mundial sobre el Producto Interior Bruto de los países • http://databank.worldbank.org/data/download/GDP.csv
Trabajaremos con los datos limpios proporcionados por el profesor • Vigilar caracteres raros (se procesa mejor UTF-8) • Comas fuera de su sitio • Valores nulos
36
Data Science con R
Objetivo
Sencillo. Se trata de analizar mediante un proceso MapReduce cuántos países poseen un PIB superior al beneficio declarado de Apple en el 2012 El beneficio de Apple en este periodo fue de 156.508 millones de dólares americanos (misma unidad de medida que el GDP del fichero) • https://www.google.com/finance?q=NASDAQ:AAPL&fstyp
e=ii&ei=5eErUcCpB8KOwAOkQQ •
37
Data Science con R
Los datos
Recordemos el formato de los datos #########################################
# The data
# Code,Rank,Name,GDP
# USA,1,United States,14991300
# CHN,2,China,7318499
# JPN,3,Japan,5867154
# DEU,4,Germany,3600833
# FRA,5,France,2773032
# ....
#########################################
38
Data Science con R
Pasos a realizar
1. Cargar librerías necesarias 2. Iniciar rhdfs 3. Preparar los datos y la estructura de directorios. Mover el
archivo csv a HDFS en la siguiente ruta: /user/cloudera/Hadoop_R_Course/AuxiliarTema7/data
4. Definir el formato csv (gdp.csv.input.format ) 5. Definir el Mapper 6. Definir el Reducer 7. Definir el Job 8. Ejecutar 9. Observar resultados
39
Data Science con R
Comprobación de resultados
¿Es correcto el resultado obtenido? Compáralo con los datos que proporciona R sin emplear Rhadoop #################################
# Check results
myData <-
read.csv("/home/cloudera/Hadoop_R_Course/AuxiliarTema7/
Documents/ReallyCleanGDPfile.csv", header=TRUE)
all.gdp <- myData$GDP
length(all.gdp)
# 191 = 134 + 57
length(all.gdp[all.gdp < appleRevenue.2012])
length(all.gdp[all.gdp > appleRevenue.2012])
###################################
40
Data Science con R Fundamentos y conceptos previos
Diego J. Bodas Sagi
ALGORITMOS CON R Y HADOOP
Regresión logística y clustering con K-Means
41
Data Science con R
Regresión
Supongamos los siguientes datos ¿Podemos predecir el precio de otras casas en función de la superficie?
42
Data Science con R
Modelos de regresión
Existen varios modelos de regresión • Regresión lineal • Regresión exponencial • Regresión logarítmica • Regresión polinomial
Cada tipo de regresión da lugar un tipo de curva distinto Según el modelo a extrapolar nos puede convenir más un método u otro En ocasiones, debemos probar varios métodos y evaluarlos para saber cuál es más preciso
43
Data Science con R
Regresión logística
La regresión logística es un tipo de análisis de regresión utilizado para predecir el resultado de una variable categórica en función de las variables independientes o predictoras Se suele asociar a un problema de clasificación (aprendizaje supervisado) El número de posibles valores para la variable categórica debe estar limitado. Muy frecuentemente se emplea una variable binaria Es útil para modelar la probabilidad de un evento ocurriendo como función de otros factores El análisis de regresión logística se enmarca en el conjunto de Modelos Lineales Generalizados Las probabilidades que describen el posible resultado de un único ensayo se modelan, como una función de variables explicativas, utilizando una función logística
44
Data Science con R
Función logística
La función logística es una función matemática que aparece en diversos modelos de crecimiento de poblaciones, propagación de enfermedades epidémicas y difusión en redes sociales. Dicha función constituye un refinamiento del modelo exponencial para el crecimiento de una magnitud. Modela la función sigmoidea de crecimiento de un conjunto P
45
Data Science con R
Tipos de preguntas a las que responde
¿Será moroso este cliente o no? ¿Tendrá hipertensión el paciente? Dentro de los márgenes muy bajo, bajo, medio, alto y muy alto, ¿cuál es la probabilidad de que este paciente tenga un infarto?
46
Data Science con R
Descenso gradiente
El método del descenso del gradiente es un método iterativo para realizar una regresión logística El objetivo es ajustar los valores para una mejor predicción Un método de clasificación muy sencillo de clasificación binaria consiste en: • Normalizar los valores (rango [0, 1]) para evitar que un
atributo tenga más peso que otro • Calcular medias entre todos los atributos • Ajustar al valor (0, 1) más cercano a la media
En vez de la media se pueden emplear otras funciones, como la regresión logística Se itera el proceso hasta cumplir un determinado criterio de convergencia
47
Data Science con R
Regresión logística en R
# Loading Iris dataset
data(iris)
# Setting up target variable
target <- data.frame(isSetosa=(iris$Species == 'setosa'))
# Adding target to iris and creating new dataset
inputdata <- cbind(target,iris)
# Defining the logistic regression formula
formula <- isSetosa ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
# Running Logistic model via glm()
logisticModel <- glm(formula, data=inputdata, family="binomial")
48
Data Science con R
Regresión logística con RHadoop
#Nondependent variable into matrix
#"logic" --> function of the explanatory variable
# (similar to regression)
# If logic (p) is a linear function
# logit(p) = beta0 + beta1 * x1 + ... + betan * xn
# each p has a likelihood
# p = (e^logit(p)) / (1 + e^logit(p))
##################################################
library(rmr2)
# logistic regression with input parameters
# input = input dataset
# iterations = fixed number of iterations for
# calculing the gradient
# dims = dimensions of input variables
# alpha = the learning rate
logistic.regression =
function(input, iterations, dims, alpha){
49
Data Science con R
Regresión logística con Hadoop
# Compute the contribution of subset points
# to the gradient
lr.map =
function(., M) {
Y = M[,1]
X = M[,-1]
keyval(
1,
Y * X *
g(-Y * as.numeric(X %*% t(plane))))}
# A Big sum of all values of key 1
lr.reduce =
function(k, Z)
keyval(k, t(as.matrix(apply(Z,2,sum))))
50
Data Science con R
Regresión logística con Hadoop
## logistic.regression-main
plane = t(rep(0, dims))
g = function(z) 1/(1 + exp(-z))
for (i in 1:iterations) {
gradient =
values(
from.dfs(
mapreduce(
input,
map = lr.map,
reduce = lr.reduce,
combine = TRUE)))
plane = plane + alpha * gradient }
plane }
## end
51
Data Science con R
Regresión logística con Hadoop # Generate data and run
out = list()
test.size = 10^5
for (be in c("local", "hadoop")) {
rmr.options(backend = be)
## create test set
set.seed(0)
## logistic.regression-data
eps = rnorm(test.size)
testdata =
to.dfs(
as.matrix(
data.frame(
y = 2 * (eps > 0) - 1,
x1 = 1:test.size,
x2 = 1:test.size + eps)))
## end
52
Data Science con R
Ejecución
out[[be]] =
## logistic.regression-run
logistic.regression(
testdata, 3, 2, 0.05)
## end
## max likelihood solution diverges for separable
dataset, (-inf, inf) such as the above
}
stopifnot(
isTRUE(all.equal(out[['local']], out[['hadoop']],
tolerance = 1E-7)))
# write "out" to see results
53
Data Science con R
Clustering
Encontrar agrupaciones de objetos que sean similares o relacionados entre sí y diferentes o no relacionados con objetos de otras agrupaciones
54
Máxima distancia o diferencia entre clústeres distintos
Mínima distancia o diferencia
dentro del clúster
Data Science con R
Aplicaciones
55
Comprender • Agrupar información
relacionada entre sí como páginas web, genes, proteínas con funciones similares, o acciones con fluctuaciones de precios parecidas
Resumir • Reducir el tamaño de los
conjuntos de datos
Data Science con R
K-Means
56
Enfoque basado en divisiones Cada clúster está asociado a un centroide (punto central) Cada elemento es asignado a un clúster en función del centroid al que esté más cercano Debemos especificar previamente un número K de clúster El algoritmo básico es simple
Data Science con R
Ejemplos
57
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
0
0.5
1
1.5
2
2.5
3
x
y
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
0
0.5
1
1.5
2
2.5
3
x
y
Sub-optimal Clustering
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
0
0.5
1
1.5
2
2.5
3
x
y
Optimal Clustering
Original Points
Data Science con R
Clustering con R
# Loading iris flower dataset
data("iris")
# Generating clusters for iris dataset
kmeans <- kmeans(iris[, -5], 3, iter.max =
1000)
# Comparing iris Species with generated
cluster points
Comp <- table(iris[, 5], kmeans$cluster)
58
Data Science con R
Clustering con RHadoop
library(rmr2)
## @knitr kmeans-signature
kmeans.mr =
function(
P,
num.clusters,
num.iter,
combine,
in.memory.combine) {
## @knitr kmeans-dist.fun
dist.fun =
function(C, P) {
apply(
C,
1,
function(x)
colSums((t(P) - x)^2))}
59
Data Science con R
Explicación
Calculamos la distancia entre una matriz de “centros” C y una matriz de puntos P
60
Data Science con R
Mapper ## @knitr kmeans.map
kmeans.map =
function(., P) {
nearest = {
if(is.null(C))
sample(
1:num.clusters,
nrow(P),
replace = TRUE)
else {
D = dist.fun(C, P)
nearest = max.col(-D)}}
if(!(combine || in.memory.combine))
keyval(nearest, P)
else
keyval(nearest, cbind(1, P))}
61
Data Science con R
Explicación
El Mapper calcula las distancias entre los puntos y todos los centros, devolviendo para cada punto su centroide más cercano Los puntos se almacenan en HDFS Para ganar eficiencia, los centroides se almacenan en una matriz que está disponible para la función de mapeo En la primera iteración, se asigna aleatoriamente cada punto a un centroide En las siguientes se emplea el criterio de distancia mínima Se emite un vector (las posiciones son importantes)
62
Data Science con R
Clustering con RHadoop
Reducer: calcula media de los puntos que comparten un centro, esa será la clave
## @knitr kmeans.reduce
kmeans.reduce = {
if (!(combine || in.memory.combine) )
function(., P)
t(as.matrix(apply(P, 2, mean)))
else
function(k, P)
keyval(
k,
t(as.matrix(apply(P, 2, sum))))}
63
Data Science con R
Clustering con RHadoop
## @knitr kmeans-main-1
C = NULL
for(i in 1:num.iter ) {
C = values(from.dfs(mapreduce(P,
map = kmeans.map, reduce = kmeans.reduce)))
if(combine || in.memory.combine)
C = C[, -1]/C[, 1]
if(nrow(C) < num.clusters) {
C = rbind(C, matrix(rnorm((num.clusters –
nrow(C)) * nrow(C)),
ncol = nrow(C)) %*% C) }}
C}
64
Data Science con R
Explicación
El bucle principal manda a la memoria resultados y funciones necesarias Para devolver el valor final se implementa un proceso heurístico para conseguir el número de centroides deseado Ahora creamos unos datos “para jugar”
65
Data Science con R
Clustering con RHadoop
## @knitr kmeans-data
P = do.call(rbind, rep(list(matrix(
rnorm(10, sd = 10), ncol=2)), 20))
+ matrix(rnorm(200), ncol =2)
}
Crea una matriz de tamaño considerable, añadiendo algo de ruido, repitiendo alguna fila…
66
Data Science con R
La llamada principal
out[[be]] =
## @knitr kmeans-run
kmeans.mr(
to.dfs(P),
num.clusters = 12,
num.iter = 5,
combine = FALSE,
in.memory.combine = FALSE)
## @knitr end
}
67
Data Science con R
Resumen
RHadoop se presenta como otra buena opción para lanzar procesos MapReduce desde R RHadoop se compone de tres paquetes independientes: rmr2, rhdfs, rhbase La instalación se ha explicado con detalles Hemos visto como interacturar con HDFS a través de RHadoop También hemos realizado ejemplos varios de procesos MapReduce así como un ejemplo para trabajar con archivos csv Hemos reforzado nuestros conocimientos con un pequeño ejercicio Por último, hemos visto cómo ejecutar algunos algoritmos más elaborados con R y Hadoop
68