Mostrando entradas con la etiqueta R. Mostrar todas las entradas
Mostrando entradas con la etiqueta R. Mostrar todas las entradas

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:

martes, 1 de abril de 2014

[HowTo] Instalar Apache Thrift Server y RHBase


Esta claro que el principal objetivo de cualquier sistema Big Data es recoger y poder almacenar una gran cantidad de información para consultarla en un futuro con rapidez. Pero... ¿por qué olvidarnos de su posterior análisis o tratamiento? Este puede enriquecer más si cabe nuestros sistemas o darnos una visión nueva de negocio para nada despreciable.


Sobre lo primero ya vimos como importar información de nuestras bases de datos MySQL a nuestro nuevo sistema de Big Data en la anterior entrada "HBase - Importar Datos (SQOOP)".

Mientras que de la segunda parte, de la necesidad de estudio de la información, es de donde surge esta entrada. Es muy factible que antes o después nos soliciten analizarla bien a nuestro equipo o bien que pongamos a disposición de terceros las herramientas necesarias.


R es un lenguaje y entorno para la computación estadística y gráfica. R provee una amplia variedad de técnicas entre las que se encuentra el análisis de time-series, razón que será la principal para su uso en mi organización.

Bien, centrémonos a continuación ya en el asunto que pretende cubrir esta entrada.


RHBase se trata de una librería R cuyo principal objetivo es comunicarse con HBase. Dicho paquete nos permitirá 'jugar' con la información almacenada en esta NoSQL.



Entre las funcionalidades básicas que RHBase nos ofrece están:
  • Manipulación de Tablas: hb.new.table, hb.delete.table, hb.describe.table, hb.set.table.mode, hb.regions.table, hb.list.tables
  • Lectura/Escritura: hb.insert, hb.get, hb.delete, hb.insert.data.frame, hb.get.data.frame, hb.scan, hb.scan.ex
  • Otras: hb.defaults, hb.init

Bien, a continuación detallaré los pasos que dí para lograr instalar RHBase. Anotar que el sistema del que parto es CentOS 6.4 (x86_64) y en él se ha instalado previamente Cloudera 4.8.1 y R (ver HowTo Instalar R, RHadoop y RStudio).

Apache Thrift
En su propia web se nos facilita una serie de prerrequisitos para diferentes sistemas operativos. Os dejo el enlace para los de CentOS, aunque al menos a mí me resultaron insuficientes.
  1. Openssl-devel. Paquete necesario para obtener la librería libcrypto.
      # yum install openssl-devel.x86_64 -y
  2. Autoconf. Versión mínima requerida 2.65 ó superior.
      # wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
      # tar xvzf autoconf-latest.tar.gz
      # cd autoconf-2.69/
      # ./configure
      # make
      # make check                   (tarda bastante)
      # make install
    
  3. Resto de Dependencias CentOS.
      # yum install automake flex bison pkgconfig gcc-c++ libevent-devel zlib-devel python-devel ruby-devel -y
    
    Es posible que durante la instalación del paquete Automake se observe como se selecciona e instala como una dependencia más la librería autconf-2.63-5.1.el6.noarch, no preocuparse, no supondrá ningún problema de cara al futuro. Aún así, tras finalizar la instalación de todos estos paquetes podremos verificar la versión del mismo ejecutando el siguiente comando:
      # autoconf -V
        autoconf (GNU Autoconf) 2.69
        Copyright (C) 2012 Free Software Foundation, Inc.
        License GPLv3+/Autoconf: GNU GPL version 3 or later
        <http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
        This is free software: you are free to change and redistribute it.
        There is NO WARRANTY, to the extent permitted by law.
        Written by David J. MacKenzie and Akim Demaille.
    
  4. Boost (69,5 MB):
      # wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/download
      # tar xvzf boost_1_55_0.tar.gz
      # cd boost_1_55_0
      # ./bootstrap.sh
        Building Boost.Build engine with toolset gcc... tools/build/v2/engine/bin.linuxx86_64/b2
        Detecting Python version... 2.6
        Detecting Python root... /usr
        Unicode/ICU support for Boost.Regex?... not found.
        Generating Boost.Build configuration in project-config.jam...
    
        Bootstrapping is done. To build, run:
    
        ./b2  
    
        To adjust configuration, edit 'project-config.jam'.
        Further information:
    
        - Command line help:
          ./b2 --help
    
        - Getting started guide:
          http://www.boost.org/more/getting_started/unix-variants.html
        - Boost.Build documentation:
          http://www.boost.org/boost-build2/doc/html/index.html
    
      # ./b2              (tardará bastante en finalizar su ejecución)
        ...
        The Boost C++ Libraries were successfully built!
    
        The following directory should be added to compiler include paths:
            /root/software/boost_1_55_0
        The following directory should be added to linker library paths:
            /root/software/boost_1_55_0/stage/lib
    
      # ./bjam --prefix=/usr/local/ link=static runtime-link=static stage install
        ...
        common.copy /usr/local/include/boost/tr1/tr1/unordered_map
        ...updated 11321 targets...
    
    Podremos verificar la existencia de estas librerías:
      # ls -al /usr/local/lib/libboost_*
    
  5. Libtool. Paquete necesario para obtener la librería libtoolize.
      # yum install libtool-2.2.6-15.5.el6.x86_64 -y
    
  6. Thrift. Podemos obtener el paquete mediante dos formas:
    Opción 1) Desde su propia web nos descargamos una de sus versiones:
      # wget http://archive.apache.org/dist/thrift/0.8.0/thrift-0.8.0.tar.gz
      # tar xvzf thrift-0.8.0.tar.gz
      # cd thrift-0.8.0
    
    Opción2) 'Clonamos' el proyecto:
      # git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
      # cd thrift
      # ./bootstrap.sh          (si elegimos esta segunda opción este paso es necesario)
    
    Yo opté por la primera. A partir de aquí los siguientes pasos son idénticos para ambas opciones.
      # ./configure --with-boost=/usr/local
      # make
      # make check                   (asegurarse que el puerto 9090 esté libre, por ejemplo asegurarse que el servicio hbalse =>hbasethriftserver de cloudera esté detenido en caso de haberse instalado/habilitado)
      # make install
      # cp /usr/local/lib/libthrift-0.8.0.so /usr/lib/
      # /sbin/ldconfig /usr/lib/libthrift-0.8.0.so
    

    A continuación deberemos añadir la siguiente variable de entorno a nuestro ficheros:

    /root/.bashrc => EXPORT PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
    /etc/profile => EXPORT PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
      # source /root/.bashrc
      # source /etc/profile
    
    Verificar el resultado del siguiente comando:
      # pkg-config --cflags thrift
        -I/usr/local/include/thrift
    
  7. RHBase:
      # wget https://raw.github.com/RevolutionAnalytics/rhbase/master/build/rhbase_1.2.0.tar.gz
      # R CMD INSTALL rhbase_1.2.0.tar.gz
        * installing to library ‘/usr/lib64/R/library’
        * installing *source* package ‘rhbase’ ...
        ** libs
        g++ -m64 -I/usr/include/R -DNDEBUG  -I/usr/local/include   -I. -g  -DHAVE_UINTPTR_T -DHAVE_NETDB_H=1 -fpermissive -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -I./gen_cpp `pkg-config --cflags thrift` -Wall -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c Hbase.cpp -o Hbase.o
        g++ -m64 -I/usr/include/R -DNDEBUG  -I/usr/local/include   -I. -g  -DHAVE_UINTPTR_T -DHAVE_NETDB_H=1 -fpermissive -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -I./gen_cpp `pkg-config --cflags thrift` -Wall -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c Hbase_constants.cpp -o Hbase_constants.o
        g++ -m64 -I/usr/include/R -DNDEBUG  -I/usr/local/include   -I. -g  -DHAVE_UINTPTR_T -DHAVE_NETDB_H=1 -fpermissive -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -I./gen_cpp `pkg-config --cflags thrift` -Wall -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c Hbase_types.cpp -o Hbase_types.o
        g++ -m64 -I/usr/include/R -DNDEBUG  -I/usr/local/include   -I. -g  -DHAVE_UINTPTR_T -DHAVE_NETDB_H=1 -fpermissive -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -I./gen_cpp `pkg-config --cflags thrift` -Wall -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c tools.cc -o tools.o
        g++ -m64 -shared -L/usr/local/lib64 -o rhbase.so Hbase.o Hbase_constants.o Hbase_types.o tools.o -L/usr/local/lib -lthrift -L/usr/lib64/R/lib -lR
        installing to /usr/lib64/R/library/rhbase/libs
        ** R
        ** inst
        ** preparing package for lazy loading
        ** help
        *** installing help indices
         converting help for package ‘rhbase’
         finding HTML links ... done
          admin               html
          functions           html
          rhbase              html
        ** building package indices
        ** testing if installed package can be loaded
        * DONE (rhbase)
        Making 'packages.html' ... done
    
    Verificar que existe /usr/lib64/R/library/rhbase/
  8.   # ls -al /usr/lib64/R/library/rhbase/
        total 48
        drwxr-xr-x  9 root root 4096 mar 17 14:48 .
        drwxr-xr-x 49 root root 4096 mar 17 14:48 ..
        -rw-r--r--  1 root root  461 mar 17 14:48 DESCRIPTION
        drwxr-xr-x  2 root root 4096 mar 17 14:48 help
        drwxr-xr-x  2 root root 4096 mar 17 14:48 html
        -rw-r--r--  1 root root  222 mar 17 14:48 INDEX
        drwxr-xr-x  2 root root 4096 mar 17 14:48 libs
        drwxr-xr-x  2 root root 4096 mar 17 14:48 Meta
        -rw-r--r--  1 root root   41 mar 17 14:48 NAMESPACE
        drwxr-xr-x  2 root root 4096 mar 17 14:48 R
        drwxr-xr-x  2 root root 4096 mar 17 14:48 samples
        drwxr-xr-x  2 root root 4096 mar 17 14:48 unitTests
    
  9. Iniciar el servicio HBase Thrift Server
      # hbase thrift start
        ...INFO thrift.ThriftServerRunner: starting TBoundedThreadPoolServer on /0.0.0.0:9090; min worker threads=16, max worker threads=1000, max queued requests=1000
        ...
    
  10. R
      # R
      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)
      ...
    
      > require(rhbase)
      Loading required package: rhbase
    
      > hb.init();
      <pointer: 0x1ec4030="">
      attr(,"class")
      [1] "hb.client.connection"
    
      > hb.list.tables()
      $`test-table`
    
      maxversions compression inmemory bloomfiltertype bloomfiltervecsize bloomfilternbhashes
      cf:           3        NONE    FALSE            NONE       0       0
    
      blockcache timetolive
      cf:      FALSE         -1
    
    ¡¡¡ IMPORTANTE !!! En caso de leer una tabla cuyos datos son caracteres, debemos inicializar la conexión de la siguiente forma:
      > hb.init(serialize="character")
      <pointer: 0x306a2f0="">
      attr(,"class")
      [1] "hb.client.connection"
    
      > hb.get (tablename="TABLENAME", rows="ROWKEY", colspec="COLUMNFAMILY:")
      [[1]]
      [[1]][[1]]
      [1] "ROWKEY"
    
      [[1]][[2]]
      [1] "cf:ATTR1_CADENA"     "cf:ATTR2_INT"        "cf:ATTR3_INT"        "cf:ATTR4_INT"    "cf:ATTR5_CADENA" "cf:ATTR6_INT"    
    
      [[1]][[3]]
      [[1]][[3]][[1]]
      [1] "BOTH"
    
      [[1]][[3]][[2]]
      [1] "62"
    
      [[1]][[3]][[3]]
      [1] "143"
    
      [[1]][[3]][[4]]
      [1] "10455"
    
      [[1]][[3]][[5]]
      [1] "CADENA"
    
      [[1]][[3]][[6]]
      [1] "24"
    
      > quit();
      Save workspace image? [y/n/c]: y
    

sábado, 1 de marzo de 2014

[HowTo] Instalar R, RHadoop y RStudio



En la presente entrada trataré de explicar cómo instalé R, RHadoop y RStudio sobre un sistema Linux (Centos 6.4) de 64 bits con Cloudera 4.8.1 previamente instalado.

Lo primero quiero compartir estos dos enlaces que me fueron de gran utilidad para llevar a cabo esta tarea, aunque hay cosas que considero que no son correctas o no están lo suficientemente documentadas (espero conseguirlo yo :P).
  • http://ashokharnal.wordpress.com/2013/08/25/installing-r-rhadoop-and-rstudio-over-cloudera-hadoop-ecosystem/
  • https://github.com/cloudera/poisson_sampling/blob/master/INSTALL.md

¡¡¡ IMPORTANTE !!! Con la versión 7 de Java no fuí capaz de instalar nada. La versión utilizada fue JRE 6 Update 31 (1.6.0.31).
 # java -version
   java version "1.6.0_30"
   OpenJDK Runtime Environment (IcedTea6 1.13.1) (rhel-3.1.13.1.el6_5-x86_64)
   OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)

Actualización 2014-04-09: Con Cloudera 5 y JRE 1.7u45 SÍ conseguí instalar R, RHadoop y RStudio siguiendo estos mismos pasos, eso sí, primero debí asegurarme que los enlaces existentes en /etc/alternatives/ y relativos a Java apuntaran correctamente a esta versión en concreto y muy recomendable que la variable de entorno CLASSPATH no estuviera definida.
  1. Instalar R.
    Habilitamos la descarga de paquetes del repositorio epel  (Extra Packages for Enterprise Linux)
     # rpm -ivh http://mirror.chpc.utah.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 
    Ahora ya podemos instalar R tras actualizar nuestros repositorios:
     # yum update
       ...
     # yum -y --enablerepo=epel install R R-devel
  2. Iniciar R.
  3. Un primer paso:
     # R CMD javareconf
       Java interpreter : /usr/java/default/jre/bin/java
       Java version     : 1.6.0_31
       Java home path   : /usr/java/default
       Java compiler    : /usr/java/default/bin/javac
       Java headers gen.: /usr/java/default/bin/javah
       Java archive tool: /usr/java/default/bin/jar
    
       trying to compile and link a JNI progam 
      detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux detected JNI linker flags : -L/usr/lib/jdk1.6.0_31/jre/lib/amd64/server -ljvm
       gcc -m64 -std=gnu99 -I/usr/include/R -DNDEBUG -I/usr/java/default/include -I/usr/java/default/include/linux -I/usr/local/include    -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic  -c conftest.c -o conftest.o
       gcc -m64 -std=gnu99 -shared -L/usr/local/lib64 -o conftest.so conftest.o -L/usr/lib/jdk1.6.0_31/jre/lib/amd64/server -ljvm -L/usr/lib64/R/lib -lR
    
       JAVA_HOME        : /usr/java/default
       Java library path: /usr/lib/jdk1.6.0_31/jre/lib/amd64/server
       JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
       JNI linker flags : -L/usr/lib/jdk1.6.0_31/jre/lib/amd64/server -ljvm
       Updating Java configuration in /usr/lib64/R
       Done.
    ¡Importante! Fijarse que la variable JNI cpp flags NO se encuentre vacía. Versiones de JAVA soportadas para Cloudera 4 JRE 1.6u31 y para Cloudera 5 JRE 1.7u45.

    Ahora sí, iniciamos la shell que nos ofrece R:
     # R
       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)
       >
  4. Instalar paquetes de R.
  5.  > install.packages(c('Rcpp', 'RJSONIO', 'itertools', 'digest'), repos="http://cran.revolutionanalytics.com", INSTALL_opts=c('--byte-compile') )
       ...
     > install.packages(c('functional', 'stringr', 'plyr'), repos="http://cran.revolutionanalytics.com", INSTALL_opts=c('--byte-compile') )
       ...
     > install.packages(c('caTools'), repos="http://cran.revolutionanalytics.com" )
       ...
     > install.packages(c('rJava'), repos="http://cran.revolutionanalytics.com" )
       ...
     > install.packages(c('randomForest'), repos="http://cran.revolutionanalytics.com" )
       ...
     > install.packages(c('reshape2'), repos="http://cran.revolutionanalytics.com" )
       ...
     > q()
       Save workspace image? [y/n/c]: y
    
  6. Instalar Git.
    Lógicamente en caso de no disponer de él.
  7.  # yum install git -y 
  8. Instalar RMR2.
  9. Lo primero será descargarnos el paquete rmr2.
     # cd /tmp/
     # git clone https://github.com/RevolutionAnalytics/rmr2.git
       Initialized empty Git repository in /root/software/rmr2/.git/
       remote: Reusing existing pack: 5534, done.
       remote: Counting objects: 22, done.
       remote: Compressing objects: 100% (22/22), done.
       remote: Total 5556 (delta 9), reused 0 (delta 0)
       Receiving objects: 100% (5556/5556), 23.59 MiB | 838 KiB/s, done.
       Resolving deltas: 100% (3740/3740), done.
    ¡¡¡ Precaución !!! El paquete rmr2 requiere por su configuración la instalación de una versión en concreto del paquete Apache-Ant, en mi caso la 1.9.2. Ahora bien, la URL de la que tratará descargarse el paquete es incorrecta y por lo tanto fallará. 

    Es por ello por lo que deberemos modificar el fichero rmr2/pkg/src/hbase-io/build_linux.sh:
     # vim rmr2/pkg/src/hbase-io/build_linux.sh
    Sustituyendo la línea "wget http://mirror.nus.edu.sg/apache/ant/binaries/apache-ant-1.9.2-bin.tar.gz" por el enlace correspondiente a este paquete. En nuestro caso por "http://archive.apache.org/dist/ant/binaries/apache-ant-1.9.2-bin.tar.gz".

    Y ahora sí, por fin procederemos a la instalación del paquete rmr2:
     # R CMD INSTALL --byte-compile rmr2/pkg/
       ...
       ** building package indices
       ** testing if installed package can be loaded
       * DONE (rmr2)
       Making 'packages.html' ... done
  10. Hadoop - Variables de Entorno.
    Nuestro siguiente paso será asegurarse de que estén declaradas en nuestro sistema las variables de entorno HADOOP_HOME, HADOOP_CMD y HADOOP_STREAMING.
     # echo $HADOOP_HOME
       /opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30
     # echo $HADOOP_CMD
       /usr/bin/hadoop
     # echo $HADOOP_STREAMING
       /opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.5.0.jar
    
    En caso contrario tendremos que añadir al final de los ficheros /etc/profile y ~/.bashrc las iguientes líneas, eso sí, de acuerdo a nuestra instalación de Cloudera.
  11.  export HADOOP_HOME=/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30
     export HADOOP_CMD=/usr/bin/hadoop
     export HADOOP_STREAMING=/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.5.0.jar
    
    Y por último ejecutar:
     # source /etc/profile
     # source ~/.bashrc
    
    Si consultamos ahora estas variables de entorno, deberían devolvernos sus correspondientes valores. 

  12. Instalar RHDFS.
  13. Nos descargamos el paquete rhdfs:
     # cd /tmp/
     # git clone https://github.com/RevolutionAnalytics/rhdfs.git
       Initialized empty Git repository in /tmp/rhdfs/.git/
       remote: Reusing existing pack: 494, done.
       remote: Total 494 (delta 0), reused 0 (delta 0)
       Receiving objects: 100% (494/494), 714.69 KiB | 285 KiB/s, done.
       Resolving deltas: 100% (200/200), done.
    
    Y lo instalamos:
     # R CMD INSTALL –byte-compile rhdfs/pkg/
       ...
       ** building package indices
       ** testing if installed package can be loaded
       * DONE (rhdfs)
       Making 'packages.html' ... done
    Alcanzado este punto R y RHadoop estarán instalados.
  14. R - Pruebas.
  15. Primero deberemos configurar correctamente los permisos sobre el directorio /user de nuestro sistema de ficheros HDFS.
     # su hdfs
     $ hadoop -fs chmod -R 777 /user
     $ exit
    
    Ahora podremos comprobar que todo funciona correctamente con este sencillo y típico ejemplo antes de instalar RStudio o bien saltarnos este paso y hacer dichas comprobaciones tras instalar la herramienta en cuestión.
     # R
      > Sys.setenv(HADOOP_HOME=”/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30”)
      > Sys.setenv(HADOOP_CMD=”/usr/bin/hadoop”)
      > Sys.setenv(HADOOP_STREAMING=”/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.5.0.jar”)
      > library(rmr2)
      > library(rJava)
      > library(rhdfs)
      > hdfs.init()
      > ints = to.dfs(1:100)
      > calc = mapreduce(input = ints, map = function(k, v) cbind(v, 2*v))
      ...
      > from.dfs(calc)
       $key
       NULL
    
       $val
       v
       [1,]   1   2
       [2,]   2   4
       [3,]   3   6
       [4,]   4   8
       [5,]   5  10
       ...
    
  16. Instalar Servidor RStudio.
  17. Desde la propia web de RStudio descargaremos el paquete de la versión servidor o buscaremos y copiaremos el enlace a dicho paquete ejecutando a continuación alguna de las siguientes opciones.
    En caso de ser el sistema de 64-bits:
     # wget http://download2.rstudio.org/rstudio-server-0.98.501-x86_64.rpm
     # yum install --nogpgcheck rstudio-server-0.98.501-x86_64.rpm
    En caso de ser de 32-bits:
     # wget http://download2.rstudio.org/rstudio-server-0.98.501-i686.rpm
     # yum install --nogpgcheck rstudio-server-0.98.501-i686.rpm
    RStudio se instalará como un servicio más de linux por lo que podremos ejecutar sobre él las operaciones típicas de start, stop o status.
     # service rstudio-server stop
     # service rstudio-server start
     # service rstudio-server status
    Al haber descargado la opción de RStudio Server tendremos la posibilidad de acceder a esta herramienta desde cualquier otro equipo de nuestra LAN visitando la siguiente dirección:

    http://<ip_server>:8787/

    El usuario y contraseña que por defecto nos crea la herramienta es rhadoop para ambos campos.

    Por cierto, decir que las sesiones van asociadas al usuario por lo que sólo un usuario podrá estar conectado con él. En caso de conectarse con el mismo usuario desde otro equipo este último nos 'robará' la sesión anteriormente iniciada.

    Por suerte la solución es simple, los usuarios de RStudio Server son usuarios del propio sistema operativo (con root no será accesible) así que nos será suficiente con crearnos los que deseemos (no hace falta incluirlos en ningún tipo de grupo de usuarios):
     # useradd usuario1
     # passwd usuario1
    Consejo: Una vez autenticado, crear en el home del usuario el fichero .Rprofile y añadir en él las siguiente líneas.
     Sys.setenv(HADOOP_HOME=”/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30”)
     Sys.setenv(HADOOP_CMD=”/usr/bin/hadoop”)
     Sys.setenv(HADOOP_STREAMING=”/opt/cloudera/parcels/CDH-4.5.0-1.cdh4.5.0.p0.30/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.5.0.jar”)
     library(rmr2)
     library(rJava)
     library(rhdfs)
     hdfs.init()
    
    Esto os evitará tener que escribirlas cada vez que iniciemos R con dicho usuario pues en su inicio R las ejecutará automáticamente por nosotros.
Bien, pues o volvemos a ejecutar las comprobaciones del punto 8 o ya estaría todo listo.

Espero que os haya sido de utilidad este tutorial y ahora ya sólo falta que cada uno le saque el partido o rendimiento deseado a R.

¡¡¡ Muchas gracias !!!