Las normas expuestas son de obligado cumplimiento. La STIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STIC.
La STIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto.
En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC para proceder a su validación técnica.
Contacto Dpto: Oficina Técnica Business Intelligence
Los cambios en la normativa vendrán acompañados de un registro de las modificaciones. De este modo se podrá realizar un seguimiento y consultar su evolución.
A continuación se recoge en una tabla un resumen de las normativas del presente documento:
Nombre Normativa | Descripción |
Criterios de subida a producción - Normativa para el paso a producción | Listado de requisitos a verificar para confirmar que un activo cumple todas las condiciones para su promoción. |
Criterios de subida a producción - Normativa para el control de versiones | Se exponen las normas para el cambio de versiones del entorno productivo. |
Criterios de subida a producción - Normativa para definición de linaje | Se recoge a nivel general las obligaciones acerca del linaje que hay que tener en cuenta en la subida a producción. |
Criterios de subida a producción - Circuito de subida a producción | Flujograma del circuito de subida a producción. |
Se definen los metadatos que deben incluir los diferentes elementos que se den de alta en Governance. | |
Se definen los metadatos que deben incluir los diferentes elementos que se den de alta en Rocket. | |
Listado de buenas prácticas generales a seguir para el nombramiento de cualquier asset que se desee dar de alta. | |
Estructura que debe seguir la nomenclatura de una asset. | |
Se recogen todas las reglas de nomenclaturas que debe seguir cualquier elemento específico de Governance. | |
Se recogen todas las reglas de nomenclaturas que debe seguir cualquier elemento específico de Rocket. | |
Se exponen las normas relacionadas con la documentación que se debe realizar al incorporar una nueva fuente de datos. | |
Se incluyen las normas relacionadas con la documentación que se debe realizar al incorporar una nueva regla de calidad. | |
Se incluyen las normas que han de cumplirse para la gestión de las relaciones de los assets que se recogen en la herramienta de Governance. | |
Se recogen las normas y políticas a seguir para el uso de la herramienta Airflow en el contexto del proyecto. | |
Se definen pautas para la correcta creación y gestión de los ficheros generados por las ingestas/curaciones realizadas en el sistema de almacenamiento HDFS de Stratio. | |
Directrices para la migración de datos a Postgres y, manejo correcto de las tablas y esquemas en esta base de datos. | |
Se incluyen las normas operativas que han de seguirse para parametrizar las escrituras a sitios externos desde workflows de Rocket. | |
Se recoge un compendio de buenas prácticas a implementar en los proyectos y workflows de Rocket para hacer a éstos más correctos, productivos, eficientes y colaborativos. |
Esta tabla es un documento vivo, es decir, se irá actualizando conforme se vayan añadiendo o modificando las normativas.
Todos los proyectos desarrollados para la STIC deben construirse y desarrollarse en base a los requisitos técnicos y tecnológicos que la infraestructura del SAS soporta. En caso contrario deberá especificarse de forma clara y concisa durante la reunión de lanzamiento del proyecto. A continuación se detalla el conjunto de requisitos a contemplar por parte de los proveedores.
En esta sección se recogen los requisitos mínimos necesarios y los pasos a seguir para asegurar su cumplimiento a la hora de pasar del entorno preproductivo al de producción. En concreto, este documento abarca todos aquellos elementos que se pueden dar de alta en la herramienta de Big Data Stratio. Mediante el cumplimiento de esta normativa, se consigue disponer de un entorno productivo estandarizado, de fácil entendimiento y dispuesto en todo momento a ser explotado, cumpliendo los estándares mínimos en materia de calidad establecidos.
Nota: Esta normativa puede no ser cumplida siempre y cuando la OTBI de su aprobación explícita en caso de ser necesario su incumplimiento.
Para que un conjunto de activos sea cargado en un entorno de producción, deberá cumplir con una serie de requisitos en función del activo que se desee promocionar. Estos requisitos quedan recogidos en el documento específico para ello, el cual deberá ser cumplimentado por el solicitante y validado por el responsable acordado durante el proceso definido para la promoción entre entornos.
A continuación, se listan a modo resumen los diferentes requisitos que han de tenerse en cuenta para verificar que el activo cumple con todas las condiciones establecidas para su promoción. En función del activo que se desee promocionar, determinados requisitos serán de carácter obligatorio.
N-01. Se cumple con la estructura del activo establecida por la organización.
N-02. Se ha definido el propietario del dato.
N-03. Se ha definido el administrador del dato.
N-04. El nombre cumple con la normativa establecida por la organización.
N-05. El campo de descripción del activo se encuentra completo.
N-06. Los permisos de acceso y consumo han sido definidos y validados.
N-07. Contiene los metadatos mínimos asociados.
N-08. El formato de los metadatos asociados es el correcto.
N-09. La sensibilidad de la información ha sido definida y validada.
N-10. Las reglas de calidad han sido aprobadas por el responsable correspondiente.
N-11. Se ha definido y validado el umbral necesario para las diferentes reglas de calidad.
N-12. Los resultados de los perfilados de datos son tratados correctamente
N-13. La frecuencia de ejecución de las reglas de calidad ha sido definida y validada por el responsable correspondiente.
N-14. La tipología de relaciones utilizada está dentro de las establecidas por la organización.
N-15. La tipología de activos de negocio utilizados se recoge en las acordadas por la organización.
N-16. Los términos de negocio han sido definidos y validados por el responsable acordado.
En este apartado se exponen las normas de obligado cumplimiento para el cambio de versiones del entorno productivo.
Este concepto se refiere al registro y seguimiento detallado de la procedencia y los cambios que experimentan los datos a lo largo de su ciclo de vida. Es fundamental para garantizar la transparencia, conocer la trazabilidad y evaluar la confiabilidad de los datos en una organización. En este contexto, es imperativo la añadidura de unos metadatos, tanto a Business Views como a Technicals Views que recojan la información relacionada con el linaje. Concretamente, estos metadatos han sido creados como atributos personalizados en la herramienta (Governance) y cumpliendo la normativa de nomenclatura expuesta en siguientes apartados.
Para recoger el linaje de los datos, se necesitan dos atributos personalizados descritos a continuación, que deberán completarse para todos los datos que se suban a producción:
A través de estos metadatos, se construye un cuadro de mando en Discovery que refleja el linaje de Technicals y Business Views:
A continuación, se muestra el flujograma del circuito de subida a producción de una nueva Mejora en el entorno Big Data Stratio.
En este proceso se identifican tres tipos de roles en los cuales pueden existir diferentes grupos:
Actualmente, se ha identificado que una PL debe contener la siguiente información relacionada con el asset a promocionar:
Toda esta información debe ser la que presenta el asset en el entorno de preproducción. Para su validación respecto a la normativa, se deberán usar los Cuadros de Mando de promociones y el Borrador PID.
Para la creación de una PL, se debe considerar el flujo normal de creación de PLs, por lo que se debe tener presente que este paso abarca la creación de una mejora (por parte del Usuario solicitante), la creación de la versión (por parte de la OTBI) y la creación de la SVE (por parte de los Desarrolladores). Una vez creado todo lo anterior, se procederá a la creación de la PL.
Además, hay que tener en cuenta que para nombrar los workflows en Rocket para la promoción de los assets correspondientes, se debe usar letras minúsculas y espacios, incluyendo el tipo de promoción y el número de la PL correspondiente. Ejemplo: bigusu19 promocion devpre.
En esta sección se establecen los metadatos mínimos y recomendados que deben ir asociados a cada tipo de asset dentro de la plataforma Big Data para que estos se promocionen desde el entorno de preproducción al de producción. Se entiende por assets a todos aquellos elementos que pueden ser creados dentro de la plataforma Big Data. En el caso del SAS la solución es Stratio, por lo que la definición de estos metadatos se realiza en función de los elementos que se pueden crear en los diferentes módulos que la componen. Es por ello que esta sección se subdivide en los tres módulos principales de Stratio, estableciendo para ellos un conjunto de metadatos comunes a todos los tipos de assets del módulo así como los específicos de cada uno de ellos.
Nota: Esta normativa puede no ser cumplida siempre y cuando la OTBI de su aprobación explícita en caso de ser necesario su incumplimiento.
Metadatos comunes
A continuación, se presenta una tabla con los metadatos que son comunes a todos los assets que se encuentran en la herramienta de Governance. Algunos de ellos se encuentran establecidos en el activo de forma automática por la herramienta. En aquellos casos en los que el metadato no se grabe de automáticamente por la herramienta, se deben establecer mediante la creación de los atributos adicionales que sean necesarios.
Los assets que se generan automáticamente en la herramienta a partir de las bases de datos orígenes (Data Dictionary) son muy numerosos y, por tanto, no es necesario generar los metadatos de descripción, estado, obsoleto. No obstante, para todos aquellos activos que se vayan generando con el uso de la herramienta sí deben presentar de forma obligatoria en el entorno de producción los metadatos marcados con dicha etiqueta.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Descripción | Descripción textual del activo. Debe ser lo más escueta posible al mismo tiempo que ofrezca las características generales del tipo de activo. | Obligatorio | Sí | |
Estado | Metadato que indica el estado de inactividad del asset asociado. | Obligatorio en los intrínsecos. | Sí ( en Business Views, Business rules y Business terms ) | |
Fecha de creación | Establece la fecha de creación del asset pertinente en la herramienta. | Obligatorio en los intrínsecos | Sí (En todos exceptuando las ontologías) | |
Fecha de actualización | Indica la fecha en la que se realizó la última modificación del activo. | Obligatorio | Sí | |
Tipo | Metadato que indica a qué tipo de activo (colecciones, reglas de calidad, vistas técnicas…) pertenece el elemento pertinente. | Obligatorio | Sí | |
Obsoleto | atr_obsoleto | Este metadato indicará si el activo es útil o no independientemente de su estado. De esta manera se identifica con facilidad cuándo el activo debe ser borrado o mantenido en la herramienta. Este campo no se incorporará de forma integral en la herramienta, sino que se irá creando conforme los assets vayan quedando obsoleto. | Obligatorio | No |
Responsable | atr_responsable | Contacto del responsable del mantenimiento y uso del activo asociado. | Recomendable | No |
Propietario | atr_propietario | Contacto del propietario del activo asociado. | Recomendable | No |
Usuario actualización | atr_usu_act | Metadato que identifica el miembro que ha actualizado por última vez el activo en cuestión. | Recomendable | No |
Metadatos específicos
En este apartado, se especifican los metadatos que son únicos de cada tipo de activo presentes en la herramienta. Es decir, cada asset debe presentar tanto los metadatos comunes como los definidos en este apartado que se encuentren categorizados como obligatorios.
A continuación, se muestra una tabla con los metadatos exclusivo del asset de colecciones.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Ámbito | atr_ambito | Departamento dentro del SAS que requiere el uso de la colección pertinente. | Obligatorio | No |
Además, existe un conjunto de metadatos asociados a los procesos de ingestas.
Todos los metadatos de este tipo comienzan con los caracteres "dlc".
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
dlc.replication | Indica si la Collection o Technical View debe ser ingestada. Una vista técnica es ingestada sí se cumplen estas dos condiciones:
| Obligatorio | Sí | |
dlc.entity.alias | Este nombre es utilizado para definir el nombre de la entidad en el servicio DLC siguiendo el formato {dlc.entity_alias}-technicalViewName. En la actualidad, se indica como valor el nombre de la colección. | Obligatorio | Sí | |
dlc.instance | Nombre del servicio DLC que va a orquestar el proceso de ingesta para la colección. Por motivos de arquitectura puede existir más de un servicio DLC en un entorno. Actualmente existen 3 instancias DLC, una por entorno:
De este modo,
| Obligatorio | Sí | |
dlc.cron | Indica la planificación de la ejecución de la ingesta en formato de tarea programada Spring. Está formado por 6 campos:
Estos campos siguen la siguiente sintáxis: Sintáxis Cuándo Ejemplo Explicación ----------------------------------------------------------------------------------------- | Obligatorio | Sí | |
dlc.workflow_path | Directorio donde se ubica el workflow en Rocket. El formato del path es el siguiente: /home/{nombre_proyecto}/{path} Donde:
De este modo, si se establece el parámetro a /home/dlc/dlc significa que queremos utilizar un workflow ubicado en el path /dlc del proyecto dlc. En la actualidad, el parámetro se establece con el valor /home/dlc/dlc. | Recomendado | Sí | |
dlc.workflow_name | Nombre del workflow en Rocket. Por defecto, dlc-crossdata-parquet En la actualidad, se realizan dos tipos de ingesta:
Atendiendo a los tipos de ingesta, se utilizan los siguientes workflows:
| Recomendado | Sí | |
dlc.workflow_version | Versión del workflow de Rocket. Por defecto, 1. En la actualidad, las versiones utilizadas para los workflows arriba indicados son los siguientes:
| Recomendado | Sí | |
dlc.table_filter | Filtro where que se desea incluir en la migración, debe incluir la palabra where. Este atributo se realiza cuando la ingesta de la tabla se realiza de forma incremental – por deltas – en lugar de completa - snapshots. Si no existe, la ingesta de la tabla será completa. | Recomendado | Sí | |
dlc.table_fields | Campos de la tabla que se desean migrar, si no se incluye se migrarán todos. | Recomendado | Sí | |
dlc.execution_context | Permite que dlc comunique a Rocket un contexto de ejecución específico. Se utiliza fundamentalmente para realizar la ingesta con unos recursos más elevados para aquellas tablas que, debido a su volumetría, se hace más complicada su ingesta. En el caso de ingestas automáticas, los contextos de ejecución Environment y SparkConfigurations permanecerán con sus valores por defecto, mientras que si se desean modificar, se define un contexto específico mediante el valor SparkResources, que puede tomar los siguientes valores.
Este parámetro no está habilitado para establecerse a nivel Vista Técnica si el parámetro dlc.group_entities es true. En tales casos, se recomienda crear una colección diferenciada y establecer el contexto de ejecución específico a nivel de colección. | Recomendado | Sí | |
dlc.referential_integrity | Permite la ejecución de la ingesta sin tener en cuenta la integridad referencial entre las tablas de la fuente de datos. De este modo, la colección se ingesta en tres fases dependiendo de las constraints referenciadas existentes en la fuente de origen con el siguiente orden: en primer lugar, las tablas sin referencias, en segundo lugar las tablas referenciadas por las tablas de la primera fase y, en tercer lugar, las tablas restantes. Para bases de datos replicadas, es recomendable marcar el parámetro a false. Si el parámetro no es false, al incluir una tabla en la colección, se debe incluir también sus tablas referenciadas, de lo contrario la parametrización será errónea. | Recomendado | Sí | |
dlc.group_entities | Indica si la ejecución se realiza ejecutando la ingesta de varias tablas de forma simultánea para la colección. Esto acelera el proceso de ingesta acortando considerablemente el tiempo total del proceso para una determinada colección. | Recomendado | Sí | |
dlc.group_entities_max_per_wf | Si dlc.group_entities es true, define cuántas entidades se ingestan de forma simultánea. Un valor recomendado depende de las condiciones específicas de cada colección (talla de SparkResources con la que se ejecutan las ingestas, ventana de disponibilidad de la ingesta en el entorno de analítica, etc). Un buen valor inicial puede ser de 10. | Recomendado | Sí | |
dlc.clone_gr | Indica si dlc copia las Quality Rules del asset origen en el asset destino. | Recomendado | Sí | |
dlc.clone_gr_overwrite | Indica a dlc si debe sobreescribir las Quality Rules en destino al realizar la copia de QRs desde origen. | Recomendado | Sí | |
dlc.spark_user | Indica el usuario spark con el que ejecutar el workflow de Rocket para ingestar la entidad. | Recomendado | Sí | |
dlc.table_partition | Permite especificar una clave de partición al escribir los datos en hdfs. Esta clave de partición debe ser un campo de la tabla a ingestar (o generado en el proceso de ingesta). | Recomendado | Sí | |
dlc.extra_options | Define parámetros adicionales necesarios para la ejecución de la ingesta. El formato a indicar como valor es el siguiente: [{"clave_1":"valor_1", …, “clave_n”:”valor_n”}] | Recomendado | Sí | |
dlc.replicates_into | Path de hdfs donde se replicará la colección. | Obligatorio | Sí (Related Asset) |
En la siguiente tabla se presenta el listado de los metadatos únicos que deben presentar las vistas técnicas de una colección determinada.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Data Dictionary | Campo que hace referencia al asset del Data Dictionary del que proviene la tabla o columna que compone la technical view. | Obligatorio | Sí | |
Fuente de datos | Nombre de la base de datos del sistema origen en el que se encuentran almacenadas las tablas. | Obligatorio | Sí | |
Alias | Acrónimo breve que permite reconocer con facilidad el activo. | Recomendado | Sí | |
Fecha actualización de los datos en el origen | atr_fec_act_ori | Campo que indica cuál fue la última fecha de actualización de los datos en el origen. Este metadato es diferente al de actualización del activo dentro de la propia plataforma. | Recomendado | No |
Tipo de esquema | Establece el tipo de esquema del sistema origen de los datos. | Obligatorio | Sí | |
Modo de descubrimiento | Mecanismo mediante el cual se ha autodescubierto la fuente de datos origen. | Recomendado | Sí | |
Origen | atr_origen | Indica el asset del cuál proviene la tabla. Este atributo se usa para la definición del linaje. | Obligatorio | No |
Transformación | atr_transformacion | Da información acerca de las posibles transformaciones que puede sufrir una tabla. Este atributo se usa para la definición del linaje. |
Dentro de las Technical Views, a nivel de trabla existen unos atributos que son propios de la base de datos origen en la que se encuentran almacenados dichos datos y también otros metadatos que facilitan la parametrización y el trabajo con los procesos de ingesta. Para facilitar la lectura de dichos metadatos, se dividen en las dos tablas siguientes.
Todos los metadatos de este tipo comienzan con los caracteres "bdl".
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
bdl.partition | Establece si la tabla se encuentra o no particionada. | Recomendado | Sí | |
bdl.businessSchema | - | Obligatorio | Sí | |
bdl.forcedPartitionColumn | En modo automático, el usuario especifica qué columna quiere usar como columna de partición. | Obligatorio | Sí | |
bdl.limit | Sirve para definir un límite para todas las consultas sobre la tabla. | Obligatorio | Sí | |
bdl.lowerBound | El mínimo valor de PartitionColumn para decidir el número de particiones. | Obligatorio | Sí | |
bdl.numPartitions | Número de particiones. Junto a lowerBound (inclusivo) y upperBound (exclusivo), determinan las distintas particiones que formarán la cláusula where que se usan para dividir la columna partitionColumn de manera uniforme | Obligatorio | Sí | |
bdl.optimization | Define que tipo de optimización se aplicará. Valores posibles:
Si el atributo no se usa, el agente BDL no hará nada. | Obligatorio | Sí | |
bdl.optimizationFailure | BDL ha intentado poner toda la información de partición en el catálogo, pero algo no es correcto. | Obligatorio | Sí | |
bdl.optimized | Indica si el agente ha terminado la optimización. | Obligatorio | Sí | |
bdl.options.customSchema | - | Obligatorio | Sí | |
bdl.options.oracle.jdbc.mapDateToTimeStamp | Metadato booleano cuyo valor false implica que no se realiza el mapeo automático entre los valores Date a Timestamp. | Obligatorio | Sí | |
bdl.options.sessionInitStatement | Establece el formato el formato de fechas en el acceso a Oracle. Para editar este formato es necesario que el metadato bdl.options.oracle.jdbc.mapDateToTimeStamp presente el valor false. | Obligatorio | Sí | |
bdl.partitionColumn | Nombre de la columna que se utilizará para realizar la partición. | Obligatorio | Sí | |
bdl.technicalSchema | - | Obligatorio | Sí | |
bdl.upperBound | El mínimo valor de PartitionColumn para decidir el número de particiones. | Obligatorio | Sí | |
bdl.whereClause | Cláusula where que se utiliza para realizar el número de particiones totales junto con el resto de atributos. | Obligatorio | Sí |
Todos los metadatos de este tipo comienzan con los caracteres "dlc".
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
dlc.replication | Indica si la Collection o Technical View debe ser ingestada. Una vista técnica es ingestada sí se cumplen estas dos condiciones:
| Obligatorio | Sí | |
dlc.workflow_path | Directorio donde se ubica el workflow en Rocket. El formato del path es el siguiente: /home/{nombre_proyecto}/{path} Donde:
De este modo, si se establece el parámetro a /home/dlc/dlc significa que queremos utilizar un workflow ubicado en el path /dlc del proyecto dlc. En la actualidad, el parámetro se establece con el valor /home/dlc/dlc. Nota: En caso de tener habilitado el metadato dlc.group_entities a nivel de colección, este metadato no estará disponible a nivel de vista técnica. | Recomendado | Sí | |
dlc.workflow_name | Nombre del workflow en Rocket. Por defecto, dlc-crossdata-parquet En la actualidad, se realizan dos tipos de ingesta:
Atendiendo a los tipos de ingesta, se utilizan los siguientes workflows:
| Recomendado | Sí | |
dlc.workflow_version | Versión del workflow de Rocket. Por defecto, 1. En la actualidad, las versiones utilizadas para los workflows arriba indicados son los siguientes:
| Recomendado | Sí | |
dlc.table_filter | Filtro where que se desea incluir en la migración, debe incluir la palabra where. Este atributo se realiza cuando la ingesta de la tabla se realiza de forma incremental – por deltas – en lugar de completa - snapshots. Si no existe, la ingesta de la tabla será completa. | Recomendado | Sí | |
dlc.table_fields | Campos de la tabla que se desean migrar, si no se incluye se migrarán todos. | Recomendado | Sí | |
dlc.execution_context | Permite que dlc comunique a Rocket un contexto de ejecución específico. Se utiliza fundamentalmente para realizar la ingesta con unos recursos más elevados para aquellas tablas que, debido a su volumetría, se hace más complicada su ingesta. En el caso de ingestas automáticas, los contextos de ejecución Environment y SparkConfigurations permanecerán con sus valores por defecto, mientras que si se desean modificar, se define un contexto específico mediante el valor SparkResources, que puede tomar los siguientes valores.
Este parámetro no está habilitado para establecerse a nivel Vista Técnica si el parámetro dlc.group_entities es true. En tales casos, se recomienda crear una colección diferenciada y establecer el contexto de ejecución específico a nivel de colección. Nota: En caso de tener habilitado el metadato dlc.group_entities a nivel de colección, este metadato no estará disponible a nivel de vista técnica. | Recomendado | Sí | |
dlc.clone_gr | Indica si dlc copia las Quality Rules del asset origen en el asset destino. Actualmente se establece siempre a false a nivel Colección. Nota: En caso de tener habilitado el metadato dlc.group_entities a nivel de colección, este metadato no estará disponible a nivel de vista técnica. | Recomendado | Sí | |
dlc.clone_gr_overwrite | Indica a dlc si debe sobreescribir las Quality Rules en destino al realizar la copia de QRs desde origen. Nota: En caso de tener habilitado el metadato dlc.group_entities a nivel de colección, este metadato no estará disponible a nivel de vista técnica. | Recomendado | Sí | |
dlc.spark_user | Indica el usuario spark con el que ejecutar el workflow de Rocket para ingestar la entidad. | Recomendado | Sí | |
dlc.table_partition | Permite especificar una clave de partición al escribir los datos en hdfs. Esta clave de partición debe ser un campo de la tabla a ingestar (o generado en el proceso de ingesta). | Recomendado | Sí | |
dlc.extra_options | Define parámetros adicionales necesarios para la ejecución de la ingesta. El formato a indicar como valor es el siguiente: [{"clave_1":"valor_1", …, “clave_n”:”valor_n”}] | Recomendado | Sí |
Para las columnas que conforman las tablas dentro de la vista técnica, existen una serie de metadatos que son exclusivos de ellos. En la siguiente tabla, se muestran dichos metadatos.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
type | Establece el tipo del objeto de la columna en cuestión, de forma que pueda identificarse con facilidad si es un entero, un string u otro tipo de objeto. | Obligatorio | Sí | |
nullable | Este metadato establece cuando la columna admite valores nulos. | Obligatorio | Sí | |
ordinal | Establece la posición ordinal de la columna en la tabla. | Obligatorio | Sí | |
typeId | Establece el tipo de indicador que presenta la columna. | Obligatorio | Sí | |
precision | Valor entero que establece la precisión de variables numéricas. | Obligatorio | Sí | |
scale | Establece la escala de una variable numérica. | Obligatorio | Sí | |
isSigned | Valor booleano que establece si la columna está o no firmada. | Obligatorio | Sí | |
Sensibilidad | atr_sensibilidad | Indica el nivel de sensibilidad en materia de seguridad de la tabla o columna. La sensibilidad de los datos puede tomar uno de estos tres valores: “publico”, “personal_identificable” o “personal_especial”. Además, debe tener marcado la característica “Security” que aparece en las opciones de custom attributes. | Obligatorio | No |
A continuación, se presenta una tabla con los metadatos específicos para las vistas de negocio que componen una colección determinada.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínsecos |
---|---|---|---|---|
Modo | Metadato que puede tomar un conjunto de valores predeterminados y que establece automáticamente la plataforma. | Obligatorio | Sí | |
Ontología | Nombre de la ontología en la que se construye la vista de negocio. | Obligatorio | Sí | |
Enlace ontología | Enlace a la ontología en la que se basa el activo. | Obligatorio | Sí | |
Colección | Nombre de la colección a la que pertenece el activo. | Obligatorio | Sí | |
Origen | atr_origen | Indica el asset del cuál proviene la tabla. Este atributo se usa para la definición del linaje. | Obligatorio | No |
Transformación | atr_transformacion | Da información acerca de las posibles transformaciones que puede sufrir una tabla. Este atributo se usa para la definición del linaje. |
Reglas de calidad
En la siguiente tabla se muestran los metadatos específicos de las reglas de calidad tanto genéricas como específicas.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Auditoría | Campo seleccionable a la hora de crear reglas de calidad que define si los datos llevan, adicionalmente, a una tabla de auditoría. | Obligatorio | Sí | |
Umbral | Valor umbral por encima del cual los datos analizados cumplen con los criterios de calidad. | Obligatorio | Sí | |
Tipo de ejecución | Puede tomar dos valores, programado o embebido en función de cuándo y cómo se ejecuta la regla. | Obligatorio | Sí | |
Fuente de datos | Datos sobre los que se aplica la regla de calidad. | Obligatorio | Sí | |
Recursos | Exclusiva de las reglas de calidad planificadas. Tamaño de los recursos computacionales asociados al cálculo de la regla de calidad. | Obligatorio | Sí | |
Frecuencia de ejecución | Exclusiva de las reglas de calidad planificadas. Frecuencia con la que se ejecuta la regla de calidad en caso de que sea periódica. | Obligatorio | Sí | |
Tipo de medida | atr_medida | Establece el tipo de regla de calidad según los valores: completitud, actualidad, consistencia, precisión y unicidad. | Obligatorio | No |
Carácter(*) | atr_caracter | Metadato binario que indica cuándo la regla de calidad es de carácter técnico o de negocio. Puede tomar los valores “tec” o “neg”. | Obligatorio | No |
(*) El metadato carácter se creará o no a todas las reglas de calidad ya definidas en la herramienta en función al volumen de estas y el coste de recursos de dichas definiciones. Cualquier regla de calidad nueva que se cree deberá contener este metadato.
A continuación, se muestran los metadatos que son exclusivos de los elementos que componen una ontología.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Ontología | Nombre de la ontología a la que pertenece el elemento en cuestión. | Obligatorio | Sí | |
About | Enlace a la definición de la ontología correspondiente. | Obligatorio | Sí | |
Versión | atr_version | Versión de la ontología a la que pertenece. | Obligatorio | No |
Fecha actualización | atr_fec_act | Última fecha de actualización de la ontología a la que pertenece el elemento. | Obligatorio | No |
A continuación, se muestran en una tabla los metadatos específicos de los assets de las comunidades que componen el glosario de negocio.
Es importante destacar que el metadato que establece el estado ya se encuentra especificado en el apartado de metadatos comunes. No obstante, en el caso de las comunidades este metadato no es intrínseco en la herramienta y, por tanto, es necesario generarlo a través del concepto de atributos adicionales.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Versión | atr_version | Valor de la versión de la comunidad. | Recomendado | No |
Estado | atr_estado | Estado que indica la posible inactividad de la comunidad. | Obligatorio | No |
En la siguiente tabla se muestran los metadatos específicos de los assets de los dominios que componen un dominio concreto dentro del glosario de negocio que se encuentra en la plataforma de Stratio.
Es importante destacar que el metadato que establece el estado ya se encuentra especificado en el apartado de metadatos comunes. No obstante, al igual que en el caso de las comunidades, este metadato no es intrínseco en la herramienta para los dominios y, por tanto, es necesario generarlo a través del concepto de atributos adicionales.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
---|---|---|---|---|
Versión | atr_version | Valor de la versión del dominio. | Recomendado | No |
Estado | atr_estado | Estado que indica la posible inactividad de la comunidad. | Obligatorio | No |
Community | atr_community | Nombre de la comunidad a la que pertenece el dominio. | Obligatorio | No |
En este apartado se agrupan en una tabla los metadatos específicos tanto de los términos como de las reglas de negocio que componen un dominio determinado.
Metadato | Nombre Custom Attribute | Descripción | Obligatoriedad | Intrínseco |
Responsable actualización | Usuario responsable de la última actualización del término o regla de negocio. | Obligatorio | Sí | |
Versión | atr_version | Valor de la versión del dominio al que pertenece. | Recomendado | No |
Community | Nombre de la comunidad a la que pertenece la regla o el término de negocio. | Obligatorio | Sí | |
Dominio | Nombre del dominio al que pertenece el término o regla de negocio. | Obligatorio | Sí |
Esta sección recoge la normativa aplicable para la gestión del módulo de Rocket de la herramienta Stratio, y al igual que en Governance, se distinguen dos grandes bloques para los metadatos. Por un lado, aquellos metadatos comunes a cualquier tipo de asset y, por otro lado, los metadatos específicos para cada uno de ellos.
Cabe destacar que, en Rocket, no se cuenta con la posibilidad de añadir metadatado adicional, al contrario que en Governance.
Existe un conjunto de metadatos que se repiten a lo largo de todos los assets de la herramienta. Estos se generan automáticamente al crear el asset en cuestión, no obstante, el metadato “descripción” se debe rellenar manualmente de forma obligatoria.
Metadato | Descripción | Obligatoriedad | Intrínseco |
Descripción | Descripción textual del activo. Debe ser lo más escueta posible al mismo tiempo que ofrezca las características generales del tipo de activo. También se debe incorporar información extra a modo de metadato excepcional. | Obligatorio | Sí |
Name | Nombre del asset | Obligatorio | Sí |
Type | Establece la tipología del asset, pudiendo ser: AutoMLPipeline, Batch, Hybrid, Mlproject, Notebook, Streaming. | Obligatorio | Sí |
Last modified | Fecha de la última modificación sufrida por el asset. | Obligatorio | Sí |
Folder | Ruta de la carpeta en la que se encuentra ubicado el asset. | Obligatorio | Sí |
Asset ID | Identificador del asset. | Obligatorio | Sí |
Assets relacionados | Nombre del asset con los que se relaciona. | Opcional | Sí |
Versión | Número de versión en la cual se encuentra el asset. | Obligatorio | Sí |
Además, dentro del metadato de descripción, se deberán añadir los datos mostrados en la siguiente tabla. Estos se indicarán con el nombre mostrado en la tabla seguido de “: “, separándose entre sí con el carácter “; “.
Nombre | Descripción | Obligatoriedad |
Descripcion | Descripción textual del activo. Debe ser lo más escueta posible al mismo tiempo que ofrezca las características generales del tipo de activo. | Obligatorio |
Creacion | Fecha en la que se crea el asset en formato “dd/mm/aaaa" de la útlima versión del asset. | Obligatorio |
Responsable | Usuario que se responsabiliza del funcionamiento de la última versión del asset. | Obligatorio |
Es decir, una descripción genérica tendrá la siguiente apariencia:
<<"Descripcion: Primera etapa del proceso de carga de usuario"; "Creacion: 01/10/2023"; "Responsable: Juan Antonio González Pérez">>.
En esta sección se establecen las normas que deben seguirse para nombrar los assets que se creen dentro de la plataforma Big Data. Estas normas están enfocadas a los assets que componen la solución Stratio implantada en el SAS, encontrándose divididos en función del módulo al que pertenecen.
A su vez, se definen un conjunto de buenas prácticas para que sirvan como guía para cualquier usuario que quiera cualquier elemento de forma general.
Nota: Esta normativa puede no ser cumplida siempre y cuando la OTBI de su aprobación explícita en caso de ser necesario su incumplimiento.
A continuación, se expone un listado de las buenas prácticas generales que deben seguirse para el nombramiento de cualquier asset que se desee dar de alta en la plataforma Big Data.
Como añadido a todas estas buenas prácticas, es recomendable disponer de una tabla con todas las abreviaturas que se van a usar en los diferentes assets. En dicha tabla, se deben considerar, también, todos los ámbitos y subámbitos de información a los que pertenezcan los diferentes conjuntos de datos. De esta forma, se consigue que todos los usuarios miembros de la organización puedan acceder con facilidad a un determinado asset, comprendiendo sin dificultades el contexto de este.
De forma general, se establece que el nombre de un asset contiene una serie de elementos comunes, los cuales se listan a continuación y en el orden en el que aparecen dentro del nombre.
A continuación, se presenta el orden de los elementos comunes que pueden aparecer en el nombre de un asset.
Donde ZZ es una secuencia numérica ilustrativa de dos dígitos.
Es posible que para un asset en concreto sea necesario añadir una descripción extra a la estructura general aquí presentada. Cada una de estas particularidades se detallan en los apartados de los assets concretos en los que aparecen. Un ejemplo de esto es el carácter técnico o de negocio que presenta una regla de calidad.
Toda regla de calidad empezará con los caracteres “rc” (regla calidad). El siguiente término indica el carácter técnico o de negocio de la propia regla de calidad, por lo tanto, debe presentar uno de los dos valores siguientes:
Los siguientes elementos que lo componen constituirán la descripción del contexto de la regla de calidad. Esta descripción cambia en función de la información a la que se le aplica la regla de calidad. A continuación, se indica el tipo de regla de calidad, la cual puede tomar cinco valores diferentes, que se listan a continuación.
Seguidamente, se indica si la regla de calidad es planificada o proactiva.
Además, se indica qué se hace con los datos que no cumplen la regla de calidad. Existen tres valores distintos.
Finalmente, se indicará una breve descripción que contextualice el tipo de dato al que se está aplicando dicha regla.
Entonces, un ejemplo de regla de calidad técnica presentará la siguiente estructura:
rc_[t/n]_[com/act/con/pre/uni/for]_[pr/pl]_[pt/mf/au][Descripción breve]
Por ejemplo: rc_n_uni_pr_mf_dni_paciente
Para nombrar las diferentes Technical Views, es necesario tener en cuenta las diferentes tablas que la van a constituir y, a partir de las mismas, constituir un nombre que permita conocer sin ambigüedades toda la información que comprende el asset.
Siempre que la cantidad total de tablas no sea muy elevada, se recomienda indicar en el nombre del asset las abreviaturas de las tablas que lo componen. Cuando, en caso contrario, el número de tablas es muy elevado, el nombre debe ser capaz de describir el ámbito de información que contiene la Technical View.
Para este asset en concreto, no es necesario indicar un prefijo que indique el tipo de activo que constituye. Esto es debido a las siguientes dos razones.
Por lo tanto, el nombre debe seguir las buenas prácticas descritas en el tercer apartado del presente documento.
[Descripción Technical View]
Por ejemplo: diagnost_domici_usuario
Los nombres de las Business Views dependen tanto del conjunto de datos técnicos como del significado funcional concreto que se le dé a los mismos. Por lo tanto, el nombre debe contener la información necesaria para conocer los dos elementos que componen el asset.
El nombre de estos activos debe contener una descripción que indique los datos técnicos y el significado funcional que componen el activo. Esta descripción ha de ser sencilla y significativa, de manera que cualquier usuario de negocio sea capaz de entender el contexto de los datos técnicos que componen la Business View pertinente.
Para este asset en concreto, no es necesario indicar un prefijo que indique el tipo de activo que constituye. Esto es debido a las siguientes dos razones.
Por lo tanto, el nombre debe seguir las buenas prácticas descritas en el tercer apartado del presente documento.
[Descripción Business View]
Por ejemplo: multicontagio_covid
Las colecciones son combinaciones de Business y Technical Views, por lo tanto, en su nombre se debe establecer la información necesaria para poder identificar qué activos lo componen.
Los nombres de las colecciones incorporan prefijos para identificar la capa a la que pertenecen.
Los posibles prefijos de las colecciones son:
Después de indicar el prefijo que más se ajusta a la colección, se establece una descripción que sea capaz de contextualizar las Technical y Business Views que componen la propia colección. A continuación, se puede observar cuál es la estructura de nombramiento de este asset.
[ori/raw/cur/con/ope/con_bps]_[Descripción Colección]
Por ejemplo: cur_historia_salud
Son aquellas colecciones que apuntan directamente a los orígenes en Oracle.
Las colecciones “raw_” y “cur_” contienen tablas que pasan por los procesos de ingestas y curados, respectivamente. Hay tablas que pasan por raw_ y luego se quedan en cur_. Por otro lado, también existen curaciones en Postgres que no pasan por cur_, sino que van directamente desde raw_ a Postgres.
Las colecciones “ope_” (operacional) y las colecciones “con_” apuntan ambas a las versiones más consistentes de las tablas:
Nota: En la ilustración anterior, la tabla_y y la colección “ope_” apuntan al origen porque es su versión más consistente, sin embargo, la “cur_tabla_x” se ha ingestado y curado, por tanto, su versión más consistente está en la capa de curado de HDFS. Por su parte, la tabla_z apunta a Postgres, porque tras haberse ingestado y curado, se ha almacenado ahí por sus características. Además, la “cur_tabla_x” y la “tabla_z” pertenece al mismo conjunto de datos que la “tabla_y”, dentro de la “bbdd_ejemplo”.
Las constantes son unos elementos que, una vez definidos, se pueden usar en cualquier punto de la plataforma, por lo tanto, su nombre será específico del uso que se le quiera dar.
El nombre debe comenzar siempre por el prefijo “cons”, el cual indica que corresponde a una constante de la herramienta. La descripción del nombre debe ser suficientemente clara como para que cualquier usuario pueda entender el significado de esta. Al mismo tiempo, debe procurarse utilizar abreviaturas, siempre que sean entendibles, para reducir la longitud del nombre.
Cabe destacar que existen ciertas constantes que son intrínsecas de la herramienta y que, por tanto, no son modificables. Este tipo de activo conserva su nombre original, por lo que esta normativa no aplicaría en dichos casos.
A continuación, se muestra la estructura de nombramiento que debe presentar este activo.
cons_[Descripción Constante]
Por ejemplo: cons_edad_min_vacu_cov
La herramienta Stratio permite añadir atributos personalizados a los elementos que componen su Data Catalog, estos son, las fuentes de datos, las colecciones y las Technical y Business Views.
Estos atributos dependen en gran medida de las necesidades del usuario que las defina y de los activos a los que complementa. Por lo tanto, los elementos que aparezcan en su nombre son muy variados.
Como regla general, se debe establecer un prefijo “atr” para indicar que ese atributo ha sido añadido de forma manual por un usuario concreto. Además, como en el resto de assets, el nombre ha de seguir las buenas prácticas establecidas en el tercer apartado del presente documento.
La estructura que presenta este activo es la que se muestra a continuación.
atr_[Atributo Adicional]
Por ejemplo: atr_cantidad_traumato
Cabe destacar que existen ciertos atributos adicionales que son intrínsecos de la herramienta y que, por tanto, no son modificables. Este tipo de activo conserva su nombre original, por lo que esta normativa no aplicaría en dichos casos. A continuación, se muestra un listado de las abreviaturas que puede presentar.
Existen ciertos activos que no están relacionados con otros elementos de la plataforma ni tampoco se puede acceder que no sea el propio menú de la herramienta. Por este motivo, no es necesario aplicar las normas expuestas en el presente documento. No obstante, se recomienda que todos los nombres que se establezcan no sean excesivamente largos y siempre se deben acortar lo máximo posible al mismo tiempo que se conserva su significado.
A continuación, se muestra un listado de estos activos que son exclusivamente de negocio.
Dentro de este orden jerárquico, es necesario que cada uno de los elementos definidos sean coherentes con la estructura establecida. Por lo tanto, se debe prestar especial atención a la estructura del glosario para que la información sea fácilmente localizable.
Las ontologías deben ser nombradas de tal manera que cualquier usuario con perfil de negocio sea capaz de comprender con facilidad y sin ambigüedad las clases y relaciones establecidas en la ontología.
Al igual que ocurre para el conjunto de activos de negocio anterior, no es necesario establecer en el nombre de las ontologías ningún prefijo concreto. Sin embargo, el nombre debe describir de forma breve y concisa, de forma que sea fácilmente legible para cualquier usuario de negocio. Al final del nombre debe indicarse la versión de la ontología, aunque, contrario a lo que se indica en el apartado de buenas prácticas, no se debe indicar la revisión de la versión. Esto ocurre porque la ontología evoluciona como una única entidad a la que no se le puede cambiar el nombre. Solamente se debe crear otra ontología con una nueva versión cuando se cambie profundamente la estructura de esta.
A continuación, se establece la estructura que debe tener una ontología.
[Descripcion Ontología]_XX
Por ejemplo: sas_03
El módulo de Rocket se divide en diferentes elementos que presentan una posición o estructura determinada en la herramienta. Estos son:
Actualmente, los proyectos se encuentran definidos de forma previa. Estos proyectos han sido definidos en función de la capa de datos a la que pueden acceder y de los diferentes contratos que acceden a la plataforma Big Data. A continuación, se muestra una tabla con los diferentes proyectos definidos.
Nombre | Capa de la que lee | Proyecto | Creación | #Cores |
---|---|---|---|---|
cur_otbi | Raw | Gobernanza | Sí | 64 |
ana_otbi | Curado / Consumo | Gobernanza | Sí | 64 |
ana_gobernanza | Curado / Consumo | Gobernanza | Sí | 64 |
ana_asistencial | Curado / Consumo | Asistencial | Sí | 64 |
ana_siglo | Curado / Consumo | SIGLO | Sí | 32 |
ana_farmacia | Curado / Consumo | Farmacia | Sí | 32 |
ana_sshh | Curado / Consumo | Servicios Horizontales | Sí | 32 |
ana_rrhh | Curado / Consumo | Recursos Humanos | Sí | 32 |
ana_subdire_prov_se | Curado / Consumo | Subdirección Provincial Sevilla | Sí | 32 |
ana_subdire_prov_ma | Curado / Consumo | Subdirección Provincial Málaga | No | - |
ana_subdire_prov_ja | Curado / Consumo | Subdirección Provincial Jaén | No | - |
ana_subdire_prov_co | Curado / Consumo | Subdirección Provincial Córdoba | No | - |
ana_subdire_prov_hu | Curado / Consumo | Subdirección Provincial Huelva | Sí | 32 |
ana_subdire_prov_gr | Curado / Consumo | Subdirección Provincial Granada | Sí | 32 |
ana_subdire_prov_al | Curado / Consumo | Subdirección Provincial Almería | No | - |
ana_subdire_prov_ca | Curado / Consumo | Subdirección Provincial Cádiz | No | - |
Los directorios dentro de cada proyecto deben seguir las buenas prácticas establecidas en esta normativa. En concreto, se debe poner especial foco en los siguientes aspectos:
La estructuración de cada proyecto se debe dividir en función de los equipos y trabajos típicos que desarrollen en ese espacio, estando siempre enfocado en la optimización de la accesibilidad y entendimiento por parte de nuevos usuarios que carezcan del conocimiento experto.
Los trabajos de manipulación de datos se definen a través de los assets, que pueden ser de diferentes tipos.
Por norma general, el nombre debe componerse de unas palabras descriptivas seguidos de su orden de ejecución y la versión del workflow. Estos dos últimos elementos se incorporan por los siguientes motivos.
A continuación, se establece la estructura que debe tener un asset de Rocket.
[Nombre workflow]_OEXX_YYrZZ
Dentro de la metodología de trabajo establecida en el Marco de Trabajo de Governance, se encuentran diferentes procesos en los que es de obligado cumplimiento la elaboración de documentación que permita llevar un control de la información almacenada. Se distinguen dos normativas, siendo estas las referentes a documentación de nuevas fuentes de datos y de reglas de calidad
Siempre que una nueva fuente de datos sea incorporada a la plataforma, los usuarios deben registrar dicha incorporación, así como posibles actualizaciones en fuentes de datos ya existentes. Para ello, en caso de una nueva fuente de datos o actualización de una existente, es necesario recoger determinada información específica referente a la misma que será registrada en el espacio destinado a ello, el cual debe mantenerse actualizado constantemente. La información que se debe recoger es la siguiente:
Campo | Descripción |
Fuente origen | Nombre de la nueva fuente de datos origen. |
Descripción | Detalle de la información contenida en la fuente de datos. |
Responsable | Nombre de la persona responsable de la fuente de datos. |
Fecha de creación | Fecha en la que la fuente de datos es incorporada a la herramienta. |
Fecha de actualización | Si aplica, fecha en la que se realizó algún tipo de modificación a la fuente de datos. |
Frecuencia de actualización | Indica cada cuánto tiempo tiene que actualizarse la fuente de datos ante la posibilidad de nuevos cambios. |
Solicitante | Nombre de la persona solicitante de la nueva fuente de datos. |
Solicitante actualización | En caso de que se necesite una actualización puntual, nombre de la persona solicitante de la misma. |
Fuente | Indica la fuente de la cual proceden los datos. |
Información técnica | Cadena de conexión a la fuente de datos |
Reglas de calidad
En lo que respecta a la definición de nuevas reglas de calidad, se debe llevar a cabo la documentación de las mismas, con el objetivo de realizar una buena gestión y mantenimiento de estas, contando así con un espacio que aúne toda la información relevante de las distintas reglas de calidad definidas y que permita, por tanto, evitar duplicidades, identificar nuevas necesidades, realizar seguimientos, etc.
La información que debe recogerse de cada una de las reglas identificadas es la siguiente:
Campo | Descripción |
Nombre | Nombre de la regla de calidad. |
Descripción | Detalle del objetivo principal de cada regla de calidad. |
Tipo | Tipología de la regla de calidad, pudiendo ser: completitud, actualidad, consistencia, precisión, unicidad, y formato. |
Responsable | Nombre de la persona responsable de la regla de calidad. |
Ejecución | Tipología de la regla de calidad, pudiendo ser: Planificada o proactiva. |
Fecha de creación | Fecha en la que la regla de calidad ha sido creada. |
Fecha de modificación | Si aplica, fecha en la que se realizó algún tipo de modificación a la regla de calidad |
Frecuencia de ejecución | En caso de ser planificada, indica cada cuánto tiempo tiene que ejecutarse la regla de calidad definida. |
Solicitante | Nombre de la persona solicitante de la nueva regla de calidad. |
Solicitante modificación | Nombre de la persona que solicita una modificación de la regla de calidad |
Durante la definición de las distintas reglas de calidad dentro de la herramienta, es necesario establecer un umbral mínimo a partir del cual la regla de calidad reportará un error. Ante esto, existe la necesidad de identificar un umbral por defecto para las diferentes reglas creadas, siendo este el 90%. En determinados casos, será posible solicitar la modificación de dicho umbral mediante el proceso pertinente.
A lo largo de la metodología definida en el Marco de Trabajo de Governance, se identifican una serie de normas que han de cumplirse para la gestión de los diferentes assets que presenta la herramienta. A continuación, se detallan dichas normas en función del asset al que afectan.
A lo largo del proceso de identificación y creación de relaciones entre los diferentes activos de la herramienta, es necesario regirse por una serie de normativas que garanticen la correcta gestión y mantenimiento de estas. Estas normativas giran en torno a dos aspectos fundamentales que se detallan a continuación.
En primer lugar, es necesario conocer entre que activos es necesario realizar el proceso de definición de relaciones, así como el sentido de estas. Esto es, no definir relaciones que sean generadas de forma automática y respetar aquellas que se hayan establecido por la organización como obligatorias.
A continuación, se detalla entre qué tipo de activos es posible la definición de relaciones.
Asset desde el que se establece la relación | Asset relacionado |
Glosario de términos | Ontología |
Vista de negocio | Vista técnica |
Glosario de términos | Colección |
Vista técnica | Asset de diccionario |
Vista de negocio | Asset de diccionario |
Por otro lado, se deben seguir una serie de directrices acerca de la tipología de relaciones que se han de crear. Esto es, en función de los activos que se quieran relacionar, así como el objetivo de cada una de estas relaciones, la tipología de estas estará determinada según se establece en la siguiente tabla.
Asset desde el que se establece la relación | Asset con el que se relaciona | Tipo de relación |
Glosario de términos | Ontología | Define a |
Glosario de términos | Colección | Define a |
Vista técnica | Asset de diccionario | atr_origen |
Vista de negocio | Asset de diccionario | atr_origen |
La plataforma Apache Airflow permite la creación, la planificación y el seguimiento de flujos de trabajo a través de la programación informática. Es una solución de código abierto que se utiliza para la arquitectura y la orquestación de circuitos de datos y para el lanzamiento de tareas. Concretamente, en el proyecto de Gobernanza de datos del SAS, se utiliza principalmente para lanzar procesos en un orden concreto y con una periodicidad concreta.
Los casos de uso más comunes son la automatización de ingestas de datos, acciones de mantenimiento periódicas y tareas de administración. Para ello, Airflow permite planificar trabajos como un CRON y también ejecutarlos bajo demanda.
Los procesos o tareas se agrupan en DAGs (gráfico acíclico dirigido) a los cuales se les da una frecuencia o periodicidad de ejecución customizada. El orden en el que se ejecuta cada proceso dentro del DAG puede ser cualquiera que defina el usuario, o también pueden ejecutarse todos a la vez, aunque normalmente se organizan teniendo en cuenta las dependencias y los flujos de datos.
La plataforma también da información acerca de cuándo ha sido la última ejecución de cada proceso y cuál es el estado de esa ejecución, es decir, si el proceso terminó con éxito, si hubo algún fallo, si está corriendo, si fue detenido, etc.
Los procesos agrupados en DAGs se conforman de cualquier acción que se pueda ejecutar en Python, desde limpiezas o ingestas hasta llamadas a APIs. En el contexto del del proyecto de la OTBI del SAS, lo más habitual es que sean llamadas a flujos de Rocket con parámetros definidos por el usuario. Es por ello por lo que Airflow se relaciona estrechamente con el módulo de Rocket de Stratio.
Tanto los DAGs de Airflow como su periodicidad y el resto de los parámetros se programan a través de Python. Estos scripts de Python se suben a Git, de tal forma que Airflow lee constantemente los scripts de Python almacenados en Git.
Git es una plataforma de gestión de repositorios de código fuente y de colaboración entre desarrolladores. Git permite a los equipos de desarrollo almacenar, administrar, revisar y colaborar en proyectos usando el sistema de control de versiones de la propia plataforma.
Las siglas DAG se corresponden con Gráfico Acíclico Dirigido ya que representan el circuito de tareas teniendo en cuenta las dependencias y los flujos. También especifica el orden y la frecuencia de ejecuciones o reintentos.
No obstante, teniendo en cuenta el uso que hace de ellos la OTBI en el paradigma del SAS, se podría definir un DAG como una agrupación de workflows de Rocket.
En el desarrollo de los DAGs, las invocaciones a los flujos se deben hacer usando el nombre de las ETLs y no el identificador de cada una. Por defecto ha de llamarse a la última versión del flujo.
Dentro del contexto del proyecto del SAS, no es necesario definir el orden de ejecución de los DAGs, ya que el orden de las tareas que contiene el DAG va incluido dentro del script. Además, el orden de tareas puede verse en la pestaña “Graph” de Airflow, dónde también puede observarse la dependencia y el paralelismo de las tareas.
Airflow también permite crear grupos de tareas y establecer dependencias entre dichos grupos, de modo que se podría programar que al finalizar una tarea se ejecute un grupo de tareas en paralelo, y que al finalizar todas ellas, se lance otra tarea de manera secuencial.
En la imagen anterior, se observa como tenemos un grupo de tareas llamado “curation_analysis”, que contiene 3 tareas. Una de esas subtareas, es otro grupo que contiene a su vez 5 tareas (“exec_curation_analysis”). Siempre y cuando sea posible, han de organizarse las tareas en grupos y subgrupos, siguiendo el ejemplo anterior, con el fin de facilitar la comprensión del DAG.
No es necesario incluir en la nomenclatura un control de versiones, ya que esto se realiza automáticamente gracias al sistema de control de versiones de Git.
No obstante, sí que es necesario establecer las normas que deben seguirse para nombrar los DAGs que se creen dentro de la herramienta de Git:
A cada DAG se le puede poner una o varias etiquetas dentro del script de Python. Esta etiqueta aparecerá en Airflow debajo del nombre del DAG, obteniendo así la posibilidad de filtrar los DAGs en Airflow, una opción muy ventajosa a la hora de buscar un DAG en concreto entre cientos de ellos.
Para mantener una buena organización y facilitar la búsqueda de DAGs, se le ha de poner a cada uno de ellos una etiqueta que haga referencia al proyecto al que pertenecen. Por ejemplo, si hay un proyecto de Rocket llamado “ana_omop” que contiene los workflows a los que llaman los procesos o tareas que conforman un DAG, ese DAG ha de llevar la etiqueta “ana_omop”. Hay casos en los que un DAG puede llamar a workflows de diferentes proyectos de Rocket, en dicho caso, el DAG debe tener las etiquetas de ambos proyectos. Otra nomenclatura a seguir sería tener en cuenta el propósito del proyecto. Por ejemplo, en un desarrollo de usuarios, se debería etiquetar a esos DAGs con la etiqueta “usuarios”, de forma adicional a la etiqueta de proyecto.
En la medida de lo posible, es obligatorio que las etiquetas coincidan con los nombres de las carpetas donde están alojados los DAGs.
Respecto a la información de los DAGs, se debe documentar cada DAG y cada grupo de tareas (módulo) que lo compone a nivel genérico.
Para añadir descripción a un DAG, se pone un parámetro doc_md (descripción de tipo markdown) en las líneas de configuración del DAG, seguido de la descripción genérica que se desee poner y una breve descripción de la funcionalidad de los módulos que lo componen. La siguiente imagen muestra un ejemplo en el código.
El resultado de añadir esas descripciones en el código de configuración del DAG se reflejaría de la siguiente forma en la interfaz visual de Airflow:
Para añadir descripciones a las tareas, la operativa es exactamente la misma, con la diferencia de que ha de ponerse el parámetro y la descripción en las líneas de configuración de la tarea en cuestión. Por ejemplo:
El resultado de añadir ese parámetro de descripción a una tarea en concreto se refleja en la interfaz gráfica de Airflow cuando se navega a una tarea específica, al entrar en el apartado de "More Details", viéndose de la siguiente forma:
Tanto la carpeta “dags” como la carpeta “librerías” son desarrollos de la UTE los cuáles no deben modificarse en ningún caso. Para los desarrollos de la OTBI se crean dos carpetas nuevas cuya jerarquía ha de llevarse a cabo tal y como se dicta en los siguientes puntos.
En el repositorio Git hay una carpeta llamada “dags” en la que la UTE ha creado una subcarpeta por cada DAG con sus respectivos scripts de inicio y script de tareas. Esta carpeta no se puede modificar, ni tampoco sus contenidos, ya que afectaría a los casos de usos ya entregados.
Para organizar los DAGs que se van desarrollando por parte de la OTBI se ha creado una carpeta llamada “dags_sas” en la que se deberán recoger dichos desarrollos. Esta separación es necesaria porque la OTBI trabaja sus desarrollos en tres branchs distintos (dev, pre y master) y la hora de promocionar una carpeta de un branch a otro los cambios se pierden. Ello implica que si se promociona alguna subcarpeta de “dags” (desarrollos de la UTE) se estarían modificando casos de uso ya entregados, algo que está prohibido. Por este motivo se deben separan los desarrollos de la UTE de los desarrollos de la OTBI.
Dentro de la carpeta de “dags_sas” (desarrollos de la OTBI), la organización debe consistir en agrupar los DAGs por proyectos de Rocket. Además, es una organización lógica, ya que los procesos o tareas de Airflow son, en su mayoría, llamadas a workflows de Rocket y éstos se organizan en proyectos.
Los DAGs de la UTE (recogidos en la carpeta “dags”) frecuentemente invocan a ciertas funciones que se almacenan en una carpeta llamada “librería”. De nuevo, para no afectar a los desarrollos ya entregados por parte de la UTE, la carpeta “librerías” no se puede modificar ni tampoco sus contenidos.
Dada la premisa anterior, la OTBI ha creado una carpeta llamada “librería_sas” para recopilar ahí las funciones a las que se invocará en los scripts de sus DAGs. Del mismo modo que en la carpeta “dags_sas”, la carpeta “librería_sas” se debe organizar por proyectos de Rocket.
Se deben definir parámetros para los DAGs, respetando que, si un DAG se compone de diferentes grupos de tareas (módulos), los parámetros se definirán para cada grupo.
Estos parámetros se definen en el código haciendo uso de la función params y dentro de esa función se le asigna el nombre de la sección con la palabra reservada section, de forma que los parámetros que tengan el mismo nombre de sección se aglutinan en un mismo grupo.
Existen parámetros genéricos o globales que se usan en varias ETLs. Esos parámetros forman parte del grupo Variables Globales que contienen variables compartidas para todos los grupos de tareas de los DAGs.
Además, a cada parámetro se le debe añadir una descripción de lo que hace a nivel práctico, para ello se añade en el código el parámetro description.
Como punto de partida, es conveniente mencionar que en el área de Gobernanza del SAS hay varios tipos de orígenes a los cuáles pueden apuntar las colecciones de datos. Uno de ellos serían las bases de datos relacionales de Oracle, donde el SAS almacena todos sus datos, y por tanto, es la fuente primera de la organización. Por otro lado, se tiene el sistema de almacenamiento de Stratio, donde se generan tablas mediante sus respectivos desarrollos, el cual tiene dos tipos de almacenamiento: HDFS (sistema distribuido de Big Data) y Postgres.
Parquet es un formato de archivo de almacenamiento de datos columnar y abierto que se utiliza para almacenar datos en HDFS. Una misma tabla almacenada en HDFS consta de varios archivos parquets. En los desarrollos se determina el número de parquets que se quieren generar. Se ha de tener en cuenta, en la medida de lo posible, que un mismo parquet no debe pesar, como regla general, más de 1 GB, y nunca menos de 250 MB.
Suele ser necesario particionar los ficheros parquets, es decir, separar las filas de una tabla dependiendo del valor de una de sus columnas. Habitualmente, se particionan las tablas por alguna columna tipo fecha.
Por ejemplo, particionando la tabla por una columna de año, se crea un archivo parquet para cada valor distinto de la columna año de una tabla y se crea una subcarpeta para cada parquet. También puede particionarse un mismo año en meses o agrupaciones de meses, en ese caso, pueden existir varios parquets dentro de una misma subcarpeta.
|
- |
o |
- |
o |
Cuando la tabla es muy grande, se intentan crear particiones para que cada directorio tenga 1 o 2 parquets de 1GB. Del mismo modo, es importante que los parquets generados tengan un tamaño mínimo de 250 MB para no infrautilizar los recursos de la herramienta.
En base a la experiencia, se considera que, aproximadamente, 1 GB en parquet son 10 millones de filas. No obstante, dependiendo del número de columnas, esto podría variar, por ejemplo, una tabla con que contenga más columnas que otra, pesará más. También hay que tener en cuenta los tipos de datos, por ejemplo, una tabla con columnas de tipo BLOB pesará más que otra con columnas de tipo INTEGER.
Considerando la premisa anterior, se intenta particionar la tabla por una columna de tal forma que los parquets resultantes sean de 10 millones de filas. Normalmente, se suele hacer una disgregación de la columna fecha, esto supone que haya una columna para el año y otra para el mes y de esta forma el particionado sea más flexible y versátil.
La columna de partición puede ser cualquiera siempre y cuando no contenga nulos y sea equidistante, es decir, que tenga aproximadamente el mismo número de registros para cada uno de sus distintos valores.
Por otra parte, al realizar consultas sobre la tabla, habría que hacer una consulta conocida como “consulta a nivel de columna”, por ejemplo: SELECT * FROM TABLA1 WHERE ANYO=2020. De esta manera, se optimiza el rendimiento de la memoria ya que la consulta lleva implícito el directorio que se debe consultar, porque la tabla está particionada por año.
En determinadas ocasiones, se sabe de antemano la columna por la cual se va a consultar la tabla, por ejemplo, si el usuario funcional manifiesta que suele consultar y filtrar en la tabla por la columna “COD_PROVINCIA”, habría que particionar por esa columna, siempre y cuando sea una columna técnicamente adecuada para hacer la partición. Para elegir dicha columna de partición, también habrá que tener en cuenta la usada en las consultas de los procesos ETLs de carga.
Las ingestas se refieren al movimiento de los datos desde Oracle a HDFS de las tablas que se desean migrar.
Existen casos concretos en los que la ingesta no es necesaria, ya que, como se apuntaba anteriormente, en Stratio se pueden crear colecciones que apunten a orígenes de Oracle. Se ingestarán aquellas tablas masivas sobre las que tengamos beneficios de almacenarlas en HDFS, o aquellas tablas que vayan a ser generadas por los procesos de Stratio en un futuro. Estas tablas deben ser ingestadas en HDFS para poder cargar las filas que existían previamente en Oracle, dentro de Stratio. Es decir, se empieza a generar la tabla X a partir de un día, pero se necesitará hacer una carga inicial con todo lo que existía previamente en Oracle antes de ese día en concreto. Por otro lado, las tablas de orígenes externos que no vayan a ser generadas en los procesos de Stratio y actúen sólo a modo de escritura que tengan menos de 1 millón de filas, se virtualizarán directamente hacia el origen dentro de las colecciones de tipo "ope_".
Es en el proceso de curación donde se pueden incorporan nuevas columnas, por tanto, deben ingestarse y curarse aquellas tablas en las que se necesite agregar nuevas columnas.
Existen varios tipos de ingestas: completas e incrementales.
En una ingesta completa se carga por primera vez o se reescribe completamente la tabla como un nuevo conjunto de datos, el proceso implica cargar todos los datos desde cero.
Ventajas | Desventajas |
---|---|
|
|
Por su parte, en una ingesta incremental, solo se cargan y actualizan los datos que han cambiado (nuevos o modificados) desde la última carga.
Ventajas | Desventajas |
---|---|
|
|
En el contexto del área de Gobernanza del SAS existe otro tipo de ingesta especial que es la ingesta incremental por particiones, un híbrido entre ingesta total e ingesta incremental. Consiste en hacer ingestas truncando las particiones modificadas. Además, a través de este método se actualizarían en Stratio aquellas filas que son borradas en Oracle.
Este tipo de ingesta sólo se podrá realizar cuando la tabla está particionada en Oracle, y cuando se sabe que los procesos de carga en Oracle van truncando/escribiendo por particiones la tabla en cuestión.
Por ejemplo, si se sabe que han cambiado tres filas, en una ingesta incremental, se ingestarían esas tres filas. Sin embargo, si la tabla en cuestión en Oracle estuviese particionada por la columna COD_ANYO, y esas 3 filas modificadas pertenecen a la partición COD_ANYO = 2023, la ingesta incremental por particiones lo que haría sería ingestar y sobreescribir en Stratio todos los registros con COD_ANYO = 2023. Es decir, se cargaría por completo (borrando previamente) todo el año del 2023.
Las tablas que se generan en Stratio, a través de los procesos de curación o las ETLs de carga, conforman los inputs de la curación, una vez han sido ingestados. Los casos en los que dichos datos se suelen almacenar, una vez curados, en HDFS son los siguientes:
En el resto de casos, normalmente cuando el tamaño de las tablas es pequeño, dichas tablas se almacenan en Postgres, siempre que se decidan ingestar/curar. Existe el caso de otras tablas pequeñas que se decide no ingestar ni curar. Para ellas, simplemente se apuntará a Oracle desde las colecciones.
Existe una casuística en la cual la tabla, una vez curada, debe almacenarse en Postgres y no en HDFS, aunque sea masiva. Es el caso en el que la tabla vaya a ser consultada por filas en vez de por columnas, es decir, que se vaya a buscar registros bastante concretos, tratándose de filas exactas, por ejemplo: SELECT * FROM TABLA1 WHERE DNI=01234567A.
Pueden existir tablas candidatas a estar en HDFS que se usen como inputs, pero no se generen, esas tablas se ingestan y se curan pero no se llevan a consumo ni a Postgres. En consecuencia, las colecciones que usen esa tabla apuntarán al curado o al origen, ya que es su versión más consistente, esto se hace para evitar horas de desarrollo.
Por otra parte, habrá tablas que se utilicen como inputs, pero no se ingesten ni se curen, es el caso de tablas que no sean candidatas a estar en HDFS y, por tanto, se apuntará directamente al origen.
Existen varios tipos de curaciones: competas e incrementales.
El curado completo implica revisar y limpiar todo el conjunto de datos para corregir errores, inconsistencias, y asegurar la calidad de los datos.
Ventajas | Desventajas |
|
|
Los curados incrementales se enfocan solo en los datos nuevos o modificados desde la última curación, limpiando y corrigiendo estos cambios.
Ventajas | Desventajas |
|
|
En el contexto del área de Gobernanza del SAS existe otro tipo de curación especial, que es la curación delta. Este tipo de curación sólo procesa los últimos datos ingestados usando la columna "TS_RAW" (fecha de carga en la capa raw). Se usa en casos muy extremos donde la curación completa implicaría mucho tiempo de carga (más de 12 horas).
Dado que en las ingestas incrementales pueden existir filas duplicadas (un mismo registro puede modificarse varias veces en procesos de curaciones), este tipo de curación obtiene la versión más reciente de cada registro a partir de las claves primarias indicadas por parámetros.
Tras la carga y el curado, se realiza una operación UPSERT (Update/Insert) de las nuevas filas (ya sin duplicados) sobre la capa de curado y usando las mismas claves primarias anteriores.
Este tipo de curación es eficiente, pues no procesa la tabla entera, pero su uso debe ser comedido, ya que exige mantener un control diario de que la ejecución sea correcta al existir el riesgo de que se pierdan datos.
La curación delta se usa en los siguientes casos:
En cuanto a colecciones, existen colecciones “raw” que apuntan a la capa de ingestas, colecciones “cur” que apuntan exclusivamente a /curado_sas, colecciones “ope” que apuntan a la versiones más consistentes de las tablas, colecciones "con" creadas bajo petición expresa y que apuntan a la versiones más consistentes de las tablas generadas por ETLs en Stratio, es decir, apuntan a consumo o a Postgres. Y por último, existen colecciones "con_bps" que apuntan a versiones más consistentes de tablas generadas en Stratio y tablas externas operacionales. Normalmente, la colección a consumir y usar es la colección “ope”, "con" y "con_bps" donde están las versiones más consistentes.
Las diferentes capas definidas por las que transitan los datos son las siguientes:
Todas las carpetas “…_incremental” serán incluidas en el backup del HDFS. En estas carpetas se incluyen las tablas cuya generación es costosa y no es fácil de cargar de forma completa de una sola vez.
La capa de consumo puede estar en Postgres o en HDFS en función de su volumen. Como mínimo, para que sea rentable tener la tabla almacenada en HDFS, el peso de cada parquet asociado a la tabla ha de ser superior a 250 MB.
Hay que tener en cuenta que el espacio que ocupan las tablas en Oracle no es el mismo que en HDFS, por lo tanto, hasta que la tabla no esté ingestada, no se podrá saber su peso exacto. Por experiencia, se conoce que 250 MB son aproximadamente 2,5 millones de filas. La OTBI, por defecto, pasa a Postgres tablas con menos de 5 millones de filas, y, si tiene más, se almacena en HDFS.
Los nombres de los archivos parquets se generan automáticamente en Stratio, resultando una serie de caracteres alfanuméricos en minúsculas que no hacen alusión alguna a los datos ni al nombre de la tabla (para facilitar la comprensión, los ejemplos que aparecen en la normativa sí poseen nombres ilustrativos).
Este nombre es algo que no se puede modificar, y, por tanto, hay que tenerlo en cuenta en la posible integración de parquets externos, dado que si la nomenclatura del parquet no es la correcta, el virtualizador y la disponibilización de los datos no funcionará correctamente.
Postgres es un sistema de gestión de base de datos relacional, de código abierto y compatible con SQL.
Dado que en el contexto del proyecto se está llevando a cabo una migración de datos desde Oracle, este tipo de base de datos es adecuado por ofrecer la posibilidad de crear esquemas de datos de la misma forma que en el origen. Esta es una premisa relevante, ya que los datos deben ser migrados físicamente con la misma estructura que tenían en el origen (Oracle).
Tanto las particiones de la tabla, como sus índices y sus claves primarias, deben ser idénticos en Oracle y en Postgres.
Existen dos causas principales que justifican la migración de los datos a Postgres:
Las tablas que no cumplan estas casuísticas anteriores serán migradas a HDF.
Existen 4 instancias (capas) de Postgres, ordenadas de menor a mayor consistencia son: test, dev, pre y pro.
Las tablas se crean por primera vez en test, dónde además se realizan todo tipo de pruebas. Test es la única capa dónde se tienen permisos de creación de tablas, en el resto de capas no se crea nada, sino que se promociona lo que haya en capas anteriores.
Una vez las tablas estén creadas en la capa de test de Postgres, se extrae (a partir de cualquier herramienta de gestión de base de datos) el script SQL que crea todas las tablas con la estructura que se les ha dado. Este script puede ser ejecutado en cualquier otra instancia de Postgres para crear todas las tablas de una colección ya migrada a Postgres, con el mismo esquema que tenía en Oracle.
Una vez que se tiene ese script, se debe poner una petición CGES a los gestores de sistema para que ellos, que sí poseen permisos de escritura en el resto de capas, ejecuten esos script en las capas de dev, pre y pro. No obstante, se está trabajando para que esta ejecución la realice Liquidbase de forma automática con Jenkins.
Este es el proceso para tener las tablas creadas en las 3 capas de Postgres. Es importante señalar que las tablas han de ser consistentes en las 4 instancias, es decir, si se hace un cambio en la capa test, este cambio debe propagarse al resto de capas.
Los objetos de Postgres tales como tablas, columnas, restricciones, etc. son case-sensitive, ello significa que existe diferencia entre mayúsculas y minúsculas. De modo que, para consultar tablas cuyo nombre esté escrito en mayúsculas, se debe poner, en la consulta SQL, el nombre de la tabla y de las columnas entre comillas, por ejemplo:
En contrapartida, si el nombre de la tabla que se quiere consultar está escrito en mayúsculas pero no se le ponen las comillas en el script SQL, el resultado dará error y dirá que esa tabla no existe, por ejemplo, al consultar así, se obtendrá el siguiente resultado de error:
Como se puede apreciar en la imagen anterior, a pesar de haber escrito el nombre de la tabla en mayúsculas en la consulta, el mensaje de error que muestra el sistema escribe el nombre de la tabla en minúsculas, dado que, por defecto, el sistema trabaja con minúsculas. Es decir, CREATE TABLE X se traduce a create table x, y se crea la tabla en minúsculas.
En definitiva, cuando se desee consultar una tabla cuyo nombre sea en mayúsculas, se debe poner el nombre de la tabla entre comillas. Esta premisa es muy importante y se ha de tener en cuenta, dado que todos los nombres de las tablas, sus columnas y sus esquemas están escritos en mayúsculas.
Por otro lado, existe una normativa de nomenclatura para los elementos de Postgres la cuál se detalla en la siguiente tabla.
Nomenclatura de Tablas |
Las Tablas de Dimensiones, tablas que se usan para categorizar los hechos, se denominarán con un nombre que comience por el prefijo TD_, en mayúsculas |
Las Tablas de Hechos, tablas que contienen los diferentes hechos o medidas, se denominarán con un nombre que comience por el prefijo TH_, en mayúsculas |
Las Tablas de Relación, tablas que se utilizan para relacionar dos atributos del modelo lógico, normalmente para modelar una relación de muchos a muchos, se denominarán con un nombre que comience por el prefijo TR_, en mayúsculas |
Las Tablas de Control, tablas que se utilizan para controlar el flujo de las cargas, se denominarán con un nombre que comience por el prefijo TC_, en mayúsculas |
Las Tablas Temporales, tablas que se usan para cálculos y procesos intermedios, exceptuando las generadas por ODI ya que tienen su propia nomenclatura, se denominarán con un nombre que comience por el prefijo TMP_, en mayúsculas |
Las Tablas Auxiliares, tablas con origen de datos externos o parciales que se utilizan para procesos de carga, sin tener un carácter definitivo de explotación, se denominarán con un nombre que comience por el prefijo TA_, en mayúsculas |
Las Tablas de Agregados se denominarán añadiendo el sufijo _AGR al nombre de la tabla original de la que procede, en mayúsculas. Ej.: Tabla origen: TH_ALTAS. Tabla de agregados: TH_ALTAS_AGR. En caso de que existan más de una tabla agregada sobre la misma entidad se incorporará un sufijo secuencial (TH_ALTAS_AGRX) |
Las Tablas que no procedan del Datawarehouse deberán conservar el nombre de su modelo origen en mayúsculas |
Nomenclatura de Campos |
Las Columnas de Códigos, campos que contienen las claves de negocio, se denominarán con un nombre que comience por el prefijo COD_, en mayúsculas |
Las Columnas de Fechas, campos con formato de fecha, se denominarán con un nombre que comience por el prefijo FEC_, en mayúsculas |
Las Columnas de Identificadores, campos que se utilizan para almacenar las claves primarias y subrogadas que se generen durante el proceso de carga, se denominarán con un nombre que comience por el prefijo ID_, en mayúsculas |
Las Columnas de Descripciones, campos de tipo descripción, se denominarán con un nombre que comience por el prefijo DEC_, en mayúsculas |
Las Columnas de Nombres, campos de tipo nombre, se denominarán con un nombre que comience por el prefijo NOM_, en mayúsculas |
Las Columnas IND, campos de tipo flag, se denominarán con un nombre que comience por el prefijo IND_, en mayúsculas |
Las Columnas que contengan importes, campos que se utilizan para los hechos de tipo importe dinerario, se denominarán con un nombre que comience por el prefijo IMP_, en mayúsculas |
Las Columnas utilizadas para los hechos de tipo número, se denominarán con un nombre que comience por el prefijo NUM_, en mayúsculas |
Nomenclatura de Secuencias |
Las Secuencias se denominarán con un nombre que comience con el prefijo sq_ seguido del nombre de la secuencia (sq_nombre de la secuencia), usando minúsculas |
Nomenclatura de Índices |
Los índices de las Primarys Keys los crea Rocket de forma automática y deben componerse con el prefijo pk_ seguido del nombre del esquema y el nombre de la tabla reducido, seguido de un número opcional. Por ejemplo: pk_dwsas_cmbd_td_cmbd_ambito_1712817290556 |
Los índices para los Bitmap deben mantenerse tal y como vienen de Oracle, pero en minúsculas |
Los índices generales deben mantenerse tal y como vienen de Oracle, pero en minúsculas |
Nomenclatura de Constrains |
Las constrains para las Primary Keys deben comenzar con el prefijo pk_ seguido del nombre del esquema y el nombre de la tabla reducido, usando minúsculas. Por ejemplo: pk_nombreesquema_nombretablareducido |
Las constrains para las Foreing Keys deben comenzar con el prefijo fk_ seguido del nombre del esquema y el nombre de la tabla reducido y a continuación su secuencia correspondiente, usando minúsculas. Por ejemplo: fk_nombreesquema_nombretablareducido_01 |
Nomenclatura de Esquemas |
El modelo de explotación final se albergará en la base de datos de explotación, usando mayúsculas. El esquema de base de datos se nombrará añadiendo el prefijo el DW_, al nombre del módulo que alberga: DW_NOMBREMÓDULO |
Todas las tablas temporales e intermedias necesarias para obtener las tablas finales del esquema de explotación deberán alojarse en un esquema con el prefijo DW_ETL seguido del nombre del módulo que alberga (DW_ETL_NOMBREMÓDULO), usando mayúsculas. Este esquema se usará como área de Staging durante el proceso de carga y estará ubicado en la base de datos de carga |
En los workflows de Rocket frecuentemente se usan pasos que en los que se realizan escrituras a sitios externos como SFTP o Postgres. Para hacer esas escrituras a SFTP es necesario indicar una IP, un puerto y un Vault secret (pseudónimo que llama a una contraseña que está almacenada en otro sistema). Para hacer escrituras a Postgres, únicamente es necesario indicar una URL.
Los ejemplos que se muestran a continuación obedecen a una parametrización para escrituras a SFTP. Para escrituras a Postgres, los pasos serían los mismos, pero sólo habría que indicar la URL.
Tanto la IP, como el puerto, y también el Vault secret no deben escribirse manualmente en cada workflow, dado que ello supondría que, ante un cambio en cualquiera de ellos, hubiese que modificar todos los workflows que hagan escritura en SFTP.
Para evitar esta problemática, se debe introducir la IP, el puerto y el Vault secret como parámetros previamente definidos en cada proyecto de Rocket. De esta forma, si se producen cambios, sólo hay que modificar el parámetro del proyecto.
Las siguientes capturas muestran un ejemplo de cómo establecer parámetros de SFTP dentro de un proyecto.
Para poder usar un grupo de parámetros en concreto dentro de un workflow de Rocket, hay que acceder a la configuración del flujo y activarlo. Las siguientes capturas muestran un ejemplo de cómo hacerlo.
La estructura del SFTP debe seguir la siguiente directriz: la carpeta raíz debe contener una carpeta para cada entorno, es decir, una carpeta "dev", otra llamada "pre" y otra "pro". Luego, dentro de cada carpeta se debe tener una carpeta para cada proyecto de Rocket, donde se suban los desarrollos de cada proyecto.
Esta normativa ha sido elaborada con el fin de establecer unas pautas generales que permitan que los desarrollos de Rocket sean los más correctos, efectivos y eficientes posible. Además, al llevar a cabo este compendio de premisas, se facilita y potencia la productividad mediante el trabajo en equipo. Los desarrollos que obedezcan estas buenas prácticas serán más resistentes y/o fáciles de enmendar ante posibles cambios de cualquier tipo en el futuro.
Lo primero que se debe hacer al crear flujos de Rocket es ir a la configuración del flujo.
Y una vez ahí, ir a los ajustes del Debug para marcar la opción “Do not use cached debug data”.
También en los ajustes de Auto-Debug se debe desmarcar la opción de “Enable Autodebug for this workflow” y marcar “Do not use cached debug data”, de forma que quede como en la siguiente imagen.
Esto se hace para que el Debug no se guarde en caché, lo que supondría que al aplicar un cambio en una entrada, por ejemplo, ese cambio no se refleje en el workflow a causa de haberse quedado una ejecución de Debug en caché. Por otro lado, al desactivar el auto-debug, se evita la ejecución de un Debug cada vez que se guarde el workflow, ganando eficiencia a la hora de desarrollarlos.
Se han de parametrizar siempre los desarrollos, en la medida de lo posible. Los parámetros deben definirse en los ajustes de los workflows, y con un valor por defecto si éste fuese conveniente.
Hay ciertos parámetros que son estrictamente obligatorios, éstos son:
Estos parámetros se definen a nivel de proyecto para que estén disponibles para todos los workflows de un mismo proyecto.
Una vez los parámetros se han definido a nivel de proyecto, deben importarse en el workflow para disponibilizarlos y poder usarlos. Esto se hace en los ajustes del workflow, concretamente en la opción de “Parameters group”.
Una vez se realiza esta configuración, se podrá invocar al parámetro en cualquier entrada o salida de Postgres, en el caso del ejemplo que se ilustra.
Se ha puesto el ejemplo de la parametrización de Postgres, sin embargo, para la parametrización de SFTP se seguirían los mismos pasos.
En el caso de que se disponga de ETLs que estén relacionadas de alguna forma, la relación ha de configurarse mediante sus workflows desde el apartado “Relations”.
Una vez que se escoja el asset relacionado y se pulse en “Link”, la relación se reflejará de la siguiente forma.
En cuanto a los inputs, existen dos opciones de seleccionar los datos que requieran.
La primera opción es colocar un input de tipo Parquet, por ejemplo, y, posteriormente, filtrar las filas y columnas que se deseen con sus respectivos nodos.
La segunda opción, es usar un nodo SQL en el que se construya una consulta para seleccionar solo las columnas y las filas que se necesiten.
Esta segunda opción es más eficiente por varias razones:
En las bifurcaciones de caminos, se debe añadir un nodo de “Persist” intermedio, puesto que, gracias al almacenamiento en memoria que brinda el “Persist”, se evita el cálculo de la consulta SQL dos veces.
Esto también se aplica a bifurcaciones de caminos tras un paso de tipo Filter (camino positivo y negativo):
El nivel de almacenamiento del “Persist” es modificable, pero se recomienda que se use “MEMORY_ONLY” siempre que se pueda, para trabajar solo en memoria.
En los JOINS entre una tabla muy pequeña (menos de 150 mil filas) y una tabla grande, se debe usar el tipo de JOIN llamado “broadcast”. La operación BROADCASTJOIN se aplica sobre la tabla pequeña. De esta forma, la comunicación entre los ejecutores del JOIN será mucho más eficiente. La tabla pequeña se copia entera dentro de cada ejecutor, y eso provoca que cada uno de ellos no necesite realizar operaciones de shuffle para realizar el JOIN.
Al ejecutar flujos donde haya este tipo de JOINS, es importante ejecutarlo con unos recursos en los que cada ejecutor tenga la memoria suficiente para albergar la copia de la tabla completa.
El sistema tiene sus nodos por defecto con distintas funciones para satisfacer un amplio espectro de casuísticas de transformación, por lo tanto, estos nodos deben ser siempre la primera opción.
Sin embargo, se pueden encontrar ocasiones en las que los nodos no satisfagan las necesidades del desarrollo, en ese caso se podrá recurrir a los nodos SQL. Para crear o reemplazar columnas en el Dataframe, se recomienda hacer uso del paso “AddColumns”. Es preferible el paso anterior “AddColumns” al de “SelectColumns”, puesto que en el primer caso se calculan exactamente las columnas que se necesitan, y con el segundo se necesitan retornar todas las columnas del Dataframe. No obstante, “SelectColumns” puede ser interesante incorporarlo en ciertos puntos clave del flujo (como al final), para que se sepa con facilidad las columnas que se están retornando a partir de dicho punto. Además, este paso permite realizar transformaciones , renombrados y eliminaciones de columnas en un solo paso. Si el uso de este paso facilita enormemente la labor del desarrollador, estaría justificado su uso.
Si los pasos anteriores no satisfacen las casuísticas requeridas, se podría tomar la opción del paso “Trigger”, el cuál es completamente moldeable al ser un editor de código SparkSQL (se pueden realizar operaciones de GROUP BY o consultas más complejas). El nodo “Trigger” puede también resultar ventajoso puesto que puede aglutinar varios pasos de cada uno de los nodos individuales que trae por defecto el sistema.
Si las dos opciones anteriores no son lo suficientemente potentes o configurables para la transformación que se desea realizar, se puede usar el nodo de transformación PySpark. No obstante, estos nodos solo pueden usarse bajo el consentimiento previo de la OTBI, dado que suponen un cambio de contexto que puede perjudicar el rendimiento y la efectividad del flujo.
En desarrollos muy grandes, por ejemplo uno que contenga 40 nodos en un mismo flujo, puede que muchos de ellos tengan un objetivo común. En ese caso, lo que se debe hacer es seleccionar ese conjunto de nodos y utilizar la función “Create group”.
De esta forma, todos estos nodos quedarán agrupados visualmente en uno solo. Ese grupo, una vez creado, se puede renombrar para asignarle un nombre representativo de lo que realmente están haciendo ese conjunto de nodos.
En nodos que realicen acciones muy complejas, se debe añadir una descripción indicando qué hacen. De forma que, al pulsar sobre el botón de información, aparezca de la siguiente forma.
La posibilidad de añadir comentarios a los nodos sólo debe utilizarse para hacer anotaciones que sirvan como información para los distintos participantes del equipo de desarrollo, no para describir el funcionamiento del flujo. Eso deberá realizarse mediante los campos de descripciones.
En los nodos de tipo “Output” se especifica la tecnología y la ruta de almacenamiento para la tabla generada por el workflow.
No obstante, la configuración de escritura se establece en el nodo “Writer” del paso anterior, donde se asigna el nombre a la tabla.
Un problema común es que, al realizar modificaciones menores en el workflow, incluso sin ejecutarlo, la configuración del Writer en el nodo de transformación se pierde.
Para mitigar este problema, se ha de insertar un nodo “Bypass” justo antes del nodo de “Output”. En este nodo “Bypass”, se define la configuración del Writer. El nodo “Bypass” no tiene ninguna funcionalidad específica y no requiere ajustes, por lo que no es necesario que se modifique nunca. Esta estrategia garantiza la integridad de la configuración de escritura, evitando su eliminación accidental.
Las tablas que requieran una carga incremental de tipo Upsert deben ser tablas Delta o estar almacenadas en Postgres, así se suprime el riesgo de perder datos.
En HDFS no existen las operaciones de Update/Upsert, por lo que si se usan tablas de tipo Parquet para simular este comportamiento, se deberían cargar las filas existentes al inicio del flujo, procesarlas con las nuevas, quedarse con la fila más consistente por cada clave primaria y finalmente hacer un overwrite de toda la tabla. El overwrite en HDFS elimina los archivos de la tabla y los crea de nuevo, por lo que si el proceso falla en mitad de la operación, se perderán todos los datos de la tabla. Es por ello que para operaciones incrementales en HDFS se deben usar los outputs de tipo Delta. Las tablas Delta guardan un historial de versiones de sus parquets y nunca eliminan los archivos antiguos hasta que no se ejecuten los comandos de VACUUM, lo que provoca que ante fallos de escritura, no se pierdan los datos.
En Postgres no hay ningún tipo de limitación con las cargas incrementales, ya que al ser una base de datos relacional, no se guardan los cambios hasta que las transacciones no finalicen.
Para que no se generen parquets diminutos en las tablas Delta tras operaciones Upsert, se deben cumplir los siguientes requisitos:
Este parámetro fuerza al sistema a que se generen en cada escritura, tantos archivos parquets dentro de cada partición como se hubieran definido la primera vez que se creó la tabla en modo Overwrite. Si la tabla se creó inicialmente con 2 parquets por partición, las operaciones de Upsert generarán exactamente 2 parquets por cada partición.
Si no se siguen exactamente estos requisitos, las operaciones de Upsert generarán diversos parquets de escaso tamaño (decenas de ellos), perjudicando en el rendimiento de consulta de la tabla. Para más información consultar la página oficial de Delta Lake: https://docs.delta.io/2.0.2/delta-update.html
Como se ha dicho anteriormente, al hacer sobreescrituras en tablas Deltas, no se elimina la tabla preexistente, sino que se crea una nueva versión. En las consultas SparkSQL se accede únicamente a la última versión de la tabla. No obstante, para ahorrar espacio en el sistema, es recomendable eliminar la antepenúltima versión, de forma que quede la versión que se acaba de crear y también la inmediatamente anterior a esta. Por ejemplo, si se tiene versión 0, versión 1 y se crea una versión 2, se elimina sólo la versión 0.
Para eliminar la antepenúltima versión, y por supuesto también las anteriores a esta penúltima versión, se debe ejecutar un flujo como el siguiente.
En dicho flujo, el Trigger es un SQL sencillo, como el que aparece en la siguiente imagen.
El número de horas que se debe establecer debe ser ligeramente superior al número de horas que han pasado desde que se generó la penúltima tabla.
Si se elimina la versión inmediatamente anterior y existe algún usuario consultando dicha versión de la tabla en ese momento, se le caerá el proceso. Para evitar este problema se elimina la versión penúltima.
Para importar un archivo csv en Stratio, el desarrollador debe asegurarse de que el csv tiene el formato UTF-8, de lo contrario, el archivo no será correctamente leído (aparecerán caracteres extraños).
17. Versiones de workflow
En Rocket se manejan o se crean diferentes versiones de un mismo workflow cuando se hacen pequeños cambios en el desarrollo. En los casos en los que los cambios sean de más envergadura o más sustanciales, lo que se debe hacer es reflejar el cambio de versión modificando el nombre del workflow e incorporando la versión pertinente.
En el caso de que haya distintas versiones, la última versión del workflow siempre debe ser la más consistente, pero además, en los ajustes del workflow es recomendable añadir unas etiquetas de versión indicando descriptivamente que tiene de particular cada versión.
En los desarrollos en los que se requiera simulación de datos para hacer comprobaciones básicas en un subconjunto acotado de datos, se debe ir a la configuración del nodo de input y, en el apartado de Debug, seleccionar la opción de “SQL query” para “Mock data type”. Lo que produce esto es que al ejecutar el Debug del workflow, éste se hará trabajando sólo con los datos que hayan sido seleccionados aquí.
Esto lo que permite es ejecutar el Debug de una forma más rápida, ya que se han seleccionado para tal cometido un subconjunto de datos determinado.
Hay otra opción para seleccionar datos más concretos, esta es “Paste and input” poniendo en el “Data type” el valor JSON. No obstante, la salvedad de JSON es que sólo reconoce datos de tipo numérico y de tipo texto, por lo que si hay alguna columna tipo fecha no será reconocida como tal, para sortear este obstáculo, se debe poner un paso intermedio que transforme el tipo de columna.
Aunque el modo Debug es correcto para hacer pruebas de ejecución preliminares, se debe tener en cuenta que la prueba real es ejecutar el flujo completo con la totalidad de los datos.
Las funciones en ODI son funciones definidas en el sistema que todos los procesos y flujos deberían poder invocar en sus transformaciones, es decir, es como tener una función en Oracle para invocarla cuando al desarrollador le interese. Por ello, en un contexto de migración tecnológica a Stratio, deberían convertirse en funciones que se parametrizan y se encuentran ya almacenadas en el sistema. Para hacerlo, se pulsa click derecho sobre el nodo en cuestión y se selecciona la opción “Save as template”.
Una vez guardada, se almacenará como plantilla a nivel de proyecto. Las plantillas del proyecto se categorizan según sean nodos de tipo Inputs, “Transformación” o “Output”. En el caso que se ha puesto como ejemplo, el nodo es de transformación.
De esta forma, la plantilla que se acaba de crear ya está disponible para añadirla como nodo en cualquier workflow a través del siguiente menú.
Un detalle relevante de las plantillas a tener en cuenta es que no se pueden modificar al invocarlas en un workflow, solo tienen permisos de lectura.
Las tablas temporales son tablas que se generan en un proceso en concreto y que, posteriormente, van a ser utilizadas en varios procesos diferentes. Por este motivo, estas tablas se deben almacenar en una ruta de /rocket/projects/…
En caso de que la tabla vaya a consultarse por muchos otros procesos, se debería incluir en una colección de tipo “con_” terminando con el sufijo “_etl”. De esta forma, al cambiar en un futuro la ruta de la tabla, solo habrá que volver a virtualizarla y todos los procesos que lean de la misma, no requerirán modificaciones.
La descripción de cada flujo debe ser lo más completa posible, persiguiendo el objetivo de que al ser leída por cualquier otro desarrollador que no sea el creador del flujo, éste pueda saber esclarecidamente las acciones que el workflow realiza.