You are on page 1of 68

Data Science con R

RHadoop

Diego J. Bodas Sagi Julio de 2014

ndice
Introduccin RHadoop
Instalacin
Interaccin con HDFS
Primeros ejemplos
Trabajando con ficheros csv
Ejercicio Rhadoop
Regresin logstica y clustering
Resumen

Data Science con R

RHadoop
By Revolution Analytics (proveedor comercial lder de
software para R)
Se compone de tres paquetes independientes:
rhdfs: proporciona acceso a HDFS
rmr: permite ejecutar programas MapReduce (nueva
versin disponible rmr2)
rhbase: permite interactuar con Hbase
Adems, tenemos algunos paquetes auxiliares
quick check: para depuracin de procesos MapReduce
lanzados a travs del paquete rmr
plyrmr: facilita operaciones de combinacin y
manipulacin de grandes conjuntos de datos. Buena
eficiencia en algunas operaciones (superior a SQL)
Data Science con R

Preparacin 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 imgenes
$ sudo yum install libpng-devel
$ sudo yum install libtiff
$ sudo yum install -y libjpeg-devel

Data Science con R

Instalacin
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( )
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.20mapreduce/contrib/streaming/hadoopstreaming-2.0.0mr1cdh4.4.0.jar'

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

Data Science con R

Instalacin
Abrir en consola una sesin 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 manipulacin

Data Science con R

Interaccin con HDFS a travs 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)
Data Science con R

Gross Product Ranking


Trabajaremos con datos del Producto Interior Bruto de varios pases
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

Data Science con R

10

Interaccin 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?????

Data Science con R

11

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.

Data Science con R

12

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!!!

Data Science con R

13

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

Data Science con R

14

Ms 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
Data Science con R

15

Procesos MapReduce
Los creadores de Rhadoop introducen una muy buena
aproximacin al concepto de mapeo
Podra considerarse similar a las funciones de R lapply o
tapply. Estas funciones nos permiten aplicar una funcin 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
ejecucin en paralelo de la fase de mapeo optimizando los
recursos computacionales
Data Science con R

16

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 sesin
de R (> quit()). Vuelve a comprobar. Qu ha pasado?

Data Science con R

17

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

Data Science con R

18

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)))
})})

Data Science con R

19

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

Data Science con R

20

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)

Data Science con R

21

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
Data Science con R

22

Ya est aqu WordCount


Volveremos a leer el libro del Quijote
Comienzo tpico
## Loading the RHadoop libraries
library('rhdfs')
library('rmr2')
## Initializaing the RHadoop
hdfs.init()

Data Science con R

23

Encapsulando la funcin
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)}

Data Science con R

24

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)}

Data Science con R

25

Ejecucin 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")
Data Science con R

26

Algunos formatos personalizados: csv


Ejecutaremos ahora un ejemplo tpico en el proceso de
aprendizaje de Rhadoop
Analizaremos los datos comerciales de una compaa area
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

Data Science con R

27

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')

Data Science con R

28

Indicando el formato del fichero

Data Science con R

29

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='-')) )

Data Science con R

30

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) )
}

Data Science con R

31

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) )
}

Data Science con R

32

Job y ejecucin
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)

Data Science con R

33

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))

Data Science con R

34

TU TURNO!

Data Science con R

35

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 pases
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

Data Science con R

36

Objetivo
Sencillo. Se trata de analizar mediante un proceso MapReduce
cuntos pases 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 dlares americanos (misma unidad de medida que el GDP
del fichero)
https://www.google.com/finance?q=NASDAQ:AAPL&fstyp
e=ii&ei=5eErUcCpB8KOwAOkQQ

Data Science con R

37

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
# ....
#########################################
Data Science con R

38

Pasos a realizar
1. Cargar libreras 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
Data Science con R

39

Comprobacin de resultados
Es correcto el resultado obtenido?
Compralo 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])
###################################

Data Science con R

40

ALGORITMOS CON R Y HADOOP


Regresin logstica y clustering con K-Means

Fundamentos y conceptos previos


Data Science con R

Diego J. Bodas Sagi

41

Regresin
Supongamos los siguientes datos

Podemos predecir el precio de otras casas en funcin de la


superficie?

Data Science con R

42

Modelos de regresin
Existen varios modelos de regresin
Regresin lineal
Regresin exponencial
Regresin logartmica
Regresin polinomial
Cada tipo de regresin da lugar un
tipo de curva distinto
Segn el modelo a extrapolar nos
puede convenir ms un mtodo u
otro
En ocasiones, debemos probar varios
mtodos y evaluarlos para saber cul
es ms preciso

Data Science con R

43

Regresin logstica
La regresin logstica es un tipo de anlisis de regresin utilizado
para predecir el resultado de una variable categrica en funcin de
las variables independientes o predictoras
Se suele asociar a un problema de clasificacin (aprendizaje
supervisado)
El nmero de posibles valores para la variable categrica debe estar
limitado. Muy frecuentemente se emplea una variable binaria
Es til para modelar la probabilidad de un evento ocurriendo como
funcin de otros factores
El anlisis de regresin logstica se enmarca en el conjunto
de Modelos Lineales Generalizados
Las probabilidades que describen el posible resultado de un nico
ensayo se modelan, como una funcin de variables explicativas,
utilizando una funcin logstica

Data Science con R

44

Funcin logstica
La funcin logstica es una
funcin matemtica que aparece
en diversos modelos de
crecimiento de poblaciones,
propagacin de enfermedades
epidmicas y difusin en redes
sociales. Dicha funcin constituye
un refinamiento del modelo
exponencial para el crecimiento de
una magnitud. Modela la funcin
sigmoidea de crecimiento de un
conjunto P

Data Science con R

45

Tipos de preguntas a las que responde


Ser moroso este cliente o no?
Tendr hipertensin el paciente?
Dentro de los mrgenes muy bajo, bajo, medio, alto y muy
alto, cul es la probabilidad de que este paciente tenga un
infarto?

Data Science con R

46

Descenso gradiente
El mtodo del descenso del gradiente es un mtodo iterativo
para realizar una regresin logstica
El objetivo es ajustar los valores para una mejor prediccin
Un mtodo de clasificacin muy sencillo de clasificacin
binaria consiste en:
Normalizar los valores (rango [0, 1]) para evitar que un
atributo tenga ms peso que otro
Calcular medias entre todos los atributos
Ajustar al valor (0, 1) ms cercano a la media
En vez de la media se pueden emplear otras funciones, como
la regresin logstica
Se itera el proceso hasta cumplir un determinado criterio de
convergencia
Data Science con R

47

Regresin logstica 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")

Data Science con R

48

Regresin logstica 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){

Data Science con R

49

Regresin logstica 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))))

Data Science con R

50

Regresin logstica 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

Data Science con R

51

Regresin logstica 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
Data Science con R

52

Ejecucin
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

Data Science con R

53

Clustering
Encontrar agrupaciones de objetos que sean similares o
relacionados entre s y diferentes o no relacionados con objetos de
otras agrupaciones
Mnima distancia
o diferencia
dentro del clster

Data Science con R

Mxima distancia
o diferencia entre
clsteres distintos

54

Aplicaciones
Comprender
Agrupar informacin
relacionada entre s como
pginas web, genes,
protenas con funciones
similares, o acciones con
fluctuaciones de precios
parecidas

Resumir
Reducir el tamao de los
conjuntos de datos

Data Science con R

55

K-Means
Enfoque basado en divisiones
Cada clster est asociado a un centroide (punto central)
Cada elemento es asignado a un clster en funcin del
centroid al que est ms cercano
Debemos especificar previamente un nmero K de clster
El algoritmo bsico es simple

Data Science con R

56

Ejemplos
3

Original Points

2.5

1.5

0.5

-2

-1.5

-1

-0.5

0.5

1.5

2.5

2.5

1.5

1.5

0.5

0.5

-2

-1.5

-1

-0.5

0.5

Optimal Clustering
Data Science con R

1.5

-2

-1.5

-1

-0.5

0.5

1.5

Sub-optimal Clustering
57

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)

Data Science con R

58

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))}

Data Science con R

59

Explicacin

Calculamos la distancia entre una matriz de centros C y una


matriz de puntos P

Data Science con R

60

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))}

Data Science con R

61

Explicacin
El Mapper calcula las distancias entre los puntos y todos los
centros, devolviendo para cada punto su centroide ms
cercano
Los puntos se almacenan en HDFS
Para ganar eficiencia, los centroides se almacenan en una
matriz que est disponible para la funcin de mapeo
En la primera iteracin, se asigna aleatoriamente cada punto a
un centroide
En las siguientes se emplea el criterio de distancia mnima
Se emite un vector (las posiciones son importantes)

Data Science con R

62

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))))}
Data Science con R

63

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}

Data Science con R

64

Explicacin
El bucle principal manda a la memoria resultados y funciones
necesarias
Para devolver el valor final se implementa un proceso
heurstico para conseguir el nmero de centroides deseado
Ahora creamos unos datos para jugar

Data Science con R

65

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 tamao considerable, aadiendo algo de
ruido, repitiendo alguna fila

Data Science con R

66

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
}
Data Science con R

67

Resumen
RHadoop se presenta como otra buena opcin para lanzar procesos
MapReduce desde R
RHadoop se compone de tres paquetes independientes: rmr2, rhdfs,
rhbase
La instalacin se ha explicado con detalles
Hemos visto como interacturar con HDFS a travs de RHadoop
Tambin hemos realizado ejemplos varios de procesos MapReduce
as como un ejemplo para trabajar con archivos csv
Hemos reforzado nuestros conocimientos con un pequeo ejercicio
Por ltimo, hemos visto cmo ejecutar algunos algoritmos ms
elaborados con R y Hadoop

Data Science con R

68

You might also like