{"id":13376,"date":"2022-03-24T12:43:36","date_gmt":"2022-03-24T12:43:36","guid":{"rendered":"https:\/\/beta.bluetab.net\/?p=13376"},"modified":"2022-03-24T12:43:36","modified_gmt":"2022-03-24T12:43:36","slug":"databricks-sobre-azure-una-perspectiva-de-arquitectura-parte-2","status":"publish","type":"post","link":"https:\/\/beta.bluetab.net\/en\/2022\/03\/databricks-sobre-azure-una-perspectiva-de-arquitectura-parte-2\/","title":{"rendered":"Databricks sobre Azure &#8211; Una perspectiva de Arquitectura (parte 2)"},"content":{"rendered":"<h1>Databricks sobre Azure &#8211; Una perspectiva de arquitectura (parte 2)<\/h1>\n<p>Compartir en twitter<br \/>\nCompartir en linkedin<\/p>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" rel=\"noopener\">Francisco Linaje<\/a><\/h4>\n<p>AWS Solutions Architect<\/p>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/gabriel-gallardo-ruiz-9042a0212\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg-150x150.png\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/gabriel-gallardo-ruiz-9042a0212\/\" target=\"_blank\" rel=\"noopener\">Gabriel Gallardo Ruiz<\/a><\/h4>\n<p>Senior Data Architect<\/p>\n<p>En esta segunda entrega nos centraremos en analizar los diferentes servicios que ofrece Databricks para asegurar el escalado de nuestros servicios y la recuperaci\u00f3n ante fallas del sistema, as\u00ed como otros aspectos relativos a la seguridad como encriptaci\u00f3n de los datos tanto reposo como en tr\u00e1nsito.<\/p>\n<p><b>Primera entrega (<\/b><a href=\"https:\/\/beta.bluetab.net\/databricks-sobre-azure-una-perspectiva-de-arquitectura-parte-1\/\"><b>link<\/b><\/a><b>):<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Arquitectura alto nivel<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Planes y tipos de carga de trabajo<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Networking<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Identidad y Gesti\u00f3n de accesos<\/li>\n<\/ul>\n<p><b>Segunda entrega:<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Disaster Recovery<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Escalabilidad<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Seguridad<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Logging y monitorizaci\u00f3n<\/li>\n<\/ul>\n<h2>Glosario<\/h2>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>All Purpose Compute<\/b>: Dise\u00f1ado para entornos colaborativos en los que se recurra de forma simult\u00e1nea al cl\u00faster por parte de Data Engineers y Data Scientist<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Azure Data Lake<\/b>: Permite almacenar m\u00faltiples formatos de datos en un mismo lugar para su explotaci\u00f3n y an\u00e1lisis, actualmente Azure dispone la versi\u00f3n Gen2 .<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Azure Key Vault<\/b>: Servicio administrado de Azure que permite el almacenamiento seguro de secretos.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Azure Virtual Network (VNET)<\/b>: Red virtual aislada l\u00f3gicamente en Azure.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>DBFS (Databricks File Systen)<\/b>: Sistema de archivos de Databricks que se monta sobre los sistema de archivos distribuido de los Cloud Providers.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Data Lake<\/b>: Paradigma de almacenamiento distribuido de datos provenientes de multitud de fuentes y formatos, estructurados, semi estructurados y sin estructurar.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Identity Provider (IdP)<\/b>: Entidad que mantiene la informaci\u00f3n de identidad de los individuos dentro de una organizaci\u00f3n.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Infraestructura como c\u00f3digo o IaC<\/b>: gesti\u00f3n y aprovisionamiento de la infraestructura a partir de c\u00f3digo declarativo.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Jobs Compute<\/b>: Enfocado a procesos orquestados mediante pipelines gestionados por data engineers que puedan conllevar autoescalado en ciertas tareas<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Jobs Light Compute<\/b>: Dise\u00f1ado para procesos cuya consecuci\u00f3n no sea cr\u00edtica y no conlleve una carga computacional muy elevada<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Network Security Group o NSG<\/b>: Especifican las reglas que regulan el tr\u00e1fico de entrada y salida de la red y los clusters en Azure<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Private Link<\/b>: Permite el acceso privado (IP privada) a Azure PaaS a trav\u00e9s de tu VNET, de la misma forma que los service endpoints el tr\u00e1fico se enruta a trav\u00e9s del backbone de Azure.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>SQL Compute<\/b>: Cluster reservados a queries para la visualizaci\u00f3n de la informaci\u00f3n almacenada en el Data Lake<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Secret scope<\/b>: Colecci\u00f3n de secretos identificados por un nombre.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Secure Cluster Connectivity (SCC)<\/b>:&nbsp; Comunicaci\u00f3n a trav\u00e9s de t\u00fanel inverso SSH entre Control Plane y cluster. Permite no tener puertos abiertos ni IPs p\u00fablicas en las instancias.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Security Assertion Markup Language (SAML)<\/b>: Est\u00e1ndar abierto utilizado para la autenticaci\u00f3n. Basado en XML, las aplicaciones web utilizan SAML para transferir datos de autenticaci\u00f3n entre dos entidades, el Identity Provider y el servicio en cuesti\u00f3n.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Service endpoints<\/b>: Componente de red que permite conectar una VNET con los diferentes servicios dentro de Azure a trav\u00e9s de la propia red de Azure.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>TLS\/ TLS1.2 (Transport Layer Security)<\/b>: es un protocolo de cifrado y comunicaci\u00f3n que proporciona comunicaciones seguras por una red, com\u00fanmente Internet.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Workspace<\/b>: Entorno compartido para acceder a todos los activos de Databricks. En este se organizan los diferentes objetos (notebooks, librerias, etc\u2026) en carpetas y se administran los accesos a recursos computacionales como clusters y jobs.<\/li>\n<\/ul>\n<h2>Disaster Recovery<\/h2>\n<p>Entendemos por <i>Disaster Recovery<\/i> al conjunto de pol\u00edticas, herramientas y procedimientos que permiten la recuperaci\u00f3n de la infraestructura cuando el sistema en su conjunto cae, como por ejemplo una ca\u00edda de una regi\u00f3n de Azure.<\/p>\n<p>No debemos confundir estas pol\u00edticas y herramientas con las empleadas en materia de alta disponibilidad de nuestro sistema (m\u00ednimo nivel de servicios).<\/p>\n<p>Para ello, cuando implementamos una soluci\u00f3n en la nube, una de las principales preguntas que debemos plantearnos a la hora de dise\u00f1ar e implementar nuestra soluci\u00f3n es:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">\u00bfQu\u00e9 piezas son cr\u00edticas en nuestro sistema?<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">\u00bfQu\u00e9 da\u00f1os pueden provocar en el servicio?<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">\u00bfC\u00f3mo puede el sistema adaptarse y recuperarse ante estos errores?<\/li>\n<\/ul>\n<p>Dar respuesta a estas preguntas es de vital importancia si deseamos que nuestra soluci\u00f3n pueda cumplir adecuadamente el est\u00e1ndar de calidad que hayamos planteado.<\/p>\n<p>Para este punto debemos analizar en que \u00e1mbito de nuestra soluci\u00f3n opera Databricks y que herramientas o pautas debemos seguir para que la plataforma pueda cumplir con su servicio.<\/p>\n<p>Debemos recordar que Databricks ofrece soluciones en materia de transformaci\u00f3n y almacenamiento de datos tanto batch como en streaming, utilizando Azure Blob storage como capa de persistencia de datos no estructurados, como asimismo diferentes herramientas relacionadas con orquestaci\u00f3n de jobs o an\u00e1lisis ad-hoc de datos v\u00eda SQL como servicio de analitica. Por lo tanto en este punto veremos que diferentes herramientas pueden ser propuestas para sincronizar nuestros workspaces,activos\/recursos involucrados entre nuestras regiones.<\/p>\n<h3><strong><br \/>\nConceptos DR<\/strong><\/h3>\n<p>Para poder comprender que es Disaster Recovery, deberemos primero comprender dos conceptos importantes:<\/p>\n<h4><strong>Recovery Point Objective (RPO)<\/strong><\/h4>\n<p>Hace referencia a la cantidad de datos m\u00e1xima p\u00e9rdida (medida en minutos) aceptable despu\u00e9s de una ca\u00edda del sistema. En este caso al disponer de Azure Blob Storage como sistema de persistencia distribuido, el concepto aplicar\u00eda a los datos de usuario temporales almacenados por Databricks, como por ejemplo cambios realizados en nuestros notebooks.<\/p>\n<h4><strong>Recovery Time Objective (RTO)<\/strong><\/h4>\n<p>Entendemos por RTO al periodo de tiempo desde la ca\u00edda del sistema hasta la recuperaci\u00f3n del nivel de servicio marcado.<\/p>\n<p>En la siguiente imagen, podemos observar ambos conceptos de una forma visual:<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"487\" height=\"301\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image8.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image8.png 487w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image8-300x185.png 300w\" sizes=\"(max-width: 487px) 100vw, 487px\"><figcaption>Esquema conceptual sobre los conceptos RPO\/RTO (fuente: Databricks)<\/figcaption><\/figure>\n<p>Es importante indicar que la corrupci\u00f3n existente en los datos no se ver\u00e1 mitigada por las pol\u00edticas asociadas a DR, sin embargo Databricks ofrece Delta time travel como sistema de versionado.<\/p>\n<h3><strong>Tipos de regi\u00f3n y redundancia<\/strong><\/h3>\n<p>Una vez comprendido los conceptos de RPO y RTO, deberemos comprender los diferentes tipos de regiones en los que operar\u00e1 nuestra soluci\u00f3n:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Regi\u00f3n primaria<\/b>: Regi\u00f3n principal donde opera el sistema de forma normal.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Regi\u00f3n secundaria<\/b>: Regi\u00f3n alternativa que entrar\u00e1 en operativa en caso de ca\u00edda de la regi\u00f3n primaria.<\/li>\n<\/ul>\n<p>En nuestro caso de uso, estamos implementando un workspace de Databricks, por lo tanto emplearemos como capa de persistencia principal Blob Storage. Este servicio ofrece diferentes posibilidades a la hora de replicar nuestros datos entre regiones, vamos a verlas.<\/p>\n<p><b>Region primaria<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Almacenamiento con redundancia local (LRS)<\/b>: se realizan tres copias s\u00edncronas dentro de una \u00fanica ubicaci\u00f3n f\u00edsica en la regi\u00f3n primaria, reduciendo as\u00ed el coste, pero afectando a la disponibilidad y durabilidad (once nueves) de los datos.<\/li>\n<\/ul>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"273\" height=\"285\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image9.png\" alt=\"\" loading=\"lazy\"><figcaption>Diagrama de replicaci\u00f3n LRS (fuente: Azure)<\/figcaption><\/figure>\n<ul>\n<li><i><b>Almacenamiento con redundancia de zona (ZRS)<\/b>: copia s\u00edncrona de los datos en tres zonas de alta disponibilidad en la regi\u00f3n primaria (doce nueves).<\/i><\/li>\n<\/ul>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"503\" height=\"501\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image3.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image3.png 503w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image3-300x300.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image3-150x150.png 150w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image3-75x75.png 75w\" sizes=\"(max-width: 503px) 100vw, 503px\"><figcaption>Diagrama de replicaci\u00f3n ZRS (fuente: Azure)<\/figcaption><\/figure>\n<p><b>Region primaria y secundaria<\/b><\/p>\n<ul>\n<li aria-level=\"1\"><b>Almacenamiento con redundancia geogr\u00e1fica (GRS): <\/b>Se realiza una copia LRS en la regi\u00f3n primaria y secundaria.<\/li>\n<\/ul>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"731\" height=\"299\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image10.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image10.png 731w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image10-300x123.png 300w\" sizes=\"(max-width: 731px) 100vw, 731px\"><figcaption>Diagrama de replicaci\u00f3n GRS (fuente: Azure)<\/figcaption><\/figure>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Almacenamiento con redundancia de zona geogr\u00e1fica (GZRS)<\/b>: Se realiza una copia con ZRS en la regi\u00f3n primaria y mediante LRS en la regi\u00f3n secundaria.<\/li>\n<\/ul>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"960\" height=\"541\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image13.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image13.png 960w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image13-300x169.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image13-768x433.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\"><figcaption>Diagrama de replicaci\u00f3n GZRS (fuente: Azure)<\/figcaption><\/figure>\n<p>En ambos casos, el acceso a los datos en la regi\u00f3n secundaria no estar\u00e1 disponible salvo activaci\u00f3n de la opci\u00f3n de lectura RA.<\/p>\n<p>Dadas estas configuraciones, en la siguiente imagen se pueden ver los escenarios planteados en los que nuestros datos dejar\u00edan de ser accesibles.<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"901\" height=\"402\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image11.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image11.png 901w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image11-300x134.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image11-768x343.png 768w\" sizes=\"(max-width: 901px) 100vw, 901px\"><figcaption>Disponibilidad y acceso al dato seg\u00fan la redundancia configurada (fuente: Azure)<\/figcaption><\/figure>\n<p>Deberemos configurar el nivel de replicaci\u00f3n y redundancia entre zonas con el fin de disponer de nuestros datos sincronizados y disponibles en las regiones secundarias con el fin de que est\u00e1s puedan estar operativas.<\/p>\n<h3><strong><br \/>\nTipos de despliegue<\/strong><\/h3>\n<p>Dentro de los tipos de despliegue, podemos encontrar diferentes combinaciones seg\u00fan la necesidad de respuesta y los costes que deseamos asumir por su disponibilidad.<\/p>\n<ul>\n<li><b>Activo<\/b>: Despliegue principal que ejecuta las funcionalidad y servicios propios del sistema.<\/li>\n<li aria-level=\"1\"><b>Pasivo<\/b>: Procesos que no operan en el despliegue principal y permanecen inactivos\/pasivos hasta que el despliegue activo deje de funcionar por una ca\u00edda.<\/li>\n<\/ul>\n<p>Es posible encontrar combinaciones de estos: activo-pasivo, activo-activo. De forma general:<\/p>\n<p><strong>Backup Restore<br \/>\n<\/strong>Es la estrategia m\u00e1s econ\u00f3mica y lenta que podemos implementar. El objetivo principal es tener un conjunto de puntos de restauraci\u00f3n en ambas regiones que podamos emplear para recuperar el servicio, sin necesidad de aprovisionar elementos core del sistema en otras regiones.&nbsp;<\/p>\n<p><strong>Pilot Light&nbsp;<br \/>\n<\/strong>Las piezas m\u00e1s importantes de nuestro sistema se encuentran desplegadas de forma activa pero bajo m\u00ednimos dentro de nuestra regi\u00f3n secundaria, de forma que ante una ca\u00edda del sistema los servicios principales podr\u00edan estar operativos y podr\u00edan escalarse de forma gradual (activo-pasivo).<\/p>\n<p><strong>Warn Standby<br \/>\n<\/strong>Estar\u00edamos en un escenario muy similar a Pilot Light pero donde no solo tendr\u00edamos activos nuestros sistemas principales sino tambi\u00e9n una buena parte de los secundarios funcionando bajo m\u00ednimos pero listos para ser escalados (activo-pasivo).<\/p>\n<p><strong>Multi-site<\/strong><br \/>\nEste plan ofrece el mayor grado de respuesta ya que implica disponer de forma activa todas nuestras piezas en una regi\u00f3n secundaria, listas para dar servicio en caso de ca\u00edda de la regi\u00f3n principal (activo-activo)<\/p>\n<p>Deberemos elegir la estrategia que mejor se adapte a nuestro caso de uso que depender\u00e1 principalmente del nivel de respuesta y coste asumible.<\/p>\n<h3><strong>Workflow t\u00edpico de recuperaci\u00f3n<\/strong><\/h3>\n<p>Dentro de los diferentes procedimientos, encontramos la estrategia activa-pasiva como la soluci\u00f3n m\u00e1s sencilla y barata pero a la vez efectiva a la hora de ofrecer respuesta y servicio en el caso donde tras una ca\u00edda del sistema en la regi\u00f3n principal, el sistema pasivo entra en funcionamiento dando soporte al servicio.<\/p>\n<p>La estrategia podr\u00eda ser implementada de forma unificada para toda la organizaci\u00f3n o por grupos\/departamentos de forma independiente basados en sus propias reglas y procedimientos.<\/p>\n<p>De una forma global nos encontraremos que el procedimientos t\u00edpico a alto nivel ser\u00eda el siguiente:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Ca\u00edda de un servicio cr\u00edtico en la regi\u00f3n primaria: red, origen de datos, etc<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Se levanta el servicio en la segunda regi\u00f3n si \u00e9sta no est\u00e1 afectada.\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\">Se deben parar todas las actividades relacionadas con el workspace que sigan en funcionamiento en la regi\u00f3n primaria y realizar un backup de los cambios recientes si es posible.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\">Se inicia el proceso de recuperaci\u00f3n de los servicios sobre la regi\u00f3n secundaria. Actualizando el enrutamiento y direcciones de dominio a la nueva regi\u00f3n.<\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Se verifica que el servicio funciona correctamente y con normalidad.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">En alg\u00fan punto, la incidencia en la regi\u00f3n primaria se ve resuelta y los servicios de Azure vuelven a un funcionamiento normal. Por lo tanto se deber\u00e1 restablecer el sistema sobre la regi\u00f3n primaria.\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\">De forma id\u00e9ntica al punto 2.a se deben parar todos los servicios y cargas de trabajo en la regi\u00f3n secundaria.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\">Adem\u00e1s se deben de volver a actualizar el enrutamiento y las direcciones de dominio a la regi\u00f3n primaria.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\">Por \u00faltimo se debe de realizar un backup de los datos generados durante la ca\u00edda de la regi\u00f3n primaria para ser replicados en esta.<\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Finalmente se verifica que el servicio vuelva a funcionar correctamente y con normalidad en la regi\u00f3n primaria.<\/li>\n<\/ul>\n<p>Una vez nos hacemos una idea general de como ser\u00eda un workflow t\u00edpico de recuperaci\u00f3n activo-pasivo, estudiaremos como podemos aplicarlo dentro de Databricks en nuestros workspaces.<\/p>\n<h3><strong>Disaster Recovery en Azure Databricks<\/strong><\/h3>\n<p>Databricks como plataforma de Data Analytics, tiene los datos como principal activo. Por ello se deben de definir las estrategias que permitan no solo poder seguir operando los servicios de la plataforma y workflows productivos en la regi\u00f3n de soporte, sino la estrategia que permita generar consistencia en la propia replicaci\u00f3n de los diferentes data sources.<\/p>\n<p>En la siguiente imagen se especifican a modo de diagrama los diferentes activos que se ver\u00edan involucrados en la replicaci\u00f3n del plano de control o de datos.<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1001\" height=\"1024\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5-1001x1024.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5-1001x1024.png 1001w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5-293x300.png 293w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5-768x785.png 768w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5-1502x1536.png 1502w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image5.png 1955w\" sizes=\"(max-width: 1001px) 100vw, 1001px\"><figcaption><\/figcaption><\/figure>\n<h3><strong>Estrategia y herramientas en la sincronizaci\u00f3n.<\/strong><\/h3>\n<p>Una vez realizado un an\u00e1lisis de nuestro sistema, deberemos analizar pieza por pieza como podemos realizar el procedimiento de r\u00e9plica y sincronizaci\u00f3n.<\/p>\n<p>Existen dos principales estrategias:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Un cliente que sincroniza los datos productivos y activos de la regi\u00f3n primaria a la secundaria en un flujo programado.<\/li>\n<\/ul>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Herramientas de integraci\u00f3n\/despliegue continuo (CI\/CD) para el despliegue de forma paralela de la infraestructura, c\u00f3digo y otros recursos principales del sistema en ambas regiones, de forma que la regi\u00f3n secundaria se encuentre sincronizada con todos los cambios y desarrollos para ser operativa en caso necesario.<\/li>\n<\/ul>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"827\" height=\"727\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image7.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image7.png 827w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image7-300x264.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image7-768x675.png 768w\" sizes=\"(max-width: 827px) 100vw, 827px\"><figcaption>Esquema de sincronizaci\u00f3n v\u00eda CI\/CD (fuente: Databricks)<\/figcaption><\/figure>\n<h4><strong>Herramientas<\/strong><\/h4>\n<p>Databricks ofrece en la siguiente tabla un resumen del conjunto de estrategias que se podr\u00edan aplicar seg\u00fan el recurso\/activo involucrado de nuestro workspace.&nbsp;<\/p>\n<p><i>Es importante se\u00f1alar que a d\u00eda de hoy no hay ning\u00fan servicio oficial por parte de Databricks que permita administrar e implementar una pol\u00edtica activa-pasiva de los workspaces en Azure.<\/i><\/p>\n<table id=\"eael-data-table-fca13f3\">\n<thead>\n<tr>\n<th id=\"\" colspan=\"\"><\/th>\n<th id=\"\" colspan=\"3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tHerramientas de replicaci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tFEATURE<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tSync Client<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tCI\/CD<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tC\u00f3digo fuente, notebooks, librer\u00edas<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tSincronizaci\u00f3n con la regi\u00f3n secundaria<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\t Despliegue en ambas regiones<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tUsuarios y grupos<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo SCIM para la sincronizaci\u00f3n<br \/>\nen ambas regiones<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tControl de los metadatos de los usuarios<br \/>\ny grupos a trav\u00e9s de GIT.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tConfiguraci\u00f3n de los pools<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo del CLI o API para<br \/>\nla creaci\u00f3n en la segunda regi\u00f3n<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo de templates.<br \/>\nConfigurar la regi\u00f3n secundara<br \/>\ncon min_idle_instances a 0<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tConfiguraci\u00f3n de los jobs<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo del CLI o API para<br \/>\nla sincronizaci\u00f3n con la segunda regi\u00f3n<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo de templates.<br \/>\nConfigurar la regi\u00f3n secundaria<br \/>\ncon concurrencia a 0<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tACLs<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tMediante la API de Permisos 2.0<br \/>\nes posible replicar los controles de acceso<br \/>\nsobre los recursos copiados<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo de templates.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tLibrerias<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tDBFS<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tRepositorio central<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tScripts de inicializaci\u00f3n del cluster<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tReplicar de una regi\u00f3n a otra a trav\u00e9s<br \/>\ndel almacenamiento en el workspace<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tRepositorio central<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tMetadata<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\"><\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tIncluir las DDL en el c\u00f3digo fuente.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tSecretos<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tReplicacion via API o CLI<br \/>\nen el momento de creaci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tConfiguraciones del cluster<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tReplicacion via API o CLI<br \/>\nen el momento de creaci\u00f3n<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo de templates en GIT.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tPermisos de Notebooks, jobs y directorios<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tReplicaci\u00f3n mediante la API de Permisos 2.0<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tEmpleo de templates en GIT.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><strong>Implementaci\u00f3n<\/strong><\/h3>\n<p>Una vez, tenemos clara nuestra estrategia deberemos estudiar como podemos implementarla, para ello disponemos un conjunto de herramientas que van desde IaC, librer\u00edas de sincronizaci\u00f3n de data sources y migraci\u00f3n de workspaces. Sin embargo, ninguna de las librer\u00edas de sincronizado\/migraci\u00f3n es oficial y a\u00fan se encuentran en desarrollo.<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">M\u00f3dulo Databricks de Terraform <a href=\"\/#ref\">[1]<\/a>: para replicar la infraestructura, workspaces, metadatos, etc<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Databricks Workspace Migration Tools <a href=\"\/#ref\">[2]<\/a>: paquete de librer\u00edas para generar un punto de restauraci\u00f3n y migraci\u00f3n de nuestros workspaces en otras regiones e incluso otros proveedores cloud.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Databricks Sync (DBSync) <a href=\"\/#ref\">[3]<\/a>: especializado en la sincronizaci\u00f3n, creaci\u00f3n de copias de seguridad y&nbsp; restauraci\u00f3n de workspaces.<\/li>\n<\/ul>\n<h2>Escalabilidad<\/h2>\n<p>En este punto, veremos las diferentes opciones que ofrece Databricks en materia de escalabilidad, debido a que este punto ya ha sido tratado profundamente por nuestros compa\u00f1eros dentro de la entrada <a href=\"https:\/\/bluetab.org\/es\/databricks-sobre-aws-una-perspectiva-de-arquitectura-parte-2\/\">Databricks sobre AWS &#8211; Una perspectiva de arquitectura (parte 2)<\/a>, nos limitaremos a comentar las caracter\u00edsticas equivalentes en Azure.<\/p>\n<h3><strong>Auto Escalado de workers<\/strong><\/h3>\n<p>De la misma forma que en AWS, Databricks ofrece sobre Azure la posibilidad de escalar horizontalmente de una forma din\u00e1mica el n\u00famero de workers dependiendo el m\u00ednimo y m\u00e1ximo que hayamos definido, permitiendo mejorar el tiempo de los trabajos sin sobre asignar recursos y por lo tanto reduciendo el coste global por trabajo en hasta un 30%.<\/p>\n<p>Por lo general, en la forma tradicional cuando se defin\u00edan las pol\u00edticas de escalado para nuestros clusters se ten\u00edan que establecer una serie de umbrales est\u00e1ticos donde si estos son rebasados se aprovisionan recursos extra, en forma de nodos de c\u00f3mputo de bajo coste y ef\u00edmeros (Spot). En muchos casos el escalado in\/out de estos recursos no es lo suficientemente r\u00e1pido, generando una ralentizaci\u00f3n global del <i>job <\/i>y una utilizaci\u00f3n sub\u00f3ptima de los recursos.<\/p>\n<p>Para ello Databricks propone un&nbsp; nuevo tipo de escalado optimizado [<a href=\"\/#ref\">6<\/a>], donde a partir de la informaci\u00f3n de los ejecutores es capaz de adaptar r\u00e1pidamente los recursos del trabajo a sus necesidades de una forma r\u00e1pida y eficiente, sin necesidad de esperar a que el trabajo completo termine para comenzar el desescalado.<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"247\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image6.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image6.png 1024w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image6-300x72.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image6-768x185.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><figcaption>Auto escalado tradicional: Ejecutores activos vs total de ejecutores (fuente: Databricks)<\/figcaption><\/figure>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"293\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image4.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image4.png 1024w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image4-300x86.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image4-768x220.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><figcaption>Auto escalado optimizado de Databricks: Ejecutores activos vs total de ejecutores (fuente: Databricks)<\/figcaption><\/figure>\n<p>Caracteristicas:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Posibilidad de escalado desde el m\u00ednimo al m\u00e1ximo en dos pasos.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Posibilidad de desescalado aun cuando el cluster no est\u00e1 en <i>idle <\/i>viendo el <i>shuffle file<\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Desescalado en base al porcentaje de nodos trabajando<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">En cluster del tipo <i>job, <\/i>el desescalado puede producirse si estos est\u00e1n infrautilizados tras 40 segundos, en <i>all-purpose<\/i> tras 150 segundos.<i>&nbsp;<\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Posibilidad de configurar la frecuencia de escalado mediante la propiedad <i>spark.databricks.agressiveWindowDownS<\/i><\/li>\n<\/ul>\n<h3><strong>Pools<\/strong><\/h3>\n<p>Para reducir al m\u00e1ximo el tiempo de lanzamiento de una nueva instancia, Databricks permite mantener un set de clusters o pool pre-inicializado en estado <i>idle <\/i>listo para su empleo en nuestros trabajos o en los procesos de escalado. Si se llega al caso de que todo el pool de instancias se ha consumido, de forma autom\u00e1tica se asignar\u00e1n nuevas instancias al pool.<\/p>\n<p>De la misma forma al escalado de los clusters, podremos definir un n\u00famero m\u00e1ximo y m\u00ednimo de instancias que el pool podr\u00e1 tener en estado <i>idle <\/i>para su posterior asignaci\u00f3n al trabajo demandante y el tiempo que estas pueden permanecer desasignadas hasta su eliminaci\u00f3n.<\/p>\n<p>Respecto al tipo de instancias asignado al pool, no podr\u00e1n cambiarse, tanto el driver como los workers del trabajo consumir\u00e1n el mismo tipo de instancias.<\/p>\n<h3><strong>Auto escalado del almacenamiento<\/strong><\/h3>\n<p>Databricks ofrece la posibilidad de asignar un auto escalado en el almacenamiento local en disco del <i>cluster <\/i>con el fin de acotar la necesidad de dimensionado de estos.&nbsp;<\/p>\n<p>Databricks monitoriza el espacio libre en el disco de forma que en caso necesario se montar\u00e1 un disco externo sobre \u00e9ste. Es importante se\u00f1alar que estos discos una vez asignados no podr\u00e1n desmontarse hasta que el <i>cluster <\/i>no sea eliminado, por ello se recomienda emplearlos en instancias <i>Spot <\/i>o que en instancias tengan una pol\u00edtica de auto finalizado<\/p>\n<h2>Seguridad<\/h2>\n<h3><strong>Encriptaci\u00f3n de datos databricks<\/strong><\/h3>\n<p>Uno de los aspectos m\u00e1s importantes cuando vamos a seleccionar una plataforma para&nbsp; el tratamiento de datos es la seguridad de los mismos. Debe ofrecer mecanismos de encriptaci\u00f3n de datos tanto en los sistemas de almacenamiento, com\u00fanmente conocido como datos en reposo (<i>at rest<\/i>), como cuando est\u00e1n en movimiento (<i>in-transit<\/i>).<\/p>\n<h4><strong>En transito<\/strong><\/h4>\n<p>Databricks encripta todos los datos que circulan por cada uno de sus diferentes componentes&nbsp; y or\u00edgenes con TLS.&nbsp; Adem\u00e1s de la encriptaci\u00f3n de datos, se encriptan con TLS todas las comunicaciones que se realizan entre el plano de control y el plano de datos, por tanto los comandos, consultas y meta-data viajan tambi\u00e9n encriptados.<\/p>\n<p>Para plataformas que requieran un nivel alto de protecci\u00f3n, se puede realizar la encriptaci\u00f3n entre los nodos del cluster utilizando la encriptaci\u00f3n RPC de Spark [<a href=\"\/#ref\">7<\/a>]. Est\u00e1 se realiza con cifrado AES de 128 bits a trav\u00e9s de una conexi\u00f3n TLS 1.2. Est\u00e1 opci\u00f3n solo est\u00e1 disponible con el plan premiun y es necesario establecer los par\u00e1metros de configuraci\u00f3n de Spark en el script de init del cluster o en el global si necesitamos que se aplique a todos los cluster del workspace. Es importante que tengamos en cuenta que la encriptaci\u00f3n entre los nodos del cluster puede suponer una disminuci\u00f3n en el rendimiento de los procesos y dado que la red privada de los nodos suele estar aislada, en la mayor\u00eda de los casos no ser\u00e1 necesario este tipo de encriptaci\u00f3n.<\/p>\n<h4><strong>En reposo<\/strong><\/h4>\n<p>Para el cifrado de los datos en reposo se utiliza SSE [<a href=\"\/#ref\">8<\/a>] (server-side encryption), cifra autom\u00e1ticamente los datos cuando se guardan en el almacenamiento distribuido (blob storage, ADLS y ADLS2).<\/p>\n<p>Por defecto DBFS est\u00e1 encriptado usando claves administradas por Microsoft pero tambi\u00e9n permite la opci\u00f3n de usar claves administradas por el cliente, com\u00fanmente conocidas como (CMK), permitiendo de este modo utilizar tu propia clave de cifrado para cifrar la cuenta de almacenamiento del DBFS. Adem\u00e1s, tanto si se usa clave administradas como tu propia clave, tambi\u00e9n se ofrece la posibilidad de una capa adicional de cifrado utilizando un algoritmo\/modo de cifrado diferente en la capa de infraestructura utilizando claves de cifrado administradas por la plataforma.<\/p>\n<p>Para tener un completo cifrado de los datos en reposo, adem\u00e1s del cifrado datos en el almacenamiento distribuido, se puede habilitar la encriptaci\u00f3n de los disco locales de los nodos del cl\u00faster con lo que se permite la encriptaci\u00f3n de los datos temporales que se guardan en las ejecuciones de los procesos. Actualmente est\u00e1 caracter\u00edstica se encuentra en en <a href=\"https:\/\/docs.microsoft.com\/es-es\/azure\/databricks\/release-notes\/release-types\">versi\u00f3n <b>preliminar p\u00fablica<\/b><\/a> y s\u00f3lo est\u00e1 disponible para la creaci\u00f3n del cluster desde el api REST utilizando la configuraci\u00f3n siguiente:<\/p>\n<pre><code class=\"language-python\">{\"enable_local_disk_encryption\": true} <\/code><\/pre>\n<p>Tambi\u00e9n hay que tener en cuenta que activar esta opci\u00f3n puede suponer cierto impacto en el rendimiento de los procesos.<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"820\" height=\"709\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image1.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image1.png 820w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image1-300x259.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image1-768x664.png 768w\" sizes=\"(max-width: 820px) 100vw, 820px\"><figcaption> Diagrama de Arquitectura Databricks  (fuente: Azure)<\/figcaption><\/figure>\n<h2>Logging<\/h2>\n<p>Para el correcto gobierno de una plataforma de ejecuci\u00f3n de datos es necesario disponer de las herramientas necesarias para poder realizar el seguimiento y comprobaci\u00f3n de ejecuci\u00f3n de los <i>workloads<\/i>. Databricks integra en su plataforma todos elementos necesarios para realizar el mismo en un entorno de Spark. A continuaci\u00f3n, vamos a resumir las opciones que integra Databricks <i>out of the box<\/i> aunque se pueden realizar monitorizaciones m\u00e1s avanzadas utilizando otras herramientas o servicios.<\/p>\n<h3><strong>Cluster logs<\/strong><\/h3>\n<p>Para cada uno de los <i>cluster<\/i> o <i>job cluster<\/i> creados en la plataforma podemos consultar de forma visual:<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"929\" height=\"189\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image12.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image12.png 929w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image12-300x61.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image12-768x156.png 768w\" sizes=\"(max-width: 929px) 100vw, 929px\"><figcaption>Captura Workspace &#8211; Secci\u00f3n Clusters<\/figcaption><\/figure>\n<p><b>Event log<\/b>: Se muestran todos los eventos relacionados con el ciclo de vida del cluster que han sucedido, como pueden ser, creaci\u00f3n, terminaci\u00f3n, cambios en la configuraci\u00f3n\u2026<\/p>\n<p><b>Spark UI<\/b>: Permite el acceso a la GUI ofrecida por Spark. Esta GUI es fundamental para poder detectar y solventar los problemas de performance en las aplicaciones de Spark.<\/p>\n<p><b>Driver Logs<\/b> : Permite ver los logs de ejecuci\u00f3n tanto de la salida est\u00e1ndar , error y&nbsp; log4j. Databricks tambi\u00e9n permite que se realice el volcado de logs en un <i>filesystem<\/i> determinado, para ellos es necesario configurarlo en las opciones avanzadas del cluster o indic\u00e1ndolo en la creaci\u00f3n del cluster si se realiza desde crea desde API o CLI.<br \/>\n<b><\/b><\/p>\n<p><b>Metrics:<\/b> Databricks proporciona acceso a Ganglia Metrics para obtener un mayor detalle del rendimiento que est\u00e1 ofreciendo el cluster<\/p>\n<figure>\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"315\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image2-1024x315.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image2-1024x315.png 1024w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image2-300x92.png 300w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image2-768x236.png 768w, https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/image2.png 1458w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><figcaption>Captura Workspace &#8211; Ganglia Metrics<\/figcaption><\/figure>\n<h3><strong>Registro de diagn\u00f3stico en Azure Databricks<\/strong>&nbsp;<\/h3>\n<p>Azure Databricks nos ofrece la posibilidad de descargar los registros de las actividades realizadas por los usuarios a trav\u00e9s del registro de diagn\u00f3stico [<a href=\"\/#ref\">9<\/a>]. Activando esta opci\u00f3n se enviar\u00e1n los registros de la actividad de usuario a un destino seleccionado, Azure tiene disponibles 3 opciones para el env\u00edo de los registros: Cuenta de Almacenamiento, Event y Log Analytics.<\/p>\n<p>Estos son los servicios que se pueden seleccionar para obtener registros de diagn\u00f3stico.<\/p>\n<table id=\"eael-data-table-e466bcd\">\n<thead>\n<tr>\n<th id=\"\" colspan=\"3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tSERVICIOS DISPONIBLES PARA DIAGN\u00d3STICO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tDBFS<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tsqlanalytics<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tmodelRegistry<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tclusters<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tgenie<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\trepos<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\taccounts<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tglobalInitScripts<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tunityCatalog<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tjobs<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tiamRole<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tinstancePools<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tnotebook<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tmlflowExperiment<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tdeltaPipelines<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tssh<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tfeatureStore<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tsqlPermissions<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tworkspace<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tRemoteHistoryService<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tdatabrickssql<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tsecrets<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tmlflowAcledArtifact<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La activaci\u00f3n se puede realizar desde Azure Portal, API REST, CLI, \u00f3 powershell. Los registros est\u00e1n disponibles en un plazo de 15 minutos despu\u00e9s de la activaci\u00f3n.<\/p>\n<p>Este ser\u00eda el esquema de un registro de diagn\u00f3stico de salida<b>&nbsp;<\/b><\/p>\n<table id=\"eael-data-table-30b1714\">\n<thead>\n<tr>\n<th id=\"\" colspan=\"1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tCampo<\/th>\n<th id=\"\" colspan=\"3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tDescripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\toperationversion<\/td>\n<td colspan=\"2\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tVersi\u00f3n del esquema del formato del registro de diagn\u00f3stico.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\ttime<\/td>\n<td colspan=\"2\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tMarca de tiempo UTC de la acci\u00f3n.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.sourceIPAddress<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tDirecci\u00f3n IP de la solicitud de origen.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.userAgent<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tExplorador o cliente de API usado para realizar la solicitud.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.sessionId<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tIdentificador de sesi\u00f3n de la acci\u00f3n.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tidentities<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">Informaci\u00f3n sobre el usuario que realiza las solicitudes:<br \/>\n* * : direcci\u00f3n de correo electr\u00f3nico del usuario.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tcategory<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tServicio que registr\u00f3 la solicitud.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\toperationName<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tLa acci\u00f3n, como el inicio de sesi\u00f3n, el cierre de sesi\u00f3n, la lectura, la escritura, etc.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.requestId<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tIdentificador de solicitud \u00fanico.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.requestParams<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">Pares clave-valor de par\u00e1metro usados en el evento.<\/p>\n<p>El requestParams campo est\u00e1 sujeto a truncamiento. Si el tama\u00f1o de su representaci\u00f3n JSON supera los 100 KB, los valores se truncan &#8230; truncated y la cadena se anexa a las entradas truncadas. En raras ocasiones, cuando un mapa truncado sigue siendo mayor que 100 KB, TRUNCATED en su lugar hay una sola clave con un valor vac\u00edo.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.response<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tRespuesta a la solicitud:<br \/>\n* * : mensaje de error si se ha producido un error.<br \/>\n* * : resultado de la solicitud.<br \/>\n* * : c\u00f3digo de estado HTTP que indica si la solicitud se realiza correctamente o no.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tproperties.logId<\/td>\n<td colspan=\"\" rowspan=\"\" id=\"\">\n\t\t\t\t\t\t\t\t\t\t\t\tIdentificador \u00fanico de los mensa<br \/>\njes de registro.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabla Esquema Registro Salida (fuente: Azure)<\/p>\n<p>Para la explotaci\u00f3n de los registros, si se ha seleccionado la opci\u00f3n de Logs Analytics, podremos explotarlos de forma sencilla utilizando Azure Monitor. Pero si lo que se desea es explotar estos registros con cualquier otra plataforma, servicio o herramienta es posible tomando estos registros JSON del lugar del envio seleccionando en la activaci\u00f3n.<\/p>\n<h2>Referencias<\/h2>\n<p>[1] Databricks Terraform Provider. [<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/databricks\/dev-tools\/terraform\/\">link<\/a>]<\/p>\n<p>[2] Databricks Workspace Migration Tools. [<a href=\"https:\/\/github.com\/databrickslabs\/migrate\">link<\/a>]<\/p>\n<p>[3] Databricks Sync. [<a href=\"https:\/\/github.com\/databrickslabs\/databricks-sync\">link<\/a>]<\/p>\n<p>[4] Databricks Disaster Recovery [<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/databricks\/administration-guide\/disaster-recovery\">link<\/a>]<\/p>\n<p>[5] Cifrado entre nodos de trabajo[<a href=\"https:\/\/docs.microsoft.com\/es-es\/azure\/databricks\/security\/encryption\/encrypt-otw\">link<\/a>]<\/p>\n<p>[6] Optimized AutoScaling [<a href=\"https:\/\/databricks.com\/blog\/2018\/05\/02\/introducing-databricks-optimized-auto-scaling.html\">link<\/a>]<\/p>\n<p>[7] Spark Security [<a href=\"https:\/\/spark.apache.org\/docs\/latest\/security.html\">link<\/a>]<\/p>\n<p>[8] Azure encriptaci\u00f3n discos [<a href=\"https:\/\/docs.microsoft.com\/es-es\/azure\/virtual-machines\/disk-encryption\">link<\/a>]<\/p>\n<p>[9] Registro de diagnostico [<a href=\"https:\/\/docs.microsoft.com\/es-es\/azure\/databricks\/administration-guide\/account-settings\/azure-diagnostic-logs\">link<\/a>]<\/p>\n<h6><strong>Navegaci\u00f3n<\/strong><\/h6>\n<p><a href=\"\/#glosario\">Glosario<\/a><\/p>\n<p><a href=\"\/#disaster\">Disaster Recovery<\/a><\/p>\n<p><a href=\"\/#escalabilidad\">Escalabilidad<\/a><\/p>\n<p><a href=\"\/#seguridad\">Seguridad<\/a><\/p>\n<p><a href=\"\/#logging\">Logging<\/a><\/p>\n<p><a href=\"\/#ref\">Referencias<\/a><\/p>\n<p><a href=\"\/#autores\">Autores<\/a><\/p>\n<h5>\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\n<p><a href=\"\/\" role=\"button\"><br \/>\nDESCUBRE BLUETAB<br \/>\n<\/a><br \/>\nCompartir en twitter<br \/>\nCompartir en linkedin<\/p>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2021\/10\/Francisco-150x150.jpg\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/francisco-linaje-024499175\/\" target=\"_blank\" rel=\"noopener\">Francisco Linaje<\/a><\/h4>\n<p>AWS Solutions Architect<\/p>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/gabriel-gallardo-ruiz-9042a0212\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg-150x150.png\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/gabriel-gallardo-ruiz-9042a0212\/\" target=\"_blank\" rel=\"noopener\">Gabriel Gallardo Ruiz<\/a><\/h4>\n<p>Senior Data Architect<\/p>\n<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/p>\n<h5>DATA STRATEGY<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-strategy\/\"><\/a><a href=\"\/soluciones\/data-strategy\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/p>\n<h5>DATA FABRIC<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-fabric\/\"><\/a><a href=\"\/soluciones\/data-fabric\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/p>\n<h5>AUGMENTED ANALYTICS<\/h5>\n<p><\/a><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><a href=\"\/soluciones\/augmented-analytics\/\">\t\t\t\t\t\t<\/a><\/p>\n<p>Te puede interesar<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Databricks sobre Azure &#8211; Una perspectiva de arquitectura (parte 2) Compartir en twitter Compartir en linkedin Francisco Linaje AWS Solutions Architect Gabriel Gallardo Ruiz Senior Data Architect En esta segunda entrega nos centraremos en analizar los diferentes servicios que ofrece Databricks para asegurar el escalado de nuestros servicios y la recuperaci\u00f3n ante fallas del sistema, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":20803,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,37,8,9],"tags":[],"class_list":["post-13376","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-es","category-interes","category-practices","category-tech"],"acf":[],"jetpack_featured_media_url":"https:\/\/beta.bluetab.net\/wp-content\/uploads\/2022\/03\/4.png","_links":{"self":[{"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/posts\/13376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/comments?post=13376"}],"version-history":[{"count":0,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/posts\/13376\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/media\/20803"}],"wp:attachment":[{"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/media?parent=13376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/categories?post=13376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beta.bluetab.net\/en\/wp-json\/wp\/v2\/tags?post=13376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}