domingo, 1 de junio de 2014

[HowTo] Instalar RHive


R + Hive = RHive
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
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
Creamos/Editamos el fichero Rserv.conf y añadimos la siguiente línea:
# 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:

0 comentarios:

Publicar un comentario