#Contenedorización

0 Seguidores · 41 Publicaciones

La colocación en contenedores es una alternativa ligera para virtualizar equipos completos, la cual consiste en encapsular una aplicación en un contenedor con su propio entorno operativo. 

Artículo Ricardo Paiva · oct 30, 2025 4m read

Complemento de InterSystems IRIS Community Edition para HAOS

Ejecutad InterSystems IRIS dentro de Home Assistant, como un complemento. Antes de que descartéis este artículo pensando que se trata solo de una curiosidad, os invito a deteneros un momento y ver lo fácil que es lanzar aplicaciones basadas en IRIS usando esta plataforma. Si echáis un vistazo a Open Exchange, veréis decenas y decenas de aplicaciones que merecen ser utilizadas, pero que en la práctica quedan abandonadas como simples proyectos en Git, y que solo pueden ejecutarse si estáis dispuestos a enfrascaros en una batalla con containerd o Docker. Con un simple repositorio de Git y una especificación, ahora podéis construir vuestra aplicación en IRIS y hacer que se ejecute a través de un marketplace, reduciendo al mínimo las complicaciones para vuestros usuarios finales. Ejecutadla junto a Ollama y las implementaciones de LLM/LAM, exponed cualquier elemento de IRIS como un sensor o cread un endpoint para que vuestra aplicación en IRIS interactúe con cualquier cosa que tengáis conectada a HAOS. ¿Queréis reiniciar una producción de IRIS con solo accionar un interruptor físico o mediante una IA asistida? Podéis hacerlo con este complemento, o con uno propio, justo al lado de los entusiastas de la automatización del hogar.

0
0 15
Artículo Laura Blázquez García · mayo 13, 2025 3m read

No sé a vosotros, pero a mi me ha pasado varias veces que creo un contenedor Docker (me gusta hacerlo con un docker-compose.yml, me resulta más ordenado 😊) con una versión de IRIS, voy haciendo mis pruebas y llega un día en el que la licencia de ese contenedor ya no es válida, y no funciona...

Si os ha pasado, puede que alguno de vosotros, igual que yo, haya pensado "pues con subir la versión de IRIS en el docker-compose/Dockerfile, suficiente". Pues... no 😅 Al hacerlo, da problemas y no arranca bien el contenedor.

1
2 84
Artículo Alberto Fuentes · mayo 13, 2025 2m read

A veces, los clientes necesitan una instancia pequeña de IRIS para hacer algo en la nube y luego apagarla, o necesitan cientos de contenedores (es decir, uno por usuario final o uno por interfaz) con cargas de trabajo pequeñas. Este ejercicio surgió para ver cuán pequeña podría ser una instancia de IRIS. Para este ejercicio, nos centramos en cuál es la menor cantidad de memoria que podemos configurar para una instancia de IRIS. ¿Conocéis todos los parámetros que afectan la memoria asignada por IRIS?

Configuración de memoria

0
0 41
Artículo Ariel Glikman · abr 21, 2025 4m read

Si echáis un vistazo al archivo values.yaml del Helm chart de IKO, encontraréis:

useIrisFsGroup:false

Vamos a desglosar qué es useIrisFsGroup y en qué situaciones puede ser útil activarlo.

FsGroup se refiere al file system group (grupo del sistema de archivos).

Por defecto, los volúmenes en Kubernetes son propiedad del usuario root, pero necesitamos que IRIS sea propietario de sus propios archivos (IRIS en contenedores se instala bajo el usuario irisowner). Para solucionar esto, utilizamos uno de estos dos métodos:

1) initContainers

0
0 42
Artículo Luis Angel Pérez Ramos · abr 2, 2024 8m read

En este artículo, cubriremos los siguientes temas:

  • ¿Qué es Kubernetes?
  • Componentes principales de Kubernetes (K8)


¿Qué es Kubernetes?

Kubernetes es un marco de orquestación de contenedores de código abierto desarrollado por Google. En esencia, controla la velocidad de los contenedores y ayuda a gestionar aplicaciones formadas de varios contenedores. Además, le permite operarlos en diferentes entornos, por ejemplo, máquinas físicas, máquinas virtuales, entornos de nube o incluso entornos de implementación híbridos.


¿Qué problemas soluciona?

0
0 131
InterSystems Official Jose-Tomas Salvador · jun 30, 2023

Cuando IRIS 2023.2 esté disponible (GA), haremos algunas mejoras en la forma de etiquetar y distribuir los contenedores de IRIS e IRIS for Health.

Los contenedores de IRIS han sido etiquetados usando el número completo de compilación (build), por ejemplo 2023.1.0.235.1. Los clientes llevan un tiempo solicitando etiquetas más estables, para no tener que cambiar sus archivos de Docker/Kubernetes cada vez que se lanza una nueva versión. Y con eso en mente, estamos realizando los siguientes cambios en la forma que etiquetamos las imágenes de los contenedores.

0
0 72
Artículo Eduardo Anglada · sep 24, 2021 2m read

Ejecuto la mayoría de mis revisiones con Docker Desktop en Windows 10. Según las recomendaciones, limpio Docker y los repositorios descargados después de las pruebas:
Los repositorios son sencillos, pero Docker se resiste un poco a liberar el espacio consumido en el disco. Los pasos que ejecuté inicialmente son:

  • eliminar los contenedores pendientes  docker rm -f container . . .
  • eliminar las imágenes descargadas   docker rmi image  . . .
  • limpiar cachés y redes  docker system prune

Pero el espacio que consumió mi disco no se redujo.

Así que buscando en Google, encontré un método muy útil para reducir el consumo en disco de Docker. Y me gustaría compartir esta experiencia con vosotros.

Omito todos los detalles que se explican muy bien en este artículo. 

La razón detrás de este comportamiento poco amigable es que:

  • Docker crea un disco duro virtual ext4,vhdx
  • esta imagen del disco crece y crece automáticamente según es necesario, pero nunca se reduce.
    (No he hablado sobre IRISTEMP o CacheTemp wink)   

Mi resultado después de los hechos es que: ¡¡se liberaron ~15 GB de almacenamiento!!
Una cantidad significativa en mi Notebook de 128GB SSD.

La acción resumida:

  • Desde el icono de Docker en la barra de tareas: 
    • Docker quit 
  • Desde la línea de comandos de Windows. :
    • WSL --stop 
  • Desde PowerShell con derechos de administrador:
    • Optimize-VHD -Path c:\Users<your_username>\AppData\Local\Docker\wsl\data\ext4.vhdx -Mode Full  
2
0 2738
Artículo Mathew Lambert · mar 25, 2020 6m read

¡Hola Comunidad!

Creo que hoy en día todo el mundo guarda el código fuente de sus proyectos en repositorios como Github, GitLab, bitbucket, etc. Lo mismo sucede con proyectos de InterSystems IRIS, se pueden ver algunos ejemplos en Open Exchange.

¿Qué hacemos cada vez que empezamos o continuamos nuestro trabajo con un repositorio en particular con la plataforma de datos InterSystems?

1
1 909
Artículo Ricardo Paiva · mar 11, 2021 6m read

Quería escribirlo como comentario alartículo de @Evgeny.Shvarov. Pero resultó demasiado largo, así que decidí publicarlo por separado.

Imagen que resulta de Docker cuando se limpian todas las imágenes

Me gustaría añadir una pequeña aclaración sobre cómo utiliza Docker el espacio en disco y como limpiarlo. Yo uso macOS, por lo tanto todo lo que explico aplica principalmente a macOS, pero los comandos de Docker se adaptan a cualquier plataforma.

Cuando Docker se incluye en Linux, por defecto funciona en el mismo sistema de archivos. Pero en Windows y macOS, funciona en una pequeña máquina virtual con su propio Linux dentro. Y el espacio del disco está limitado por mi configuración en Docker. En mi caso, lo configuré para utilizar hasta 112 GB.

Por lo tanto, cuando trabajes de forma activa con Docker, tu espacio interior dejará de usarse. Puedes comprobar como Docker emplea todo ese espacio con el comando:

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              84                  6                   66.02GB             55.6GB (84%)
Containers          6                   5                   4.914GB             0B (0%)
Local Volumes       19                  4                   1.812GB             342.7MB (18%)
Build Cache         0                   0                   0B                  0B

En macOS con las últimas versiones de Docker, se utiliza el formato en bruto del disco (anteriormente era qcow2). Y junto con el sistema de archivos APFS en macOS, este archivo puede ocupar menos espacio físico que el propio tamaño del archivo. Observa estos dos comandos. 

$ ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
-rw-r--r--@ 1 daimor  staff   104G Jul 13 15:49 /Users/daimor/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

$ du -h ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
 88G    /Users/daimor/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

El comando ls muestra el tamaño de mi archivo Docker.raw como 104Gb, mientras que el comando du muestra el tamaño real en el disco, que es de 88Gb.

Bien, docker system df me mostró que puedo recuperar algo de espacio. Vamos a hacerlo.

$ docker system prune -f
Deleted Containers:
79b3d54ae5a881e37771cfdc1d651db9ce036abc297dc55bdd454eb287f0e329

Deleted Images:
deleted: sha256:298d555976effb112428ed3f6bcc2f4d77ab02b4f287a230d9535001184078f5
deleted: sha256:adb2c64ce6e44d837fce8067c7498574822bff90ed599d1671c126539fe652ac
deleted: sha256:9695172139cec16f1071449daf29bd1c424353044088b92b8acbf33f59952e67
deleted: sha256:24d834b252e25e645b8b5d9194360f5ab1a26ffd2b5c03b6593b9a2c468f59fa
deleted: sha256:1b4e3e73fe0b7d88d5ec718bdc6dc6d17d9fe8ba00988eb72690d76f2da3d1a3
deleted: sha256:9f218f6c7aca9c21760ae43590a2d73b35110e10b6575125ed3ccd12c4495d6e
deleted: sha256:b2fa3335d672a0dc60ea7674c45ee3c85b9fc86584a0e21cc7f1900c368ceec3
deleted: sha256:2ecace396ab65fd393dfb2e330bece974cd952e7a41364352f9c867d9ea4c34e
deleted: sha256:16b894351fe53b95dd43d7437bbbcd5104b8613bc1fa8480826e843d65fc92a3
deleted: sha256:b00d9c05035eac62f3ed99a814cd6feea3e4b68797b6d1203e2f41538c78c2aa
deleted: sha256:5a3d0d9f36b356cb47d3838585da6450c60e2860ef143d1406b48d3a5e72b92b
deleted: sha256:998e719368ff74d13b3a8c096ce81f8f2c4bb28bd1ccd169bfa173b4a78d2e74
deleted: sha256:a74d7ff2ca7d623134f9ce1db40da476134a733935a3f322ba34b99653c6273d
deleted: sha256:4d0dcd2bdad2cf0cb91d13313afff29326771bdac27fcb8780545687dbd39ae4
deleted: sha256:29a8989eed3d4002053f98bf562654910ee5f8836940daaa2f2344a8f29a52a2
deleted: sha256:12d34fbf938d19b193199ea6cce5d690fd0d57ec3f4d1630e1d4b3790379c9ec
deleted: sha256:75aba481bb5ccaa52a3aadf311ae22485fb2a82d69be864fe2f45f2834c5e515
deleted: sha256:326efafee9b92e06876878b21a2931ba771bc0e0b2b359f906ef6cca1d297905
deleted: sha256:913937f4ea932fcb00b6c6b3007970296955aa4f488d6fbaa1a575a5aa4ff5ab
deleted: sha256:f3fc0c75858a36ff9d3f4e8eb7a96f511158bbac92d128760b0d3340d828c5da
deleted: sha256:c002dde1ea6a02ae3e3037442a5c556a925e3e4750a6b2aa923c51fa3d11f5ac
deleted: sha256:e763f6e226613c67aaf5984e4c74b9f6e9e28e0490a4f3286885f498a57d3fa0
deleted: sha256:e7daf0a1574376c8602515dc70e44392d16e1b79013d6e81a9b697794432e660
deleted: sha256:ce33670f78109dcacc73a7c6d70f4b5cd4a13bcfe7878b9df5e4e16b812e5df4
deleted: sha256:95bf79e86f83ed16943f9c34035bf8167a4b89466a05d6793c2957d6d46bab2d
deleted: sha256:056d184391613b33303ccf3818a95a17398e9da813d093a6ee5d87952539380c

Total reclaimed space: 5.537GB

Este comando elimina cualquier contenedor detenido y cualquier imagen no etiquetada que no se esté utilizando por cualquier imagen etiquetada. Y se puede eliminar de forma segura.

Tal vez has notado que solo se recuperaron 5.5 GB, mientras que docker system df hablaba de unos 55 GB. Eso es porque df cuenta todas las imágenes no activas, no solo las activas. Si también quieres eliminar todas esas imágenes, puedes utilizar este comando, lo que elimina cualquier imagen que no se utilice en los contenedores que estén ejecutándose en este momento. Por lo tanto, si no tienes ningún contenedor funcionando, eliminará todas las imágenes locales.

docker system prune -a

Acabo de recuperar solo las imágenes activas y los contenedores detenidos. Cuánto espacio utiliza mi docker ahora.

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              83                  5                   60.48GB             50.1GB (82%)
Containers          5                   5                   4.914GB             0B (0%)
Local Volumes       19                  3                   1.812GB             342.7MB (18%)
Build Cache         0                   0                   0B                  0B

Como puedes ver, ya utiliza menos tamaño. ls mostrará el mismo resultado. El tamaño del archivo principalmente crece.

$ ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
-rw-r--r--@ 1 daimor  staff   104G Jul 13 16:07 /Users/daimor/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

Pero para macOS es más importante cuánto espacio se utiliza en un disco físico.

$ du -h ~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
 69G    /Users/daimor/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

Y como puedes ver ahora son 69 GB, que son aproximadamente 19 GB menos de los que eran anteriormente.

Así que, para los usuarios de macOS, realmente no importa el tamaño del archivo, con las optimizaciones de APFS en realidad puede ser menor.

Otra forma es reducir las imágenes antiguas con algún filtro por fecha de creación. Al igual que este ejemplo, se eliminarán todas las imágenes creadas hace más de 10 días, pero se mantendrán las imágenes que actualmente utilizan los contenedores.

$ docker image prune --all --filter until=240h
1
0 4823
InterSystems Official Jose-Tomas Salvador · nov 24, 2022

InterSystems anuncia el lanzamiento de la interfaz de usuario web del Registro de Contenedores de InterSystems (ICR por sus siglas en inglés). Esta herramienta ha sido diseñada para que sea más sencillo descubrir, acceder y usar las muchas imágenes alojadas en el Registro de Contenedores.

La IU del Registro de Contenedores de InterSystems está disponible en: https://containers.intersystems.com/contents

0
0 134
Artículo Ricardo Paiva · jun 4, 2021 4m read

Durante las últimas semanas, el equipo de Solution Architecture (Soluciones de Arquitectura) ha estado trabajando para terminar la carga de trabajo de 2019: esto incluyó la creación del código abierto de la Demostración de Readmisiones que llevó a cabo HIMSS el año pasado, para poder ponerla a disposición de cualquiera que busque una forma interactiva de explorar las herramientas proporcionadas por IRIS.

Durante el proceso de creación del código abierto de la demostración, nos encontramos de inmediato con un error crítico. Los datos subyacentes de los pacientes que se utilizaron para crear la demo no podían utilizarse como parte de un proyecto de código abierto porque no eran propiedad de InterSystems, eran propiedad de nuestro socio Baystate Health.

Nuestro equipo estaba en un pequeño aprieto y tenía que encontrar una forma de sustituir los datos originales por datos sintéticos que pudieran utilizarse, pero manteniendo la "historia" de las demos, o su funcionalidad subyacente, consistente. Dado que la demo muestra cómo IRIS admite el workflow de machine learning de un científico de datos, había un nivel de complejidad añadido porque cualquier dato que utilizáramos tenía que ser lo suficientemente realista como para poder apoyar nuestro modelo de investigación. Después de una breve investigación, Synthea vino a nuestro rescate.

Synthea es un generador de pacientes sintéticos, que modela sus historiales médicos. Es de código abierto. Synthea proporciona datos de alta calidad, realistas, pero no reales, de pacientes; en una variedad de formatos (incluido FHIR), con diferentes niveles de complejidad, cubriendo todos los aspectos de la atención médica. Los datos obtenidos no tienen coste, ni privacidad ni restricciones de seguridad, lo que permite investigar con datos de salud que de otra manera no estarían disponibles, de forma legal o práctica.

Después de una investigación inicial, se eligió Synthea como la herramienta para solucionar nuestro problema de datos. Synthea es una herramienta increíble; sin embargo, un problema que encontramos fue que, para ejecutar el software y obtener los pacientes, teníamos que instalar varias dependencias en nuestros equipos.

  • Java JDK 1.8
  • Gradle Build Tool

Cuando trabajas por tu cuenta, esto generalmente no es un problema, pero como nuestro equipo está formado por varias personas, es importante que todos puedan actualizarse con un nuevo software rápidamente; y la instalación de dependencias puede ser una pesadilla. Tenemos el propósito de que el menor número de personas posible sufra durante los procesos de instalación al integrar un nuevo software en nuestro flujo de trabajo.

Como necesitábamos que cualquier persona de nuestro equipo pudiera realizar actualizaciones en la Demo de readmisiones para poder generar pacientes fácilmente, y no queríamos que todos tuvieran que instalar Gradle en sus equipos, nos apoyamos en Docker e introdujimos el software de Synthea dentro de una imagen de Docker, permitiendo que la imagen se ocupe de las dependencias ambientales subyacentes.

Esto terminó funcionando muy bien para nuestro equipo, ya que nos dimos cuenta de que ser capaz de generar datos de pacientes sintéticos sobre la marcha es probablemente un caso de uso muy común al que se enfrentan nuestros compañeros Ingenieros de ventas, por lo que nuestro equipo quería compartirlo con la Comunidad de Desarrolladores.

Cualquiera puede utilizar la siguiente línea de código para generar rápidamente 5 historiales médicos de pacientes sintéticos en formato FHIR, y dejar los pacientes resultantes en una carpeta de salida en el directorio donde está trabajando actualmente.

docker run --rm -v $PWD/output:/output --name synthea-docker intersystemsdc/irisdemo-base-synthea:version-1.3.4 -p 5
  El código de esta imagen Docker tiene su propio repositorio en Github y se puede encontrar aquí para cualquier persona que quiera echar un vistazo, hacer cambios personalizados, o contribuir: https://github.com/intersystems-community/irisdemo-base-synthea

Ahora estamos realizando actualizaciones para que el proyecto sea compatible con módulos personalizados, de modo que cualquiera que desee agregar una enfermedad a sus pacientes generados pueda hacerlo, si Synthea no la proporciona de forma predeterminada, y se incorporará automáticamente a su imagen.

¿Dónde se usa actualmente?

El proceso actual de creación de la Demo de readmisiones utiliza la imagen irisdemo-base-synthea para generar 5 000 pacientes sintéticos sobre la marcha y cargarlos en nuestro repositorio de datos IRIS relacional, normalizado. Cualquier persona que esté interesada en verificar cómo analizar estos datos de pacientes generados de forma sintética (en formato FHIR), puede consultar la Demo de readmisiones creada recientemente con código abierto. La clase que hay que buscar es: IRISDemo.DataLake.Utils. a partir de la línea 613.

La Demo de readmisiones se puede encontrar aquí: https://github.com/intersystems-community/irisdemo-demo-readmission

1
0 316
Artículo Nancy Martínez · sep 8, 2022 2m read

¡Hola desarrolladores!

Los que usáis Dockerfile para trabajar con InterSystems IRIS a menudo tenéis que  ejecutar varias líneas de ObjectScript. Para mí, esto era el juego de "escapar de esto y aquello" cada vez, solo para ejecutar unos pocos comandos en ObjectScript a IRIS. Idealmente, preferiría programar en ObjectScript sin usar comillas o caracteres de escape.

Recientemente he encontrado un buen "hack" sobre cómo esto podría ser mejorado a exactamente este estado. Lo cogí del repositorio de @Dmitry Maslennikov y te permite usar Objectscript de una forma como si lo escribieras en el terminal de IRIS.

Esto es lo que tienes en dockerfile:

///
COPY irissession.sh /
SHELL ["/irissession.sh"]
RUN \
  do $SYSTEM.OBJ.Load("Installer.cls", "ck") \
  set sc = ##class(App.Installer).setup()
# bringing the standard shell back
SHELL ["/bin/bash", "-c"]
CMD [ "-l", "/usr/irissys/mgr/messages.log" ]
///
0
0 100
Anuncio Mario Sanchez Macias · jul 28, 2022

Docker 20.10.14 (lanzado el 23 de marzo de 2022) cambia las funcionalidades que Linux da a los contenedores de una manera que es incompatible con el Linux capability checkeren los contenedores de InterSystems IRIS 2021.1 (y posteriores). 

Los usuarios ejecutando Docker 20.10.14 en Linux encontrarán que los contenedores de IRIS 2021.1+ fallarán al iniciarse y los logs reportarán de forma incorrecta que las funcionalidades requeridas de Linux no se encuentran. Por ejemplo:

0
0 104
Artículo Ricardo Paiva · mayo 3, 2022 7m read

Todo el código fuente del artículo está disponible en: https://github.com/antonum/ha-iris-k8s 

En el artículo anterior, comentamos cómo configurar IRIS en el clúster k8s con alta disponibilidad, basado en el almacenamiento distribuido, en vez del mirroring tradicional. Como ejemplo, ese artículo utilizaba el clúster Azure AKS. En esta ocasión, seguiremos explorando las configuraciones de alta disponibilidad en los k8s. Esta vez, basado en Amazon EKS (servicio administrado para ejecutar Kubernetes en AWS) e incluiría una opción para hacer copias de seguridad y restauraciones de la base de datos, basado en Kubernetes Snapshot.

Instalación

Vamos a lo más importante. Primero: necesitas una cuenta de AWS, y las herramientas AWS CLI,kubectl y eksctl instaladas. Para crear el nuevo clúster, ejecuta el siguiente comando:

eksctl create cluster \
--name my-cluster \
--node-type m5.2xlarge \
--nodes 3 \
--node-volume-size 500 \
--region us-east-1

Este comando tarda unos 15 minutos, implementa el clúster EKS y lo convierte en un clúster predeterminado para tu herramienta kubectl. Puedes verificar la implementación ejecutando:

kubectl get nodes
NAME                                             STATUS   ROLES    AGE   VERSION
ip-192-168-19-7.ca-central-1.compute.internal    Ready    <none>   18d   v1.18.9-eks-d1db3c
ip-192-168-37-96.ca-central-1.compute.internal   Ready    <none>   18d   v1.18.9-eks-d1db3c
ip-192-168-76-18.ca-central-1.compute.internal   Ready    <none>   18d   v1.18.9-eks-d1db3c

El siguiente paso es instalar el motor de almacenamiento distribuido Longhorn.

kubectl create namespace longhorn-system
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.0/deploy/iscsi/longhorn-iscsi-installation.yaml --namespace longhorn-system
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml --namespace longhorn-system

Y, por último, el propio IRIS:

kubectl apply -f https://github.com/antonum/ha-iris-k8s/raw/main/tldr.yaml

En este momento, tendrás un clúster EKS completamente funcional con el almacenamiento distribuido de Longhorn y la implementación de IRIS instaladas. Puedes volver al artículo anterior e intentar hacer todo tipo de daño en el clúster y la implementación de IRIS, solo para ver cómo el sistema se repara a sí mismo. Echa un vistazo a la sección "Simulación del error".

Bonus #1 IRIS en ARM

IRIS EKS y Longhorn son compatibles con la arquitectura ARM, por lo que podemos implementar la misma configuración utilizando instancias de AWS Graviton2, basadas en la arquitectura ARM.

Todo lo que necesitas es cambiar el tipo de instancia para los nodos EKS a la familia "m6g" y la imagen IRIS a la basada en ARM.

eksctl create cluster \
--name my-cluster-arm \
--node-type m6g.2xlarge \
--nodes 3 \
--node-volume-size 500 \
--region us-east-1

tldr.yaml

containers:
#- image: store/intersystems/iris-community:2020.4.0.524.0
- image: store/intersystems/irishealth-community-arm64:2020.4.0.524.0
name: iris

O simplemente utiliza:

kubectl apply -f https://github.com/antonum/ha-iris-k8s/raw/main/tldr-iris4h-arm.yaml

¡Eso es todo! Ya tienes el clúster IRIS Kubernetes, ejecutándose en la plataforma ARM.

Bonus #2 Copia de seguridad y restauración

Una parte de la arquitectura para nivel de producción que se suele pasar por alto es la capacidad de crear copias de seguridad de la base de datos y que las restaure y/o clone rápidamente cuando sea necesario.

En Kubernetes, la manera más habitual de hacerlo es utilizando Persistent Volumen Snapshots (Snapshots de volumen persistente).

En primer lugar, debes instalar todos los componentes de k8s requeridos:

#Install CSI Snapshotter and CRDs

kubectl apply -n kube-system -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -n kube-system -f https://github.com/kubernetes-csi/external-snapshotter/raw/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -n kube-system -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
kubectl apply -n kube-system -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
kubectl apply -n kube-system -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml

A continuación, configura las credenciales del bucket S3 para Longhorn (consulta estas instrucciones):

#Longhorn backup target s3 bucket and credentials longhorn would use to access that bucket
#See https://longhorn.io/docs/1.1.0/snapshots-and-backups/backup-and-restore/set-backup-target/ for manual setup instructions
longhorn_s3_bucket=longhorn-backup-123xx #bucket name should be globally unique, unless you want to reuse existing backups and credentials
longhorn_s3_region=us-east-1
longhorn_aws_key=AKIAVHCUNTEXAMPLE
longhorn_aws_secret=g2q2+5DVXk5p3AHIB5m/Tk6U6dXrEXAMPLE

El siguiente comando tomará las variables de entorno del paso anterior y las utilizará para configurar la copia de seguridad de Longhorn

#configure Longhorn backup target and credentials

cat <<EOF | kubectl apply -f -
apiVersion: longhorn.io/v1beta1
kind: Setting
metadata:
 name: backup-target
 namespace: longhorn-system
value: "s3://$longhorn_s3_bucket@$longhorn_s3_region/" # backup target here
---
apiVersion: v1
kind: Secret
metadata:
 name: "aws-secret"
 namespace: "longhorn-system"
 labels:
data:
 # echo -n '<secret>' | base64
 AWS_ACCESS_KEY_ID: $(echo -n $longhorn_aws_key | base64)
 AWS_SECRET_ACCESS_KEY: $(echo -n $longhorn_aws_secret | base64)
---
apiVersion: longhorn.io/v1beta1
 kind: Setting
metadata:
 name: backup-target-credential-secret
 namespace: longhorn-system
value: "aws-secret" # backup secret name here
EOF

Puede parecer mucho, pero esencialmente le indica a Longhorn que utilice un bucket S3 específico con las credenciales precisas para almacenar el contenido de las copias de seguridad.

¡Eso es todo! Si ahora vas a la interfaz de usuario de Longhorn, podrás crear copias de seguridad, restaurarlas, etc.

Un recordatorio rápido sobre cómo conectarse a la interfaz de usuario de Longhorn:

kubectl get pods -n longhorn-system
# note the full pod name for 'longhorn-ui-...' pod
kubectl port-forward longhorn-ui-df95bdf85-469sz 9000:8000 -n longhorn-system

Esto reenviaría el tráfico desde la interfaz de usuario de Longhorn a tu http://localhost:9000 

Programación de la copia de seguridad/restauración

Hacer copias de seguridad y restauraciones a través de la interfaz de usuario de Longhorn podría ser un primer paso suficientemente bueno, pero vamos a ir un paso más allá y realizar copias de seguridad y restauraciones programáticamente, utilizando APIs de Snapshots k8s.

En primer lugar, el propio snapshot. iris-volume-snapshot.yaml

apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: iris-longhorn-snapshot
spec:
  volumeSnapshotClassName: longhorn
  source:
    persistentVolumeClaimName: iris-pvc

Este snapshot de volumen se refiere al volumen de la fuente "iris-pvc" que usamos para nuestra implementación de IRIS. Así que con solo aplicar esto, el proceso para crear una copia de seguridad se iniciaría inmediatamente .

Es una buena idea ejecutar el Freeze/Thaw de IRIS Write Daemon antes o después del snapshot.

#Freeze Write Daemon
echo "Freezing IRIS Write Daemon"
kubectl exec -it -n $namespace $pod_name -- iris session iris -U%SYS "##Class(Backup.General).ExternalFreeze()"
status=$?
if [[ $status -eq 5 ]]; then
 echo "IRIS WD IS FROZEN, Performing backup"
 kubectl apply -f backup/iris-volume-snapshot.yaml -n $namespace
elif [[ $status -eq 3 ]]; then
 echo "IRIS WD FREEZE FAILED"
fi
#Thaw Write Daemon
kubectl exec -it -n $namespace $pod_name -- iris session iris -U%SYS "##Class(Backup.General).ExternalThaw()"

El proceso de restauración es bastante sencillo. Esencialmente se crea un nuevo PVC y se especifican los snapshots como la fuente.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iris-pvc-restored
spec:
  storageClassName: longhorn
  dataSource:
    name: iris-longhorn-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

A continuación, solo hay que crear una nueva implementación, basada en este PVC. Comprueba este script de prueba en un repositorio de github que podría realizarse con la siguiente secuencia:

  • Crear una nueva implementación de IRIS
  • Añadir algunos datos a IRIS
  • Freeze Write Daemon, tome un snapshot, thaw Write Daemon
  • Crear un clon de implementación de IRIS, basado en el snapshot
  • Verificar que todos los datos todavía están allí

En este momento tendrá dos implementaciones idénticas de IRIS, una de las cuales es un clon hecho por medio de una copia de seguridad de la otra.

¡Espero que os resulte útil!

0
0 324
Artículo Eduardo Anglada · abr 5, 2022 5m read

Si estás implementando más de un entorno/región/nube/cliente, inevitablemente te encontrarás con el problema de la gestión de la configuración.

Aunque todas (o solo varias de) tus implementaciones pueden compartir el mismo código fuente, algunas partes, como la configuración (ajustes, contraseñas) son diferentes de una implementación a otra y se deben gestionar de alguna manera.

En este artículo, intentaré ofrecer varios consejos sobre ese tema. Y comentaré principalmente las implementaciones de los contenedores.

Unificación del código base

Antes de comenzar con la gestión de la configuración, hablemos de la unificación del código base. El problema es el siguiente: el código base debe pretender, por lo general, confluir en una sola versión. Por supuesto, en cualquier momento, tendrás varias versiones de tu código base: la versión DEV con todas las nuevas características, la versión TEST con un código de prueba adicional, la versión PROD, y así sucesivamente. Y eso está bien porque, en este ejemplo, los cambios se fusionan en una versión a lo largo del tiempo. Varias ramas de DEV se convierten en una rama de TEST y así sucesivamente.

El problema comienza cuando tenemos varias versiones en el paso final de nuestro pipeline de implementación. Por ejemplo, el cliente ABC pidió una característica particular XYZ, y ahora hay dos versiones del código base PROD - con la característica XYZ y sin ella. Esto es problemático ya que duplica inmediatamente nuestros tiempos de creación y el consumo de recursos. Claro, algunas veces no hay manera de hacerlo. Sin embargo, supongamos que tienes este tipo de divergencias persistentes en el código base. En ese caso, quizá merezca la pena investigar si se pueden agrupar en una sola versión; en este caso, la característica XYZ se activa o no cuando se inicia.

Dicho esto, vamos a la gestión de la configuración.

 

Gestión de la configuración

¿Qué queremos?

  • No almacenar todas las configuraciones posibles en un solo contenedor (es inseguro para uno, y aún debemos elegir de alguna manera qué configuración aplicar para otro)
  • No crear un contenedor en cada configuración (simplifica el pipeline de CD)

Necesitamos transferir la configuración (ajustes, información confidencial, ...) durante el arranque de InterSystems IRIS y asignarla a nuestra aplicación.

Transferencia de la configuración

Hay varias maneras de transferir la configuración al inicio.

Variables de entorno

Rápido y fácil. En caso de que quieras almacenar todo en una variable, utiliza JSON para realizar la serialización. Además, recuerda que Windows tiene un límite de 32K caracteres en las variables de entorno (megabytes en Linux). Para recuperar variables de entorno utiliza $SYSTEM.Util.GetEnviron("ENV_VAR_NAME"). La principal ventaja es la facilidad de implementación. Además, verifica tu herramienta CD - por lo general, tiene algún tipo de soporte para variables de entorno durante la ejecución del pipeline, algunas veces con soporte de la información confidencial para que sea más seguro.

Archivos montados

La configuración puede ser un archivo montado al inicio. La ventaja es que no tiene límites en la longitud. La desventaja es que no todas las ofertas de la nube son compatibles con los archivos montados, e incluso si lo hacen, la gestión de archivos puede ser más complicada que la gestión de las variables de entorno. Ten en cuenta que los archivos siempre se pueden recuperar de las capas antiguas de un contenedor, aunque se hayan eliminado en una capa posterior.

Combinación en CPF

La configuración del sistema se puede transferir mediante un Archivo Combinado de Configuración. Y es una funcionalidad integrada. Desventaja: El Archivo de Combinación CPF no se encarga de la configuración a nivel de la aplicación.

Docker/Información confidencial del CSP

Docker puede montar información confidencial como un archivo dentro de un contenedor. Las ofertas en la nube a menudo ofrecen una funcionalidad similar. Utilízalo en vez de los archivos sin formato para mejorar la seguridad.

Análisis de la configuración

Bien, ya transmitiste la configuración dentro de un contenedor. ¿Y ahora qué? ¿Cómo la analizamos?

Hay varias opciones:

%ZSTART

%ZSTART incluye tu código personalizado, que se ejecuta cuando se inicia el sistema. Por ejemplo:

SYSTEM
    try {
        new $namespace
        set $namespace = "USER"
        // apply configuration
        set $namespace = "%SYS"
    } catch ex {
        zn "%SYS"
        do ex.Log()
    }
    quit 1

Es importante tener en cuenta que %ZSTART se debe probar completamente, ya que InterSystems IRIS no se iniciará (o se comportará de forma errática) si la rutina %ZSTART devuelve un error.

Ahora ya estás preparado para aplicar tu configuración.

La forma de almacenar/aplicar la configuración a nivel de la aplicación depende, naturalmente, de la aplicación, pero La configuración predeterminada del sistema{.editor-rtfLink} está disponible si utilizas la interoperabilidad. Incluso si no utilizas las producciones de interoperabilidad, puedes utilizar la configuración predeterminada del sistema, ya que está disponible para todo el mundo (siempre y cuando la interoperabilidad esté activada en un namespace).

Para crear una nueva configuración, ejecuta:

Set setting = ##class(Ens.Config.DefaultSettings).%New()
Set setting.ProductionName = production
Set setting.ItemName = itemname
Set setting.HostClassName = hostclassname
Set setting.SettingName = settingname
Set setting.SettingValue = settingvalue
Set setting.Description = description
Set sc = setting.%Save()

Y para recuperar la configuración, llama a cualquiera:

set sc = ##class(Ens.Config.DefaultSettings).%GetSetting(production, itemname, hostclassname, "", settingname, .settingvalue)
set settingvalue = ##class(Ens.Director).GetProductionSettingValue(production, settingname, .sc)

Los hosts de interoperabilidad reciben su configuración automáticamente al iniciar el trabajo del host empresarial.

Resumen

Es fundamental que tu aplicación se pueda configurar cuando se implementa en más de un servidor. Puede ser bastante fácil en la primera parte del ciclo de desarrollo, pero se irá complicando a medida que la aplicación crezca. InterSystems IRIS ofrece varias herramientas que se pueden utilizar para configurar el estado de tu aplicación durante el arranque.

.

¿Cómo gestionas las implementaciones múltiples?

.
0
0 179
InterSystems Official David Reche · mar 16, 2022

La versión 3.3 de InterSystems Kubernetes Operator (IKO) ya está disponible a través de la página de descargas del Centro de Soporte Internacional (WRC) y del Registro de Contenedores de InterSystems.

IKO simplifica el trabajo de InterSystems IRIS e InterSystems IRIS for Health en Kubernetes, al ofrecer una sencilla definición del recurso irisCluster. Consulta la documentación para conocer la lista detallada de funcionalidades, incluyendo sharding sencillo, mirroring y configuración de ECP.

A destacar en IKO 3.3:

  • Soporte a las versiones 2021.2 y 2022.1 de InterSystems IRIS & IRIS for Health
  • Supporte de Kuberentes 1.21
  • Implementación de las configuraciones comunes de System Alerting and Monitoring (SAM) como parte de irisCluster
  • InterSystems API Manager (IAM) ahora también puede ser implementado y gestionado como parte de irisCluster
  • Etiquetado automático del lado activo de la pareja del mirror, de manera que un servicio siempre apunta al miembro del mirror activo
0
0 134
Artículo Nigel Salm · feb 4, 2022 3m read

Acabo de exponer este tema en Global Masters: "IRIS Cheatsheets". IRIS ha introducido muchas funciones nuevas, especialmente en los lenguajes de programación, la compatibilidad con FHIR R4, las herramientas de interoperabilidad mejoradas e IRIS Analytics. Después trabajar 35 años en PC's y portátiles con Windows, sorprendentemente tengo poco conocimiento sobre Linux, Docker y Git. Es más, he escrito casi todas las aplicaciones e interfaces en ObjectScript con pizcas de SQL, .Net y Java Gateways y los conocimientos más básicos de WinSCP, Putty y SSH.

Todo cambió cuando recibí mi primera Raspberry Pi. Primero, tuve que elegir un sistema operativo para escribir en la tarjeta de memoria Micro SD. Las Raspberry Pi tienen su propio sistema operativo, pero a menos que quiera limitarme a ejecutar mis instancias de IRIS, IRIS for Health, Report Server y Ensemble en contenedores Docker, necesitaba escoger un sistema operativo que sea una plataforma compatible con IRIS. Después de investigar mis opciones mediante búsquedas en Google, fue evidente que no era una buena opción tener Windows en la Raspberry Pi, así que rápidamente lo borré de mi lista. Casualmente el primero de mis Raspberry Pi será el controlador de mi primer kit de robot Adeept (PiCar Pro). Me incorporé a STEM. STEM es un modelo educativo para introducir a gente desde 5 años en el mundo de la ingeniería y la programación. STEM son las siglas en inglés de Ciencia, Tecnología, Ingeniería y Matemáticas, y es el modelo predominante que utilizan los fabricantes de Arduino, Adeept, Lego y otros kits de robots. El lenguaje de programación que se utiliza en todas estas implementaciones de STEM es Python. Qué alegría. Python me fascinó desde el momento que me enteré que se implementaría como Lenguaje de programación nativo en IRIS. Desde muy joven, mi asignatura favorita eran las matemáticas, por lo que la introducción de Python, R y Julia en el mundo de IRIS me llenó de emoción.

Descubrí que todos estos lenguajes tienen una gran afinidad con Ubuntu de Linux, una plataforma muy popular para las implementaciones de IRIS. Mejor dicho, es la única plataforma compatible con ARM64, la tecnología que se utiliza en la Raspberry Pi. Así que Ubuntu era claramente la ruta que debía seguir. La siguiente decisión que debía tomar era qué implementación de Ubuntu quería utilizar. Hay tres opciones: Desktop, Server y Core. Se recomienda Ubuntu Server, ya que incluye una garantía de soporte por 5 años. Se interactua con Ubuntu Server proporcionando instrucciones y comandos desde un terminal. Ubuntu Core es una versión inferior de Server y es ideal como base para un contenedor Docker. Siendo novato en Ubuntu, me decidí por Ubuntu Desktop, y encendí mi Pi por primera vez, me encontré con una Interfaz gráfica en el escritorio muy familiar. Además, enseguida descubrí que todas las aplicaciones que utilizo cada día en Windows tienen equivalentes en Ubuntu. En poco tiempo ya tenía instalados Docker, Putty, Git y muchas otras aplicaciones y, lo más satisfactorio de todo, Visual Studio Code.

Dado que de pronto me encontré con tantas tecnologías nuevas con las que trabajar, empecé a buscar documentación sobre todos estos temas y, por supuesto, hay una enorme cantidad de material. La dificultad está en saber qué libro, preguntas frecuentes, video o aplicación de aprendizaje elegir. Mientras recorría página tras página de búsquedas en Google, los documentos que más atrajeron mi atención fueron los Cheatsheets o Guías Rápidas. Consulta mi reto en Global Masters para obtener más información sobre los Cheatsheets. Hay una Guía Rápida sobre la que quería llamar vuestra atención, una que particularmente me impresionó. Es un PDF llamado "Python-cheat-sheet-April-2021".

También descubrí que varios miembros de la Comunidad de Desarrolladores me ayudaron con las preguntas que tenía sobre Raspberry Pi, Ubuntu y Docker. Estoy deseando pasar más tiempo con ellos para acelerar mi formación en estos temas.

0
0 145
Artículo Jose-Tomas Salvador · dic 29, 2021 1m read

Para aquellos a los que, en un momento dado, necesitan probar cómo va eso del ECP para escalabilidad horizontal (cómputo y/o concurrencia de usuarios y procesos), pero les da pereza o no tienen tiempo de montar el entorno, configurar los nodos, etc..., acabo de publicar en Open Exchange la aplicación/ejemplo OPNEx-ECP Deployment .

0
0 224
Artículo Alberto Fuentes · sep 20, 2021 2m read

¡Hola desarrolladores!

Otra forma de empezar a utilizar InterSystems Objectscript Package Manager es descargar las imágenes pre-construidas de InterSystems IRIS Community Edition o IRIS for Health Community Edition.

Estas imágenes de IRIS están desplegadas en DockerHub y puedes ejecutarlas directamente con este comando:

docker run --rm -p 52773:52773 --init --name my-iris -d intersystemsdc/iris-community:2021.1.0.215.0-zpm

A continuación, puedes lanzar una sesión de terminal de esta forma:

docker exec -it my-iris iris session IRIS

Y por último, instalar un módulo de zpm así:

USER>zpm

=============================================================================
|| Welcome to the Package Manager Shell (ZPM).                             ||
|| Enter q/quit to exit the shell. Enter ?/help to view available commands ||
=============================================================================
zpm:USER>install objectscript-math

[objectscript-math]	Reload START (/usr/irissys/mgr/.modules/USER/objectscript-math/0.0.5/)
[objectscript-math]	Reload SUCCESS
[objectscript-math]	Module object refreshed.
[objectscript-math]	Validate START
[objectscript-math]	Validate SUCCESS
[objectscript-math]	Compile START
[objectscript-math]	Compile SUCCESS
[objectscript-math]	Activate START
[objectscript-math]	Configure START
[objectscript-math]	Configure SUCCESS
[objectscript-math]	MakeDeployed START
[objectscript-math]	MakeDeployed SUCCESS
[objectscript-math]	Activate SUCCESS
zpm:USER>

Puedes utilizar los mismos comandos para IRIS For Health con el tag intersystemsdc/irishealth-community:2021.1.0.215.0-zpm

Estas imágenes se publican para IRIS Community Edition y para IRIS For Health Community Edition en repositorios de DockerHub.

Las etiquetas se actualizan con cada nueva distribución de IRIS.

Happy coding!

0
0 113
Artículo David Reche · mayo 24, 2021 1m read

Tengo un MacOS y Docker Desktop 2.2 (Engine 19.03).

Tengo un servicio REST funcionando en mi localhost (Mac) y estaba intentando invocarlo desde IRIS que se está ejecutando en un contenedor Docker. Si intentas algo así, no utilices localhost como configuración del servidor HTTP (usando una Business Operation, por ejemplo).

Tienes que utilizarhost.docker.internal.

0
0 192
Artículo Nancy Martínez · abr 20, 2021 2m read

Al trabajar desde casa durante estos "días de coronavirus", me faltan recursos.

  • no tengo ninguna máquina Linux disponible
  • espacio en disco limitado

Además, Docker Desktop (en Windows10) bloqueó de alguna manera los scripts de Durable %SYS como se describe aquí.
Investigando el caso, descubrí que se almacenaban muchos más datos de los que realmente necesitaba.
Así que diseñé mi durabilidad personalizada.

De forma similar a lo que hice tiempo atrás para los contenedores de Caché.

Utilizando las características de **iris-main **agrego un script de pre-procesamiento para iniciar mi contenedor con 

Después de que termina, guardo lo que creo necesitar para el próximo inicio.

Y eso es bastante menos.
De acuerdo: Puede que se me escapen algunas cosas y finalmente es más lento en start/stop. Muy bien. ¡Pero está en mis manos!
  Los scripts para ejecutar y también los datos guardados están almacenados en el directorio externo que necesito para la licencia.
Y esos scripts son bastante sencillos:

# post.copy
cp -uf /usr/irissys/iris.cpf /external/iris.cpf
cp -uf /usr/irissys/mgr/IRIS.DAT /external/mgr/IRIS.DAT
cp -uf /usr/irissys/mgr/messages.log /external/console.log

y

# pre.copy
cp -f /external/iris.cpf /usr/irissys/iris.cpf
cp -f /external/mgr/IRIS.DAT /usr/irissys/mgr/IRIS.DAT
rm -f /usr/irissys/mgr/messages.log

Como no hay nada que configurar en la primera ejecución, omito pre.copy como la primera ejecución hecha.
Por lo demás, mi comando de ejecución en Docker tiene el siguiente aspecto:

docker run --name iris1 --init -it 
 -p 52773:52773 -p 51773:51773 
 --volume c:/external:/external 
 --rm 
intersystems/iris:2020.2.0.198.0 
  --key /external/key/iris.key 
  -e /external/post.copy 
  -b /external/pre.copy 

Si tiempo después descubro que necesito guardar/recuperar algo más (por ejemplo, para CSP, ... ) es fácil añadirlo.
La clave del éxito fue dejar la base de datos IRISSYS en la ubicación que se incluye en el contenedor. Su tamaño de ~92 MB (en mi caso) no es relevante.

0
0 115
InterSystems Official Eduardo Anglada · sep 4, 2020

¡Hola desarrolladores!

Es un placer anunciar la disponibilidad del Registro de Contenedores de InterSystems. Es un nuevo canal para que los clientes tengan acceso a las versiones finales y de prueba de software, en formato apto para contenedores. Todas las imágenes Community Edition están disponibles en un repositorio público que no necesita autenticación. Las imágenes finales (IRIS, IRIS for Health, Health Connect, System Alerting and Monitoring, InterSystems Cloud Manager) y las utilidades (como pueden ser arbiter, Web Gateway y PasswordHash) requieren un token de autenticación que se genera a partir de las credenciales de la cuenta del WRC.

0
0 159
InterSystems Official Jose-Tomas Salvador · mayo 26, 2020

AWS ha liberado oficialmente su segunda generación de procesadores Graviton2 basados en ARM y asociados al tipo de instancia Amazon EC2 M6g, que presume de ser hasta un 40% mejor en precio-rendimiento sobre la actual generación de instancias M5 basadas en Xeon. 

Hace pocos meses, Inthhis nos llevó a suportar arquitecturas ARM64 por primera vez.

¡Ahora puedes probar InterSystems IRIS e InterSystems IRIS for Health sobre instancias Amazon EC2 M6g basadas en Graviton2 accesibles a través del AWS Marketplace!

0
0 198
Artículo Alberto Fuentes · mayo 15, 2020 12m read

¡Muy buenas! Repasemos hoy un genial artículo de David E. Nelson sobre cómo montar un entorno de pruebas utilizando contenedores Docker para experimentar con IRIS, Spark y Zeppelin.

Gracias a la creciente disponibilidad de contenedores y el cada vez más útil Docker para Windows / MacOs, tengo mi propia selección de entornos preconfigurados para aprendizaje automático y data science. Por ejemplo, Jupyter Docker Stacks y Zeppelin en Docker Hub. Gracias también a la edición IRIS Community en un contenedor, tenemos un práctico acceso a una plataforma de datos que admite tanto el aprendizaje automático y análisis junto con otras muchas funciones. Al usar contenedores, no necesito preocuparme por actualizaciones automáticas que puedan arruinar mi área de pruebas. Si mi oficina se inundara y el portátil quedara inservible, podría recrear fácilmente el área de pruebas con un único archivo de texto, que por supuesto subí a un sistema de control de versiones ;-)

A continuación compartiré el archivo de Docker Compose que usé para crear un área de pruebas basada en un contenedor para Machine Learning. El área de pruebas comprende dos contenedores: uno con un entorno Zeppelin y Spark, el otro con la plataforma de datos InterSystems IRIS community. Ambos usan imágenes disponibles en Docker Hub. Luego mostraré cómo configurar el InterSystems Spark Connector para conectarlos entre sí. Para terminar, cargaré algunos datos en InterSystems IRIS y usaré Spark para hacer exploración y visualización de datos y algún aprendizaje automático muy básico. Por supuesto, mi ejemplo apenas tocará la superficie de las capacidades tanto de Spark como de InterSystems IRIS. Sin embargo, espero que el artículo sea útil para que otros comiencen a realizar tareas más complejas y útiles.

Archivo Docker Compose

  • Dos contenedores: uno contiene InterSystems IRIS Community Edition y el otro contiene tanto el entorno de bloc de notas Zeppelin y Apache Spark. Ambos contenedores se basan en imágenes tomadas de la tienda de Docker.
  • Una conexión de red entre ambos contenedores. Con esta técnica, podemos usar los nombres de los contenedores como nombres de host al configurar la comunicación entre los contenedores.
  • Directorios locales montados en cada contenedor. Podemos usar estos directorios para hacer que los archivos jar queden disponibles para el entorno Spark y para que algunos archivos de datos queden disponibles para el entorno IRIS.
  • Un volumen con nombre para la funcionalidad duradera %SYS que requiere InterSystems IRIS. InterSystems IRIS requiere volúmenes con nombres cuando se ejecuta dentro de contenedores en Docker para Windows. Por más información sobre este tema, consulte abajo los enlaces a otros artículos de la comunidad.
  • Mapear algunos puertos de red dentro de los contenedores a puertos disponibles fuera de los contenedores para brindar un fácil acceso.
version: '3.2'
 
services:
  # contenedor con InterSystems IRIS
  iris:
    # imagen de iris community edition a extraer de la tienda Docker.
    image: store/intersystems/iris:2019.1.0.510.0-community 
    container_name: iris-community
   
    ports:
    # 51773 es el puerto predeterminado del superserver
    - "51773:51773"
    # 52773 es el puerto predeterminado del webserver/portal de gestión
    - "52773:52773"
 
    volumes:
    # Crea un volumen con nombre durable_data que guardará los datos duraderos %SYS
    - durable:/durable
    # Mapea un directorio /local para permitir el fácil traspaso de archivos y scripts de prueba
    - ./local/samples:/samples/local
 
    environment:
    # Configurar la variable ISC_DATA_DIRECTORY al volumen durable_data que definimos antes para usar %SYS duradero
    - ISC_DATA_DIRECTORY=/durable/irissys   
    
    # Agrega el contenedor IRIS a la red definida a continuación.
    networks:
      - mynet
  
  # contenedor con Zeppelin y Spark
  zeppelin:
    # bloc de notas zeppelin con imagen de spark para extraer desde docker store.
    image: apache/zeppelin:0.8.1
    
    container_name: spark-zeppelin
    
    # Puertos para acceder al entorno Zeppelin
    ports: 
    # Puerto para bloc de notas Zeppelin
    - "8080:8080"
    # Puerto para página de trabajos Spark
    - "4040:4040"
    
    # Mapea directorios /local para guardar blocs de notas y acceder a archivos jar.
    volumes:
    - ./local/notebooks:/zeppelin/notebook
    - ./local/jars:/home/zeppelin/jars
    
    # Agrega el contenedor Spark y Zeppelin a la red definida a continuación.
    networks:
    - mynet
    
   
   #Declara el volumen con nombre para el %SYS duradero de IRIS
volumes:
  durable:
  
  # Define una conexión de red entre ambos contenedores.
networks:
  mynet:
    ipam:
      config:
        - subnet: 172.179.0.0/16

Puesta en funcionamiento

Coloca el archivo compose en un directorio. El nombre del directorio se convierte en el nombre del proyecto Docker. Deberá crear subdirectorios que coincidan con los mencionados en el archivo docker-compose.yml. Por lo tanto, la estructura de directorio se ve así:

|_local
    |_ jars
    |_notebooks
    |_samples
|_ docker-compose.yml

Para iniciar los contenedores, ejecuta esta comando dentro del directorio del proyecto:

$ docker-compose up –d

El flag -d inicia los contenedores en modo detached (estarán ejecutando en background). Puedes usar el comando logs de docker para los registros de log:

$ docker logs iris-community

Para inspeccionar el estado de los contenedores, podemos ejecutar lo siguiente:

$ docker container ls

Accederemos al Portal de gestión de IRIS con la URL: http://localhost:52773/csp/sys/UtilHome.csp La primera vez que iniciemos sesión en IRIS, entraremos con superUser / SYS. A continuación se nos pedirá modificar la contraseña por defecto.

Al bloc de notas Zeppelin accedemos a través de la URL: http://localhost:8080

Copiar algunos archivos jar

Para usar el InterSystems Spark Connector, el entorno Spark debe acceder a dos archivos jar:

  • intersystems-jdbc-3.0.0.jar
  • intersystems-spark-1.0.0.jar

Estos archivos jar están dentro de IRIS en el contenedor iris-community. Debemos copiarlos al directorio localmente mapeado, para que el contenedor spark-zeppelin pueda acceder a ellos.

Para esto, podemos usar el comando cp de Docker para copiar todos los archivos desde dentro del contenedor iris-community hacia uno de los directorios locales visibles para el contenedor spark-zeppelin:

$ docker cp iris-community:/usr/irissys/dev/java/lib/JDK18 local/jars

Agregar datos

Sin datos no hay Machine Learning. Podemos usar los directorios locales montados por el contenedor iris-community para agregar datos a IRIS. Utilizaremos el clásico conjunto de datos sobre la flor Iris. Desde hace tiempo este conjunto de datos cumple la función de ejemplo "Hola Mundo" para Machine Learning.

Puedes descargar o extraer una definición de clase de InterSystems para generar los datos, junto con código para varios ejemplos relacionados, de GitHub (Samples-Data-Mining). Nos interesa únicamente un archivo de este conjunto: DataMining.IrisDataset.cls.

Copia DataMining.IrisDataset.cls al directorio <project-directory>/local/samples. A continuación, para abrir un intérprete bash dentro del contenedor iris-community, ejecuta:

$ docker exec –it iris-community bash

Desde el intérprete bash, inicia una sesión de terminal IRIS con el usuario superuser y la contraseña que cambiaste anteriormente en el portal de gestión.

/# iris session iris

Cargamos la clase para generar los datos en IRIS:

USER>Do $System.OBJ.Load(“/samples/local/IrisDataset.cls”,”ck”)

A continuación, generamos los datos:

USER>Set status = ##class(DataMining.IrisDataset).load()
USER>Write status

La base de datos ahora debería contener ahora datos de 150 ejemplos de flores Iris.

Lanzar Zeppelin y Configurar nuestro bloc de notas

En primer lugar, descarga la nota "Machine Learning Hello World" de Zeppelin disponibles https://github.com/denelson/DevCommunity.

Podrás abrir el bloc de notas Zeppelin en su navegador web en la URL http://localhost:8080. Debería verse algo parecido a esto:

Hacemos click en Import note e importamos la nota “Machine Learning Hello World.json” que habíamos descargado antes.

En el primer párrafo de código cargaremos el controlador de InterSystems JDBC y Spark Connector. Por defecto, los blocs de notas Zeppelin ofrecen la variable z para acceder al contexto Zeppelin. Tienes más información disponible sobre contexto Zeppelin en la documentación.

%spark.dep
//z supplies Zeppelin context
z.reset() 
z.load("/home/zeppelin/jars/JDK18/intersystems-jdbc-3.0.0.jar")
z.load("/home/zeppelin/jars/JDK18/intersystems-spark-1.0.0.jar")

Antes de ejecutar el párrafo de código, hacemos click en la flecha abajo que se encuentra al lado de la palabra anonymous y escogemos Interpreter.

En la página Intepreters, buscamos spark, hacemos click en el botón restart (reiniciar) del lado derecho y luego en OK en el cuadro emergente que aparecerá.

Regresamos al bloc de notas "Machine Learning Hello World" y hacemos clic en la pequeña flecha de la derecha para ejecutar el párrafo. Debería resultar algo parecido a esto:

Conectar con IRIS y explorar los datos

Ya está todo configurado. Ahora podemos conectar el código que se ejecuta en el contenedor spark-zeppelin con InterSystems IRIS, que se ejecuta en nuestro contenedor iris-community, y comenzar a explorar los datos que agregamos antes. El siguiente código Python se conecta con InterSystems IRIS y lee la tabla de datos que cargamos en un paso anterior (DataMining.IrisDataset), para luego mostrar las primeras diez filas.

A continuación dejo algunas notas sobre el siguiente código:

  • Necesitamos pasar el usuario y la contraseña en la conexión a IRIS. Utiliza la contraseña que hayas establecido en pasos anteriores. En el ejemplo usamos SuperUser/SYS1.
  • El iris dentro del fragmento de código spark.read.format(“iris”) es un alias para la clase com.intersystems.spark, el conector spark.
  • La URL de conexión, incluyendo "IRIS" al inicio, especifica la ubicación del servidor maestro Spark predeterminado de InterSystems IRIS.
  • La variable spark apunta a la sesión Spark brindada por el intérprete Spark de Zeppelin.
%pyspark
uname = "SuperUser"
pwd = "SYS1"
# sesión spark disponible de forma predeterminada a través de la variable spark.
# La URL usa el nombre del contenedor, iris-community, como nombre de host.
iris = spark.read.format("iris").option("url","IRIS://iris-community:51773/USER").option("dbtable","DataMining.IrisDataset").option("user",uname).option("password",pwd).load()
iris.show(10)

Nota: tienes más información dispone en Uso de InterSystems Spark Connector y SparkContext, SQLContext, SparkSession, ZeppelinContext.

Al ejecutar el párrafo anterior se obtiene la siguiente salida:

Cada fila representa una flor individual y registra el largo y ancho de sus pétalos, su largo y ancho de sépalo, y la especie de Iris a la que pertenece.

%pyspark
iris.groupBy("Species").count().show()

Así, hay tres especies de Iris distintas representadas en los datos. Los datos representan a cada especie por igual. Incluso podemos usar la biblioteca matplotlib de Python para dibujar algunas gráficas. Este es el código para representar Largo de pétalo (Petal length) frente a Ancho de pétalo (Petal width):

%pyspark
%matplotlib inline
import matplotlib.pyplot as plt
#Recuperar una matriz de objetos de fila desde el DataFrame
items = iris.collect()
petal_length = []
petal_width = []
for item in items:
    petal_length.append(item['PetalLength'])
    petal_width.append(item['PetalWidth'])
 
plt.scatter(petal_width,petal_length)
plt.xlabel("Petal Width")
plt.ylabel("Petal Length")
plt.show()

Incluso para el ojo no entrenado, parece haber una fuerte correlación entre largo y ancho de pétalo. Deberíamos poder predecir de forma confiable el largo de pétalo en base al ancho de pétalo.

Un poco de aprendizaje automático

Para predecir el largo de pétalo en base al ancho de pétalo, necesitamos un modelo de la relación entre ambos. Podemos usar Spark para crear dicho modelo muy fácilmente. A continuación utilizamos un código que usa la API de regresión lineal de Spark para entrenar un modelo de regresión.

El código hace lo siguiente:

  1. Crea un nuevo DataFrame de Spark que contiene las columnas de largo y ancho de pétalo. La columna de ancho de pétalo representa la "característica" y la columna de largo de pétalo representa las "etiquetas". Usamos las características para predecir las etiquetas.
  2. Divide los datos aleatoriamente en un conjunto de entrenamiento (70%) y uno de pruebas (30%).
  3. Usa los datos de entrenamiento para ajustar el modelo de regresión lineal.
  4. Aplica el modelo a los datos de prueba y luego muestra el largo de pétalo, ancho de pétalo, características y predicciones.
%pyspark
from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler
 
# Transformar la(s) columna(s) de "Características" (Features) al formato vectorial correcto
df = iris.select('PetalLength','PetalWidth')
vectorAssembler = VectorAssembler(inputCols=["PetalWidth"],
                                  outputCol="features")
data=vectorAssembler.transform(df)   
 
# Dividir los datos entre conjuntos de entrenamiento y prueba.
trainingData,testData = data.randomSplit([0.7, 0.3], 0.0)
 
# Configurar el modelo.
lr = LinearRegression().setFeaturesCol("features").setLabelCol("PetalLength").setMaxIter(10)
 
# Entrenar el modelo con los datos de entrenamiento.
lrm = lr.fit(trainingData)
 
# Aplicar el modelo a los datos de prueba y mostrar sus predicciones de largo de pétalo (PetalLength).
predictions = lrm.transform(testData)
predictions.show(10)

La línea de regresión

El "modelo" no es más que una línea de regresión a través de los datos. Sería interesante conocer la pendiente y punto de intersección con el eje vertical de esa línea. También sería interesante poder visualizar la línea superpuesta a nuestro diagrama de dispersión. El siguiente código recupera la pendiente e intersección con el eje vertical del modelo entrenado y luego las usa para agregar una línea de regresión al diagrama de dispersión de los datos de largo y ancho de pétalo.

%pyspark
%matplotlib inline
import matplotlib.pyplot as plt
 
# recuperar la pendiente e intersección con el eje vertical de la línea de regresión del modelo.
slope = lrm.coefficients[0]
intercept = lrm.intercept
 
print("slope of regression line: %s" % str(slope))
print("y-intercept of regression line: %s" % str(intercept))
 
items = iris.collect()
petal_length = []
petal_width = []
petal_features = []
for item in items:
    petal_length.append(item['PetalLength'])
    petal_width.append(item['PetalWidth'])
fig, ax = plt.subplots()
ax.scatter(petal_width,petal_length)
plt.xlabel("Petal Width")
plt.ylabel("Petal Length")
y = [slope*x+intercept for x in petal_width]
ax.plot(petal_width, y, color='red')
 
plt.show()

¿Qué más podemos hacer?

Hay mucho más que podemos hacer. Obviamente, podemos cargar conjuntos de datos mucho más grandes e interesantes en IRIS. Vea, por ejemplo, los conjuntos de datos Kaggle (https://www.kaggle.com/datasets). Con una licencia completa de IRIS podríamos configurar la fragmentación y ver cómo Spark aprovecha el paralelismo que permite la fragmentación al ejecutarse a través del InterSystems Spark Connector. Spark, por supuesto, brinda muchos otros algoritmos de aprendizaje automático y análisis de datos. Admite varios otros lenguajes, incluyendo Scala y R.

0
0 291
Artículo Jose-Tomas Salvador · feb 3, 2020 7m read

¡Hola Comunidad!

Ahora que la plataforma de datos InterSystems IRIS Data Platform Community Edition está disponible en Docker Hub, parece el momento ideal de probar InterSystems IRIS en un contenedor. Desde hace un tiempo, la Community Edition ha estado disponible en la nube, por ejemplo en AWS, pero podría ser interesante probarla localmente también. Los usuarios de Windows estamos acostumbrados a ver caras de desconfianza y escuchar que "nuestros resultados podrían variar" cada vez que mencionamos usar Docker para Windows. A veces incluso nos dicen que realmente deberíamos considerar ejecutar Docker dentro de máquinas virtuales con Ubuntu. Pfff... frown

0
0 427
Artículo Alberto Fuentes · ene 7, 2020 2m read

¡Hola Comunidad!

El gestor de paquetes InterSystems Package Manager (ZPM) es una gran herramienta, pero es aún mejor si la puedes usar directamente en lugar de tener que instalarla.  

Hay varias formas de hacer esto, a continuación veremos una forma de tener un contenedor IRIS con ZPM instalado a través del Dockerfile.

Hemos preparado un ejemplo con algunas líneas en el Dockerfile que se ocupan de la descarga e instalación de la última versión de ZPM
Añade estas líneas a tu Dockerfile estándar que utiliza el IRIS Community y tendrás ZPM instalado y listo para usar.

Para descargar la última versión del cliente ZPM:

0
0 247
Artículo Jose-Tomas Salvador · nov 27, 2019 5m read

¡Hola a todos!

Como seguramente ya sabréis, ya está disponible en Docker Hub una versión totalmente gratuita de InterSystems IRIS for Health (I4H). Se trata de la versión Community y, como digo, es totalmente gratuita y funcional. Ya se ha hablado de ella en algunos artículos y posts,... así que hoy no va de eso. Aquí vamos a ver el "misterioso caso de la desaparición o, mejor, ausencia de mis datos persistentes cuando arranco el contenedor con la opción durable" (no he encontrado la fuente de letra terrorífica para darle más suspense... el editor de posts da para lo que da smiley ) .

0
0 505