-
Notifications
You must be signed in to change notification settings - Fork 9
/
README.Rmd
172 lines (128 loc) · 5.3 KB
/
README.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
---
Title: "R al parque"
editor_options:
markdown:
wrap: 80
output:
md_document:
variant: gfm
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, echo = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "README-"
)
```
# R Al Parque
Que es lo que obtienes c otro cambio uando organizas una agrupación (cluster) de
roqueros (rockers)? Un festival!
R Al Parque es una prueba de concepto para coordinar contenedores Docker y
hacerlos trabajar en conjunto como un grupo (*EN:cluster*) de trabajadores R
bajo coordinación del paquete `snow`. En este momento no le tenemos una
aplicación otra que casos ejemplos, y si tienes una aplicación para la
aproximación que describimos aquí nos encantaría escucharlo.
Para hacerlo usamos contenedores [Docker](https://docker.com), con imágenes para
R como disponibles en [Rocker](https://github.com/rocker-org/rocker) a los
cuales incluimos
[snow](https://cran.r-project.org/web/packages/snow/index.html).
[esquema de la solución propuesta](esquema.png)
## Referencia
En la carpeta `"manual/referencia` hay un ejemplo de hacer un snow-cluster
dentro de una misma maquina. En nuestro caso lo usamos para hacer correr el
código en un mismo contenedor, y lo usamos como referencia para comparar el
resultado después.
Para correrlo sigue los siguientes pasos (asumimos que tienes
[Docker](https://docker.com) instalado y funcionando).
```
$ cd manual/referencia
$ docker build -t referencia .
$ docker run --name ejemplo -i referencia
```
Verás en como parte del output, después de ver las funciones que asignamos a
cada uno de los tres maquinas asignadas:
```
[1] "Listo! Termine el script del Organizador en la implementacion 'referencia'"
[1] "el resultado es: \n"
1 2 3 4 5 6 7
7.662232 14.892228 28.978089 8.820645 22.477977 49.578876 34.956109
```
Estos valores los tenemos que volver a ver cuando logremos crear un conjunto de
contenedores separados.
# Orquestración manual
## El Parque
El primero paso es crear una red para los contenedores que vamos a iniciar. En
otras palabras: necesitamos un parque para poner el podio. En Docker lo podemos
[hacer
así](http://stackoverflow.com/questions/27937185/assign-static-ip-to-docker-container/35359185#35359185)
```
$ docker network create --subnet=172.18.0.0/16 simonbolivar
```
## Los artistas
Nuestros artistas son los contenedores secundarios. Se construyen como
instancias de un mismo Dockerfile y hay que hacerlo antes de arrancar el
organizador. Sin artistas no hay nada que se pueda organizar.
### Arranca los artistas
Primero construimos la imagen genérica para los artistas
```
$ cd manual/artistas
$ docker build -t artista .
```
Y después incluimos tres actos en el festival
```
$ docker run -d -P --net simonbolivar --ip 172.18.0.2 --name aterciopelados -it artista
$ docker run -d -P --net simonbolivar --ip 172.18.0.3 --name fabulosos_cadillacs -it artista
$ docker run -d -P --net simonbolivar --ip 172.18.0.4 --name mana -it artista
```
## El organizador
Necesitamos un [Mario Duarte](https://es.wikipedia.org/wiki/Rock_al_Parque) para
tomar la iniciativa. En nuestro caso es el contenedor Docker central que corre
como el contenedor primario que dirige contenedores secundarios.
### Arranca el organizador
El organizador tiene su Dockerfile propio.
```
$ cd manual/organizador
$ docker build -t organizador .
$ docker run --net simonbolivar --ip 172.18.0.10 --name duarte -it organizador
```
<<<<<<< HEAD
Lo arrancamos dentro del parque simonbolivar, porque de otra forma no podria
=======
Lo arrancamos dentro del parque simonbolivar, porque de otra forma no podria
>>>>>>> master
comunicarse con los artistas.
Ahora, el organizador se tiene que conectar con todos los artistas para estar
seguro de que están, y para intercambiar llaves. Por eso al arrancar el
organizador va a preguntar si se puede conectar con el artista, y va a preguntar
por la clave:
```
The authenticity of host '172.18.0.2 (172.18.0.2)' can't be established.
ECDSA key fingerprint is SHA256:oyaLzw1rfFs3r//hQE6ScyNmxk5JXiFUR3M0yidKcpI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.18.0.2' (ECDSA) to the list of known hosts.
[email protected]'s password:
```
En el Dockerfile incluimos una clave estándar que es "artista", la cual es la
respuesta por los tres.
Siguiendo el ejemplo de arriba, para ingresar ese contenedor creado con la
imagen de artista a traves de ssh hacemos:
```
```
Y cuando nos pide la clave, ingresamos "artista".
Si miras el codigo r en `organizador.R` veras porque pide por la clave de los
artistas ya definidos arriba: incluimos la direccion IP en el código usando la
función `makeCluster`.
## Docker Compose
Ingresar a la carpeta `/compose` de este repositorio.
Levantar los contenedores con `docker compose` de la siguiente forma:
```
sudo docker compose up
```
Para ingresar al contenedor organizador:
`sudo docker exec -it organizador bash`
Luego, dentro del contenedor de organizador, haces `Rscript organizador` y te
va a solicitar la clave de los 3 workers del cluster ("artista"), luego de
ingresarla para los 3 workers, verás el resultado en pantalla.
## Kubernetes