07.rhadoop

Post on 11-Feb-2016

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

hadoop

TRANSCRIPT

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

top related