Octubre 2014 | Junio 2015

¿Qué es OpenCPU?

"OpenCPU is a system for embedded scientific computing and reproducible research. The OpenCPU server provides a reliable and interoperable HTTP API for data analysis based on R. You can either use the public servers or host your own."

https://www.opencpu.org

¿Qué es Docker?

"Build, Ship and Run Any App, Anywhere
Docker - An open platform for distributed applications for developers and sysadmins."

https://www.docker.com

Rocker

¿Por qué?

Es una manera sencilla de usar el potencial de R en cualquier servidor, y tener una fácil implementación con otros lenguajes de programación, especialmente para aplicaciones web: Ruby on Rails (Ruby), PHP, Django (Python), Node.js, Tomcat (Java)…
En todos estos lenguajes es muy fácil hacer una conexión http (GET o POST).

 
 

Mi ejemplo de uso:

Añadir una pequeña optimización sobre una aplicación ya realizada en PHP.

Solución:
Montar en el servidor Docker+OpenCPU y hacer llamadas a la API de OpenCPU para resolver las optimizaciones.

¿Cómo?

1 Instalamos Docker (http://docs.docker.com/installation).
2 Descargamos una imagen con opencpu (link):

docker pull opencpu/rstudio

3 Ejecutamos el contenedor y redirigimos el puerto 80:

docker run -d -p 80:80 -p 8787:8787 --name opencpu opencpu/rstudio

4 Comprobamos:

docker ps
## CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                           NAMES
## d9449846d1b7        opencpu/rstudio     "/bin/sh -c 'service   16 minutes ago      Up 16 minutes       443/tcp, 0.0.0.0:80->80/tcp, 8004/tcp, 0.0.0.0:8787->8787/tcp   opencpu

1, 2, 3 Probando…

¿Más paquetes?

El contenedor que nos hemos descargado tiene solo los paquetes básicos.

Podemos usar paquetes "al vuelo":

 

curl -L -s 127.0.0.1/ocpu/cran/RColorBrewer/R/brewer.pal/json -d "n=3&name='Set1'"
## [
##     "#E41A1C",
##     "#377EB8",
##     "#4DAF4A"
## ]

¿Más paquetes? (II)

curl -L -s 127.0.0.1/ocpu/cran/randomForest/R/randomForest/print -d "formula=Species~.&data=iris"
## 
## Call:
##  randomForest(formula = Species ~ ., data = iris) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 5.33%
## Confusion matrix:
##            setosa versicolor virginica class.error
## setosa         50          0         0        0.00
## versicolor      0         47         3        0.06
## virginica       0          5        45        0.10

Ejemplo final

Accedo al contenedor e instalo un paquete personal (Conento):

docker exec -it opencpu /bin/bash

Si quiero guardar los cambios en la imagen, hay que hacer un commit (ver más).

Comprobamos que el paquete está en el contenedor:

curl -L -s  127.0.0.1/ocpu/library/Conento
## 
##      Information on package 'Conento'
## 
## Description:
## 
## Package:          Conento
## Type:             Package
## Title:            Utilidades Conento
## Version:          1.0
## Date:             2013-11-27
## Author:           Jorge Ayuso Rejas
## Maintainer:       Jorge Ayuso Rejas <jorge.ayuso@conento.com>
## Description:      Utilidades para trabajar Conento
## Encoding:         UTF-8
## LazyData:         true
## License:          Conento
## RemoteType:       bitbucket
## RemoteRepo:       conento
## RemoteUsername:   jayusor
## RemoteRef:        master
## RemoteSha:        17917f49e862b260b30607e1cc98ada2f6931b0f
## Built:            R 3.1.2; ; 2015-06-24 18:33:50 UTC; unix
## 
## Index:
## 
## Conento-package         Utilidades Conento
## aexcel                  aexcel
## data_ampl               data_ampl
## dexcel                  dexcel
## exportar_tiposas        exportar_tiposas
## exportar_tiposas2       exportar_tiposas
## iconv.data.frame        iconv.data.frame
## optimizar_qplanner      optimizar_qplanner
## punto_mil               punto_mil
## simpleCap               simpleCap
## trim                    trim

Ejemplo final (II)

Consigo un optimizador expecífico accesible desde cualquier herramienta y fácil de desplegar.

curl -s 127.0.0.1/ocpu/library/Conento/R/optimizar_qplanner/print \
-d "original='[[0.0886,0.061,0.0916,0.0889,0.4034,0.0866,0.1283,0.0516], \
              [0.2,0,0,0.1,0.5,0,0.05,0],[1,1,1,1,1,1,0.05,0.02]]'"
## [1] 0.2000 0.0258 0.0564 0.1000 0.5000 0.0514 0.0500 0.0164
curl -s 127.0.0.1/ocpu/library/Conento/R/optimizar_qplanner/print \
-d "original='[[0.0886,0.061,0.0916,0.0889,0.4034,0.0866,0.1283,0.0516], \
              [0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,0.02]]'"
## Algún mínimo es mayor que su máximo.
## 
## In call:
## optimizar_qplanner(original = "[[0.0886,0.061,0.0916,0.0889,0.4034,0.0866,0.1283,0.0516],               [0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,0.02]]")

Algunas observaciones

  • Podemos restringir el acceso al puerto para que solo escuche desde el localhost
docker run -d -p 127.0.0.1:80:80 opencpu/rstudio

 

 

  • Es posible incluir seguridad básica del servidor web (apache/nginx) en OpenCPU

Más utilidades de Docker

Docker nos abre un mundo de posibilidades, algunos ejemplos:

  • Coreos: Un sistema operativo basado en Docker (apoyado por Google)

https://coreos.com/

 

 

  • Probar multitud de herramientas de manera ágil…

!Gracias! ¿Dudas?