R + Hive = RHive |
Antes de empezar a explicar como instalar este paquete, trataré de contar sus bondades y qué nos puede aportar.
La gran ventaja que a primera vista podemos observar es que RHive no obliga a tener ningún conocimiento acerca de Map&Reduce que como ya sabemos es una de las dos principales características que distinguen a un sistema Hadoop. Será Hive el que ante las consultas que implementemos se encargará de acometer esta tarea o funcionalidad. Aún así, RHive nos facilita la función mrapply para llevar a cabo este acometido si así lo deseamos.
Otras características importantes son:
- RHive soporta HQL.
- RHive puede interactuar tanto con los propios datos obtenidos por R como con datos almacenados en nuestro sistema HDFS.
- Nuestros analistas estarán más familiarizados con su uso y desarrollo gracias a las funciones disponibles.
RHive - Arquitectura |
Bien, vayamos ya con el tema que pretende cubrir esta entrada.
Anotar que en la web del proyecto RHive se nos detalla su instalación, mínimamente eso sí, por lo que yo trataré de explicarlo con un mayor detalle, sobre todo incluyendo todos los comandos que deberemos ejecutar.
Bien, para disponer del paquete RHive en nuestro sistema Cloudera, deberemos instalarlo tanto a él como a sus dependencias en todos los tasktracker nodes. Para ello empezamos instalando dos paquetes, Rserver y RJava:
# R
...
> install.packages(c('rJava'), repos="http://cran.revolutionanalytics.com" )
...
> install.packages(c('Rserve'), repos="http://cran.revolutionanalytics.com", INSTALL_opts=c('--byte-compile') )
Installing package into ‘/usr/lib64/R/library’
(as ‘lib’ is unspecified)
probando la URL 'http://cran.revolutionanalytics.com/src/contrib/Rserve_1.7-3.tar.gz'
Content type 'application/x-gzip' length 407390 bytes (397 Kb)
URL abierta
==================================================
downloaded 397 Kb
* installing *source* package ‘Rserve’ ...
** package ‘Rserve’ successfully unpacked and MD5 sums checked
checking...
...
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package ‘Rserve’
finding HTML links ... done
Rserv html
run.Rserve html
self html
** building package indices
** testing if installed package can be loaded
* DONE (Rserve)
Making 'packages.html' ... done
The downloaded source packages are in
‘/tmp/RtmptvMWks/downloaded_packages’
Updating HTML index of packages in '.Library'
Making 'packages.html' ... done
> q();
Save workspace image? [y/n/c]: y
# vim /etc/Rserv.conf
remote enable
Iniciamos el demonio Rserve en todos los servidores:
# R CMD Rserve
R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)
R es un software libre y viene sin GARANTIA ALGUNA.
Usted puede redistribuirlo bajo ciertas circunstancias.
Escriba 'license()' o 'licence()' para detalles de distribucion.
R es un proyecto colaborativo con muchos contribuyentes.
Escriba 'contributors()' para obtener más información y
'citation()' para saber cómo citar R o paquetes de R en publicaciones.
Escriba 'demo()' para demostraciones, 'help()' para el sistema on-line de ayuda,
o 'help.start()' para abrir el sistema de ayuda HTML con su navegador.
Escriba 'q()' para salir de R.
[Previously saved workspace restored]
Rserv started in daemon mode.
Para verificar que Rserve está corriendo en cada uno de nuestros servidores:
# netstat -nltp | grep -i rserve
tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 17776/Rserve
Y para asegurarnos que estos permiten la conexión remota ejecutaremos contra cada servidor:
# telnet <IP> 6311
Trying ...
Connected to .
Escape character is '^]'.
Rsrv0103QAP1
--------------
^C (Ctrl-C para finalizar)
Instalamos una nueva dependencia de RHive, RUnit:
# R
...
> install.packages(c('RUnit'), repos="http://cran.revolutionanalytics.com", INSTALL_opts=c('--byte-compile') )
Installing package into ‘/usr/lib64/R/library’
(as ‘lib’ is unspecified)
probando la URL 'http://cran.revolutionanalytics.com/src/contrib/RUnit_0.4.26.tar.gz'
Content type 'application/x-gzip' length 281781 bytes (275 Kb)
URL abierta
==================================================
downloaded 275 Kb
* installing *source* package ‘RUnit’ ...
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package ‘RUnit’
finding HTML links ... done
RUnit-internal html
RUnit-intro html
RUnit-options html
checkFuncs html
inspect html
printHTML.trackinfo html
runit html
testCaseSetUp html
textProtocol html
tracker html
** building package indices
** installing vignettes
‘RUnit.Rnw’
** testing if installed package can be loaded
* DONE (RUnit)
Making 'packages.html' ... done
The downloaded source packages are in
‘/tmp/Rtmp365h9s/downloaded_packages’
Updating HTML index of packages in '.Library'
Making 'packages.html' ... done
> q();
Save workspace image? [y/n/c]: y
A continuación clonamos el proyecto RHive:
# git clone https://github.com/nexr/RHive.git
Initialized empty Git repository in /grid/0/software/RHive/.git/
remote: Counting objects: 1622, done.
remote: Compressing objects: 100% (816/816), done.
remote: Total 1622 (delta 706), reused 1589 (delta 686)
Receiving objects: 100% (1622/1622), 3.69 MiB | 378 KiB/s, done.
Resolving deltas: 100% (706/706), done.
Tendremos que construir el paquete final de RHive a instalar en nuestro sistema así que si nos disponemos del paquete ant.x86 procedemos primero a su instalación:
# yum install ant.x86_64 -y
...
Antes de continuar deberemos también de asegurarnos que están definidas las variables de entorno $HIVE_HOME y $HADOOP_HOME
# echo $HADOOP_HOME
/opt/cloudera/parcerls/CDH
# echo $HIVE_HOME
/opt/cloudera/parcerls/CDH/lib/hive
# cd RHive/
# ant build
Buildfile: build.xml
compile:
[mkdir] Created dir: /RHive/build/classes
[javac] Compiling 20 source files to /RHive/build/classes
...
jar:
[jar] Building jar: /RHive/rhive_udf.jar
cran:
[copy] Copying 1 file to /RHive/RHive/inst/java
[copy] Copying 28 files to /RHive/build/CRAN/rhive/inst
[copy] Copying 12 files to /RHive/build/CRAN/rhive/man
[copy] Copying 10 files to /RHive/build/CRAN/rhive/R
[copy] Copying 1 file to /RHive/build/CRAN/rhive
[copy] Copying 1 file to /RHive/build/CRAN/rhive
[delete] Deleting: /RHive/rhive_udf.jar
build:
BUILD SUCCESSFUL
Total time: 1 minute 7 seconds
# R CMD build RHive
* checking for file ‘RHive/DESCRIPTION’ ... OK
* preparing ‘RHive’:
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files
* checking for empty or unneeded directories
* looking to see if a ‘data/datalist’ file should be added
* building ‘RHive_2.0-0.0.tar.gz’
Y ahora ya sí, por fin lo instalamos:
# R CMD INSTALL RHive_2.0-0.0.tar.gz
* installing to library ‘/usr/lib64/R/library’
* installing *source* package ‘RHive’ ...
** R
** data
** inst
** preparing package for lazy loading
** help
*** installing help indices
converting help for package ‘RHive’
finding HTML links ... done
emp html
rhive-aggregate html
rhive-api html
rhive-apply html
rhive-basic html
rhive-connect html
rhive-execute html
rhive-export html
rhive-fn html
rhive-hdfs html
rhive-query html
rhive html
** building package indices
** testing if installed package can be loaded
* DONE (RHive)
Making 'packages.html' ... done
Para probar su correcto funcionamiento:
# R
...
> library(RHive)
Loading required package: rJava
Loading required package: Rserve
> rhive.connect()
> rhive..env()
hadoop home: /opt/cloudera/parcels/CDH-5.0.0-1.cdh5.0.0.p0.47
fs: file:///
hive home: /opt/cloudera/parcels/CDH-5.0.0-1.cdh5.0.0.p0.47/lib/hive
user name: root
user home: /root
temp dir: /tmp/root
> rhive.list.databases()
databaseName
1 default
2 db_ejemplo
> rhive.query("SELECT * FROM db_ejemplo.tabla limit 10")
id col1 col2 col3 col4
1 1 30323866 0 01 992
2 2 30334287 0 01 221
3 3 30213465 0 02 5400
4 4 10134225 0 05 37
5 5 30314557 0 02 47
6 6 30123534 0 01 1
7 7 10134774 0 10 47
8 8 23421881 0 01 0
9 9 11111859 0 01 11
10 10 08217839 0 02 8
Os dejo otros enlaces de interés:
- Wiki => https://github.com/nexr/RHive/wiki
- Example Code => https://github.com/nexr/RHive/wiki/RHive-example-code
0 comentarios:
Publicar un comentario