Professional Documents
Culture Documents
RHadoop
ndice
Introduccin RHadoop
Instalacin
Interaccin con HDFS
Primeros ejemplos
Trabajando con ficheros csv
Ejercicio Rhadoop
Regresin logstica y clustering
Resumen
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
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'
rmr2
https://github.com/RevolutionAnalytics/rmr2/tree/master/build
O, mucho mejor:
https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads
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)
10
11
12
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
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?
17
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)))
})})
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
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)
21
22
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)}
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)}
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
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')
28
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='-')) )
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) )
}
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),
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)
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))
34
TU TURNO!
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
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
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])
###################################
40
41
Regresin
Supongamos los siguientes datos
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
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
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
45
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")
48
49
50
51
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)))
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
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
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
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)
58
59
Explicacin
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))}
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)
62
63
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
65
}
Crea una matriz de tamao considerable, aadiendo algo de
ruido, repitiendo alguna fila
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
68