{"id":15253,"date":"2023-05-25T09:59:10","date_gmt":"2023-05-25T09:59:10","guid":{"rendered":"https:\/\/bluetab.net\/?p=15253"},"modified":"2023-05-25T09:59:10","modified_gmt":"2023-05-25T09:59:10","slug":"starburst-construyendo-un-futuro-basado-en-datos","status":"publish","type":"post","link":"https:\/\/bluetab.org\/en\/2023\/05\/starburst-construyendo-un-futuro-basado-en-datos\/","title":{"rendered":"Starburst: Construyendo un futuro basado en datos."},"content":{"rendered":"<figure><a href=\"https:\/\/www.linkedin.com\/in\/lucascalvoberlanga\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/09\/lucas-150x150.png\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/lucascalvoberlanga\/\" target=\"_blank\" rel=\"noopener\">Lucas Calvo<\/a><\/h4>\n<p>Cloud Engineer<\/p>\n<h2>Introducci\u00f3n<\/h2>\n<p>En este nuevo art\u00edculo vamos a hablar de uno de nuestros partners: Starburst<a href=\"\/#referencias\">[1<\/a>]. Starburst es la versi\u00f3n empresarial de Trino<a href=\"\/#referencias\">[2]<\/a> realizando nuevas integraciones, mejoras de rendimiento, una capa de seguridad y restando complejidad a la gesti\u00f3n con una interfaz de usuario muy f\u00e1cil de usar y que te permite realizar distintas configuraciones.<\/p>\n<p>Para los que no conoc\u00e9is Trino, es un motor de consulta SQL distribuido open-source creado en 2012 por Facebook bajo el nombre Presto. Est\u00e1 dise\u00f1ado para consultar grandes conjuntos de datos distribuidos en una o m\u00e1s fuentes de datos heterog\u00e9neas. Esto significa que podemos consultar datos que residen en diferentes sistemas de almacenamiento como HDFS, AWS S3, Google Cloud Storage o Azure Blob Storage. Trino tambi\u00e9n tiene la capacidad de federar diferentes fuentes de datos como MySQL, PostgreSQL, Cassandra, Kafka.<\/p>\n<p>Con las nuevas necesidades que van saliendo de arquitecturas orientadas al Data Mesh<a href=\"\/#referencias\">[3<\/a>], plataformas anal\u00edticas como Starburst son cada vez m\u00e1s importantes y nos permiten centralizar y federar distintas fuentes de datos para as\u00ed tener solo un punto de entrada a nuestra informaci\u00f3n. Con esta mentalidad, podemos hacer que nuestros usuarios accedan a la plataforma de Starburst con distintos roles y distinta granularidad de acceso para que puedan consultar los distintos dominios que poseen las empresas. Adem\u00e1s Starburst no solo se queda en la consulta de datos, sino que nos permite conectarnos con herramientas anal\u00edticas como puedes ser DBT<a href=\"\/#referencias\">[4]<\/a> o Jupyter Notebook<a href=\"\/#referencias\">[5]<\/a> o herramientas de reporting como Power BI<a href=\"\/#referencias\">[6]<\/a> para sacarle m\u00e1s rendimiento a todos nuestros datos. Pero Starburst no solo se queda en eso, sino que nos puede ayudar en la migraciones de datos hacia el Cloud, ya que f\u00e1cilmente podemos conectarnos a las fuentes de datos y sacar toda la informaci\u00f3n para volcarlas en cualquier almacenamiento del Cloud.<\/p>\n<p>Como pod\u00e9is observar, Starburst es capaz de analizar todos sus datos, dentro y alrededor de tu Data Lake, y se conecta a todo un ecosistema de herramientas. Por eso vamos a realizar una serie de art\u00edculos para tratar los puntos m\u00e1s relevantes como son el despliegue y configuraci\u00f3n de la plataforma, integraci\u00f3n con otras herramientas y gobierno y administraci\u00f3n de usuarios. En este primer art\u00edculo, nos vamos a centrar en el despliegue de Starburst en Kubernetes, as\u00ed como la configuraci\u00f3n que se tiene que realizar para conectar con los distintos componentes de GCP. Adem\u00e1s hemos a\u00f1adido una capa de monitorizaci\u00f3n con Prometheus<a href=\"\/#referencias\">[7]<\/a> y Grafana<a href=\"\/#referencias\">[8<\/a>], donde hemos publicado un dashboard con distintas m\u00e9tricas importantes por si cualquier compa\u00f1\u00eda quiere centralizar las m\u00e9tricas en Grafana. Para todo ello, nos vamos a apoyar de un repositorio que hemos creado con el levantamiento de la infraestructura y la instalaci\u00f3n de Starburst.<\/p>\n<h2>\u00bfQu\u00e9 necesitas para entender este art\u00edculo?<\/h2>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Algunos conceptos sobre Terraform<a href=\"\/#referencias\">[9]<\/a>.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Algunos conceptos de Kubernetes.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Algunos conceptos de Helm.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Algunos conceptos de Prometheus.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Algunos conceptos de Grafana.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Un cuenta en GCP.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Una licencia de Starburst<\/li>\n<\/ul>\n<h2>Arquitectura<\/h2>\n<p><img decoding=\"async\" width=\"1024\" height=\"397\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image4-1-1024x397.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image4-1-1024x397.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image4-1-300x116.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image4-1-768x298.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image4-1.png 1268w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>Como se puede observar en el diagrama, estos son los componentes que se van a desplegar para la configuraci\u00f3n de Starburst. Como pieza central del despliegue, utilizaremos Google Kubernetes Engine. Este es el servicio administrado de orquestaci\u00f3n de contenedores de Google. Utilizaremos Kubernetes ya que nos facilitar\u00e1 la gesti\u00f3n de Starburst y aprovecharemos las ventajas del autoscaling de Kubernetes para ampliar el n\u00famero de workers de Starburst y escalar en m\u00e1s nodos para poder as\u00ed tener m\u00e1s recursos de computaci\u00f3n si tenemos alg\u00fan pico de trabajo o de usuarios.<\/p>\n<p>Como configuraci\u00f3n inicial de nuestro cluster de GKE, comenzaremos con un \u00fanico nodepool para facilitar el despliegue. Un nodepool es una agrupaci\u00f3n de nodos dentro de un cluster con la misma configuraci\u00f3n y especificaciones de tipo de m\u00e1quina. En nuestro caso, nuestro nodepool se llamar\u00e1 `default-node-pool` y el tipo de instancia utilizada ser\u00e1 `e2-standard-16`, que es la recomendada por Starburst, ya que el tipo de carga de trabajo necesita nodos con bastante memoria. Adem\u00e1s de la instalaci\u00f3n de Starburst, tambi\u00e9n desplegaremos en el cluster tanto Prometheus como Grafana.<\/p>\n<p>Como hemos explicado anteriormente, Starburst est\u00e1 basado en Trino, que es un motor de consulta distribuido. Los principales componentes de Trino son el Coordinator y los Workers. El Coordinator de Trino es el componente responsable de analizar las sentencias, planificar las consultas y gestionar los nodos Workers de Trino. El Coordinator realiza un seguimiento de la actividad de cada Worker y orquesta la ejecuci\u00f3n de una consulta. Los Workers son el componente responsable de ejecutar tareas y procesar datos. Los nodos Workers obtienen datos de los conectores e intercambian datos intermedios entre s\u00ed. El Coordinator es responsable de obtener los resultados de los Workers y devolver los resultados finales al cliente.<\/p>\n<p><img decoding=\"async\" width=\"913\" height=\"654\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image2.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image2.png 913w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image2-300x215.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image2-768x550.png 768w\" sizes=\"(max-width: 913px) 100vw, 913px\"><\/p>\n<p>Como componentes transversales de nuestra arquitectura, tambi\u00e9n desplegaremos una red con una subnet para realizar el despliegue de nuestro cluster de GKE, as\u00ed como un bucket en Cloud Storage para realizar pruebas de escritura de datos desde Starburst.<\/p>\n<p>Adem\u00e1s, como componente fuera de la arquitectura, tendremos jmeter<a href=\"\/#referencias\">[10]<\/a>, la herramienta con la que realizaremos pruebas de performance para probar la elasticidad de Starburst y poder probar el autoescalado de nuestro cluster.<\/p>\n<h2>Despliegue de la infraestructura<\/h2>\n<p>Una vez explicada la arquitectura vamos a proceder a realizar el despliegue de todos los componentes. Para ello, nos vamos a ayudar de Terraform como herramienta de IaC. Como partes importantes de este despliegue, tendremos la parte m\u00e1s de infraestructura tradicional que son las VPC, el cluster de GKE y la parte de Cloud Storage como hemos hablado antes, adem\u00e1s de los componentes que desplegamos en Kubernetes de una forma totalmente automatizada que son Grafana y Prometheus.<\/p>\n<p>Vamos a empezar con la explicaci\u00f3n de la infraestructura m\u00e1s cl\u00e1sica. Para este despliegue haremos uso de dos m\u00f3dulos que est\u00e1n subidos al github:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">M\u00f3dulo de GKE<a href=\"\/#referencias\">[11]<\/a>.<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">M\u00f3dulo de VPC<a href=\"\/#referencias\">[12<\/a>].<\/li>\n<\/ul>\n<p>Estos dos m\u00f3dulos est\u00e1n invocados en el `main.tf` del repositorio y hacen uso del provider de Google para el despliegue:<\/p>\n<pre><code class=\"language-python\">\n```tf\nprovider \"google\" {\n  project = var.project_id\n  region  = var.region\n}\nprovider \"google-beta\" {\n  project = var.project_id\n  region  = var.region\n}\nmodule \"network\" {\n  source = \"git@github.com:lucasberlang\/gcp-network.git?ref=v1.0.0\"\n  project_id         = var.project_id\n  description        = var.description\n  enable_nat_gateway = true\n  offset             = 1\n  intra_subnets = [\n    {\n      subnet_name           = \"private-subnet01\"\n      subnet_ip_cidr        = \"10.0.0.0\/24\"\n      subnet_private_access = false\n      subnet_region         = var.region\n    }\n  ]\n  secondary_ranges = {\n    private-subnet01 = [\n      {\n        range_name    = \"private-subnet01-01\"\n        ip_cidr_range = var.ip_range_pods\n      },\n      {\n        range_name    = \"private-subnet01-02\"\n        ip_cidr_range = var.ip_range_services\n      },\n    ]\n  }\n  labels = var.labels\n}\nresource \"google_storage_bucket\" \"gcs_starburst\" {\n  name          = var.name\n  location      = \"EU\"\n  force_destroy = var.force_destroy\n}\nmodule \"gke-starburst\" {\n  source = \"git@github.com:lucasberlang\/gcp-gke.git?ref=v1.1.0\"\n  project_id              = var.project_id\n  name                    = \"starburst\"\n  regional                = true\n  region                  = var.region\n  network                 = module.network.network_name\n  subnetwork              = \"go-euw1-bt-stb-private-subnet01-dev\"\n  ip_range_pods           = \"private-subnet01-01\"\n  ip_range_services       = \"private-subnet01-02\"\n  enable_private_endpoint = false\n  enable_private_nodes    = false\n  master_ipv4_cidr_block  = \"172.16.0.0\/28\"\n  workload_identity       = false\n  kubernetes_version      = var.kubernetes_version\n  gce_persistent_disk_csi_driver = true\n  master_authorized_networks = [\n    {\n      cidr_block   = module.network.intra_subnet_ips.0\n      display_name = \"VPC\"\n    },\n    {\n      cidr_block   = \"0.0.0.0\/0\"\n      display_name = \"shell\"\n    }\n  ]\n  cluster_autoscaling = {\n    enabled             = true,\n    autoscaling_profile = \"BALANCED\",\n    max_cpu_cores       = 300,\n    max_memory_gb       = 940,\n    min_cpu_cores       = 24,\n    min_memory_gb       = 90,\n  }\n  node_pools = [\n    {\n      name         = \"default-node-pool\"\n      machine_type = \"e2-standard-16\"\n      auto_repair  = false\n      auto_upgrade = false\n    },\n  ]\n  node_labels = {\n    \"starburstpool\" = \"default-node-pool\"\n  }\n  istio     = var.istio\n  dns_cache = var.dns_cache\n  labels    = var.labels\n}\n```\n <\/code><\/pre>\n<p>Lo \u00fanico importante a tener en cuenta, es que vamos a desplegar una red con una \u00fanica subred y que el cluster de GKE est\u00e1 habilitado con el autoescalado para poder incrementar el n\u00famero de nodos cuando haya una carga de trabajo. Asimismo, es importante tener en cuenta que se ha a\u00f1adido una etiqueta a todos los nodos que es `&#8221;starburstpool&#8221; = &#8220;default-node-pool&#8221;` para aislar el propio despliegue de Starburst del que m\u00e1s tarde haremos uso. Aparte de estos componentes tambi\u00e9n desplegamos una Cloud Storage para luego configurar el conector de Hive.<\/p>\n<p>Por otra parte, como hemos comentado, tambi\u00e9n haremos el despliegue de Grafana y Prometheus. Para ello haremos uso del provider de Helm y de Kubernetes de Terraform.&nbsp;<\/p>\n<p>El despliegue de estos componentes lo tenemos en el archivo `helm.tf`:<\/p>\n<pre><code class=\"language-python\">```tf\nresource \"kubernetes_namespace\" \"prometheus\" {\n  metadata {\n    name = \"prometheus\"\n  }\n}\nresource \"kubernetes_namespace\" \"grafana\" {\n  metadata {\n    name = \"grafana\"\n  }\n}\nresource \"helm_release\" \"grafana\" {\n  chart      = \"grafana\"\n  name       = \"grafana\"\n  namespace  = kubernetes_namespace.grafana.metadata.0.name\n  repository = \"https:\/\/grafana.github.io\/helm-charts\"\n  values = [\n    file(\"templates\/grafana.yaml\")\n  ]\n}\nresource \"kubernetes_secret\" \"grafana-secrets\" {\n  metadata {\n    name      = \"grafana-credentials\"\n    namespace = kubernetes_namespace.grafana.metadata.0.name\n  }\n  data = {\n    adminUser     = \"admin\"\n    adminPassword = \"admin\"\n  }\n}\nresource \"helm_release\" \"prometheus\" {\n  chart      = \"prometheus\"\n  name       = \"prometheus\"\n  namespace  = kubernetes_namespace.prometheus.metadata.0.name\n  repository = \"https:\/\/prometheus-community.github.io\/helm-charts\"\n  values = [\n    file(\"templates\/prometheus.yaml\")\n  ]\n}\n```\n <\/code><\/pre>\n<p>Hay varias cosas que tenemos que tener en cuenta, estas son las configuraciones que hemos a\u00f1adido en los values de cada chart.&nbsp;<\/p>\n<p>Primero vamos con los valores de Prometheus que hemos configurado. Hemos a\u00f1adido una configuraci\u00f3n extra para que recoja las m\u00e9tricas de Starburst una vez que se levante. Esto lo hemos hecho en la siguiente parte de la configuraci\u00f3n:<\/p>\n<pre><code class=\"language-python\">```yaml\nextraScrapeConfigs: |\n  - job_name: starburst-monitor\n    scrape_interval: 5s\n    static_configs:\n      - targets: \n        - 'prometheus-coordinator-starburst-enterprise.default.svc.cluster.local:8081'\n        - 'prometheus-worker-starburst-enterprise.default.svc.cluster.local:8081'\n    metrics_path: \/metrics\n    scheme: http\n```\n <\/code><\/pre>\n<p>Lo \u00fanico a tener en cuenta son los targets que hemos a\u00f1adido, que b\u00e1sicamente son los servicios tanto del Coordinator como de los Workers de Starburst para que recoja todas las m\u00e9tricas.<\/p>\n<p>En la parte de Grafana hemos a\u00f1adido tanto la configuraci\u00f3n de Prometheus, como un dashboard que hemos creado custom para Starburst.&nbsp;<\/p>\n<p>La configuraci\u00f3n que hemos a\u00f1adida es la siguiente:<\/p>\n<pre><code class=\"language-python\">```yaml\ndatasources:\n datasources.yaml:\n   apiVersion: 1\n   datasources:\n   - name: Prometheus\n     type: prometheus\n     url: http:\/\/prometheus-server.prometheus.svc.cluster.local\n     isDefault: true\ndashboards:\n  default:\n    Starburst-cluster:\n      gnetId: 18767\n      revision: 1\n      datasource: Prometheus\n```\n <\/code><\/pre>\n<p>En la carpeta infra del repositorio de Github, podr\u00e1s encontrar todo el c\u00f3digo necesario para realizar dicho despliegue.<\/p>\n<h2>Instalaci\u00f3n y configuraci\u00f3n de Starburst<\/h2>\n<p>Una vez que tengamos toda la infraestructura levantada, vamos a proceder a desplegar Starburst en nuestro cluster de GKE. Para ello, vamos a desplegar estos componentes:<\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Postgres Database on Kubernetes<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Hive Metastore Service<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Starburst Enterprise<\/li>\n<\/ul>\n<p>El servicio de Hive Mestastore es necesario para configurar el conector de Hive para as\u00ed poder acceder o escribir a los datos que se guardan en Google Cloud Storage. Como backend de nuestro servicio de Metastore, vamos a desplegar un base de datos PostgreSQL, para as\u00ed poder guardar toda la informaci\u00f3n de la metadata en esta base de datos. Adem\u00e1s tendremos que configurar el servicio de Hive para pasarle las credenciales de Google Cloud y que tenga permisos para poder leer y escribir de GCS. Por lo tanto, vamos a proceder primero a declarar algunas variables de entorno que necesitaremos para descargar los charts del repositorio privado de Starburst y algunas variables de configuraci\u00f3n m\u00e1s que necesitaremos para realizar el despliegue.<\/p>\n<p>Esta ser\u00edan las variables que vamos a necesitar en nuestro despliegue:<\/p>\n<pre><code class=\"language-python\">```bash\nexport admin_usr=     # Choose an admin user name you will use to login to Starburst &amp; Ranger. Do NOT use 'admin'\nexport admin_pwd=     # Choose an admin password you will use to login to Starburst &amp; Ranger. MUST be a minimum of 8 characters and contain at least one uppercase, lowercase and numeric value.\nexport registry_pwd= #Credentials harbor registry\nexport registry_usr= #Credentials harbor registry\nexport starburst_license=starburstdata.license #License Starburst\n# Zone where the cluster will be deployed. e.g. us-east4-b\nexport zone=\"europe-west1\"\n# Google Cloud Project ID where the cluster is being deployed\nexport google_cloud_project=\n# Google Service account name. The service account is used to access services like GCS and BigQuery, so you should ensure that it has the relevant permissions for these\n# Give your cluster a name\nexport cluster_name=\n# These next values are automatically set based on your input values\n# We'll automatically get the domain for the zone you are selecting. Comment this out if you don't need DNS\n#export google_cloud_dns_zone_name=$(gcloud dns managed-zones describe ${google_cloud_dns_zone:?Zone not set} --project ${google_cloud_project_dns:?Project ID not set} | grep dnsName | awk '{ print $2 }' | sed 's\/.$\/\/g')\n# This is the public URL to access Starburst\nexport starburst_url=${cluster_name:?Cluster Name not set}-starburst.${google_cloud_dns_zone_name}\n# This is the public URL to access Ranger\nexport ranger_url=${cluster_name:?Cluster Name not set}-ranger.${google_cloud_dns_zone_name}\n# Insights DB details\n# These are the defaults if you choose to deploy your postgresDB to the K8s cluster\n# You can adjust these to connect to an external DB, but be advised that the nodes in the K8s cluster must have access to the URL\nexport database_connection_url=jdbc:postgresql:\/\/postgresql:5432\/insights\nexport database_username=\nexport database_password=\n# Data Products. Leave the password unset as below, if you are connecting directly to the coordinator on port 8080\nexport data_products_enabled=true\nexport data_products_jdbc_url=jdbc:trino:\/\/coordinator:8080\nexport data_products_username=${admin_usr}\nexport data_products_password=\n# Starburst Access Control\nexport starburst_access_control_enabled=true\nexport starburst_access_control_authorized_users=${admin_usr}\n# These last remaining values are static\nexport xtra_args_hive=\"--set objectStorage.gs.cloudKeyFileSecret=service-account-key\"\nexport xtra_args_starburst=\"--values starburst.catalog.yaml\"\nexport xtra_args_ranger=\"\"\n```\n <\/code><\/pre>\n<p>Una vez definidas nuestras variables de entorno procederemos a crearnos un secreto de Kubernetes para configurar las credenciales con las que Hive se va a conectar a GCS.<\/p>\n<pre><code class=\"language-python\">```bash\nkubectl create secret generic service-account-key --from-file key.json\n```\n <\/code><\/pre>\n<p>Para ello, como paso previo, nos hemos creado una service account con permisos en Cloud Storage y en Bigquery y nos hemos descargado las credenciales de esa service account. Tambi\u00e9n como paso previo, a\u00f1adiremos los repositorio de Helm con el siguiente comando:<\/p>\n<pre><code class=\"language-python\">```bash\nhelm repo add --username ${registry_usr} --password ${registry_pwd} starburstdata https:\/\/harbor.starburstdata.net\/chartrepo\/starburstdata\nhelm repo add bitnami https:\/\/charts.bitnami.com\/bitnami\n```\n <\/code><\/pre>\n<p>Una vez que tenemos la configuraci\u00f3n previa hecha, vamos a proceder a desplegar el servicio de PostgreSQL primero, y posteriormente, el Hive Metastore. Para ello haremos uso de Helm. Para el despliegue de PostgreSQL usaremos el siguiente comando:<\/p>\n<pre><code class=\"language-python\">```bash\nhelm upgrade postgres bitnami\/postgresql --install --values postgres.yaml \n    --version 12.1.6 \n    --set primary.nodeSelector.starburstpool=default-node-pool \n    --set readReplicas.nodeSelector.starburstpool=default-node-pool\n```\n <\/code><\/pre>\n<p>Hay varios factores a tener en cuenta en el comando anterior. El primero es que el despliegue de PostgreSQL lo haremos en los nodos que tengan el tag `starburstpool=default-node-pool`, que es nuestro worker pool por defecto. Usaremos la versi\u00f3n 12.1.6 de PostgreSQL y la configuraci\u00f3n que hemos a\u00f1adido en postgres es la siguiente:<\/p>\n<pre><code class=\"language-python\">```yaml\nfullnameOverride: postgresql\nglobal:\n  postgresql:\n    auth:\n      database: postgres\n      username: postgres\n      postgresPassword: ****\n  storageClass: \"standard\"\nprimary:\n  initdb:\n    scripts:\n      init.sql: |\n        create database hive;\n        create database ranger;\n        create database insights;\n        create database datacache;\nservice:\n  type: ClusterIP\n``` <\/code><\/pre>\n<p>Esta informaci\u00f3n se encuentra en el archivo `postgres.yaml` y nos configurar\u00e1 el usuario y contrase\u00f1a de PostgreSQL, y nos crear\u00e1 4 bases de datos que usa internamente Starburst como backend. En nuestro caso, como pod\u00e9is observar, hemos configurado el servicio de backend en el mismo cluster que la configuraci\u00f3n de Starburst, pero esto se puede configurar fuera del cluster de Kubernetes para entornos productivos. B\u00e1sicamente podr\u00edamos tener un servicio gestionado como es Cloud Sql para as\u00ed evitar problemas en producci\u00f3n.<\/p>\n<p>Ahora vamos a proceder con el despliegue del servicio de Hive Metastore, esto lo haremos con el siguiente comando:<\/p>\n<pre><code class=\"language-python\">```bash\nhelm upgrade hive starburstdata\/starburst-hive --install --values hive.yaml \n    --set registryCredentials.username=${registry_usr:?Value not set} \n    --set registryCredentials.password=${registry_pwd:?Value not set} \n    --set nodeSelector.starburstpool=default-node-pool  \n    --set objectStorage.gs.cloudKeyFileSecret=service-account-key\n``` <\/code><\/pre>\n<p>Aqu\u00ed tenemos que tener en cuenta varias cosas importantes, la primera es que como en el servicio de PostgreSQL el despliegue se va a realizar en los nodos con el tag `starburstpool=default-node-pool`. El segundo punto importante es que hemos realizado la configuraci\u00f3n de las credenciales de Google para que funcione el conector de hive, esto lo hemos realizado con el siguiente comando:<\/p>\n<pre><code class=\"language-python\">`--set objectStorage.gs.cloudKeyFileSecret=service-account-key` <\/code><\/pre>\n<p>Con esta acci\u00f3n,&nbsp; montamos el fichero de credenciales como un archivo en el despliegue de Hive para que tenga visibilidad en las credenciales. Los valores extras que hemos a\u00f1adido a la configuraci\u00f3n de hive se encuentran en el archivo `hive.yaml` y son los siguientes:<\/p>\n<pre><code class=\"language-python\">```yaml\ndatabase:\n  external:\n    driver: org.postgresql.Driver\n    jdbcUrl: jdbc:postgresql:\/\/postgresql:5432\/hive\n    user: #user postgres\n    password: #password postgres\n  type: external\nexpose:\n  type: clusterIp\nimage:\n  repository: harbor.starburstdata.net\/starburstdata\/hive\nregistryCredentials:\n  enabled: true\n  registry: harbor.starburstdata.net\/starburstdata\n```\n <\/code><\/pre>\n<p>Una vez que tenemos desplegado tanto el servicio de Postgres como el de Hive Metastore, podemos proceder a desplegar Starburst. Primero necesitaremos realizar una serie de pasos previos. El primero ser\u00e1 crearnos un secreto de Kubernetes con la licencia de Starburst, el segundo ser\u00e1 crearnos un secreto con las variables de entornos que hemos definido antes, esto lo haremos con un peque\u00f1o script para quitar complejidad y que nos coja las variables que ya hemos definido.&nbsp;<\/p>\n<p>Con el siguiente comando procederemos a realizar los pasos anteriores:<\/p>\n<pre><code class=\"language-python\">```bash\nkubectl create secret generic starburst --from-file ${starburst_license}\nchmod 755 load_secrets.sh &amp;&amp; . .\/load_secrets.sh\nkubectl apply -f secrets.yaml\n```\n <\/code><\/pre>\n<p>Una vez que tenemos las configuraciones previas vamos a proceder a desplegar Starburst con el siguiente comando:<\/p>\n<pre><code class=\"language-python\">```bash\nhelm upgrade starburst-enterprise starburstdata\/starburst-enterprise --install --values starburst.yaml \n    --set sharedSecret=\"$(openssl rand 64 | base64)\" \n    --set coordinator.resources.requests.memory=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.memory}' | awk -F \"Ki\" '{ print $1 }')*10\/100 ))Ki) \n    --set coordinator.resources.requests.cpu=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.cpu}' | awk -F \"m\" '{ print $1 }')*10\/100 ))m) \n    --set coordinator.resources.limits.memory=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.memory}' | awk -F \"Ki\" '{ print $1 }')*10\/100 ))Ki) \n    --set coordinator.resources.limits.cpu=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.cpu}' | awk -F \"m\" '{ print $1 }')*10\/100 ))m) \n    --set worker.resources.requests.memory=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.memory}' | awk -F \"Ki\" '{ print $1 }') - 10500000 ))Ki) \n    --set worker.resources.requests.cpu=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.cpu}' | awk -F \"m\" '{ print $1 }') - 3500 ))m) \n    --set worker.resources.limits.memory=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.memory}' | awk -F \"Ki\" '{ print $1 }') - 10500000 ))Ki) \n    --set worker.resources.limits.cpu=$(echo $(( $(kubectl get nodes --selector='starburstpool=default-node-pool' -o jsonpath='{.items[0].status.allocatable.cpu}' | awk -F \"m\" '{ print $1 }') - 3500 ))m) \n    --set coordinator.nodeSelector.starburstpool=default-node-pool \n```\n <\/code><\/pre>\n<p>Aqu\u00ed como pod\u00e9is observar, hay varias cosas a tener en cuenta. La primera es que todos los componentes de Starburst que se despliegan lo hacen en los nodos con el tag `starburstpool=default-node-pool`. Esto simplemente lo hemos hecho para quitar complejidad a la demo.&nbsp; En entornos productivos, una buena pr\u00e1ctica ser\u00eda tener un nodepool para el Coordinator y otro nodepool para los Workers de Starburst.<\/p>\n<p>Otra cosa a tener en cuenta es la configuraci\u00f3n de la memoria y cpu que se hace tanto en los Workers como en el Coordinator. Como buenas pr\u00e1cticas, Starburst recomienda que haya un pod worker por cada nodo que se despliega en nuestro cluster de Kubernetes. Para ello lo que hemos hecho es ajustar la memoria y cpu de nuestros pods al tama\u00f1o de m\u00e1quina que tenemos. Por \u00faltimo est\u00e1n los valores de configuraci\u00f3n que hemos utilizado en el despliegue de Starburst, estos se pueden encontrar en el archivo `starburst.yaml` y son los siguientes:<\/p>\n<pre><code class=\"language-python\">```yaml\ncatalogs:\n  hive: |\n    connector.name=hive\n    hive.security=starburst\n    hive.metastore.uri=thrift:\/\/hive:9083\n    hive.gcs.json-key-file-path=\/gcs-keyfile\/key.json\n    hive.gcs.use-access-token=false\n  postgres: |\n    connector.name=postgresql\n    connection-url=jdbc:postgresql:\/\/postgresql:5432\/insights\n    connection-user=******\n    connection-password=******\n  bigquery: |\n      connector.name=bigquery\n      bigquery.project-id=******\n      bigquery.credentials-file=\/gcs-keyfile\/key.json\nprometheus:\n  enabled: true\n  agent:\n    version: \"0.16.1\"\n    port: 8081\n    config: \"\/etc\/starburst\/telemetry\/prometheus.yaml\"\n  rules:\n    - pattern: trino.execution&lt;name=QueryManager&gt;&lt;&gt;(running_queries|queued_queries)\n      name: $1\n      attrNameSnakeCase: true\n      type: GAUGE\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;FailedQueries.TotalCount'\n      name: 'starburst_failed_queries'\n      type: COUNTER\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;(running_queries)'\n      name: 'starburst_running_queries'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;StartedQueries.FiveMinute.Count'\n      name: 'starburst_started_queries'\n    - pattern: 'trino.execution&lt;name=SqlTaskManager&gt;&lt;&gt;InputPositions.FiveMinute.Count'\n      name: 'starburst_input_rows'\n    - pattern: 'trino.execution&lt;name=SqlTaskManager&gt;&lt;&gt;InputDataSize.FiveMinute.Count'\n      name: 'starburst_input_data_bytes'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;UserErrorFailures.FiveMinute.Count'\n      name: 'starburst_failed_queries_user'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;ExecutionTime.FiveMinutes.P50'\n      name: 'starburst_latency_p50'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;WallInputBytesRate.FiveMinutes.P90'\n      name: 'starburst_latency_p90'\n    - pattern: 'trino.failuredetector&lt;name=HeartbeatFailureDetector&gt;&lt;&gt;ActiveCount'\n      name: 'starburst_active_node'\n    - pattern: 'trino.memory&lt;type=ClusterMemoryPool, name=general&gt;&lt;&gt;FreeDistributedBytes'\n      name: 'starburst_free_memory_pool'\n    - pattern: 'trino.memory&lt;name=ClusterMemoryManager&gt;&lt;&gt;QueriesKilledDueToOutOfMemory'\n      name: 'starburst_queries_killed_due_to_out_of_memory'\n    - pattern: 'java.lang&lt;type=Memory&gt;&lt;HeapMemoryUsage&gt;committed'\n      name: 'starburst_heap_size_usage'\n    - pattern: 'java.lang&lt;type=Threading&gt;&lt;&gt;ThreadCount'\n      name: 'starburst_thread_count'\ncoordinator:\n  envFrom:\n  - secretRef:\n      name: environment-vars\n  additionalProperties: |\n    starburst.data-product.enabled=${ENV:data_products_enabled}\n    data-product.starburst-jdbc-url=${ENV:data_products_jdbc_url}\n    data-product.starburst-user=${ENV:data_products_username}\n    data-product.starburst-password=\n    query.max-memory=1PB\n    starburst.access-control.enabled=${ENV:starburst_access_control_enabled}\n    starburst.access-control.authorized-users=${ENV:starburst_access_control_authorized_users}\n  etcFiles:\n    properties:\n      config.properties: |\n        coordinator=true\n        node-scheduler.include-coordinator=false\n        http-server.http.port=8080\n        discovery-server.enabled=true\n        discovery.uri=http:\/\/localhost:8080\n        usage-metrics.cluster-usage-resource.enabled=true\n        http-server.authentication.allow-insecure-over-http=true\n        web-ui.enabled=true\n        http-server.process-forwarded=true\n        insights.persistence-enabled=true\n        insights.metrics-persistence-enabled=true\n        insights.jdbc.url=${ENV:database_connection_url}\n        insights.jdbc.user=${ENV:database_username}\n        insights.jdbc.password=${ENV:database_password}\n      password-authenticator.properties: |\n        password-authenticator.name=file\n  nodeSelector:\n    starburstpool: default-node-pool\n  resources:\n    limits:\n      cpu: 2\n      memory: 12Gi\n    requests:\n      cpu: 2\n      memory: 12Gi\nexpose:\n  type: clusterIp\n  ingress:\n    serviceName: starburst\n    servicePort: 8080\n    host: \n    path: \"\/\"\n    pathType: Prefix\n    tls:\n      enabled: true\n      secretName: tls-secret-starburst\n    annotations:\n      kubernetes.io\/ingress.class: nginx\n      cert-manager.io\/cluster-issuer: letsencrypt\nregistryCredentials:\n  enabled: true\n  password: ******\n  registry: harbor.starburstdata.net\/starburstdata\n  username: ******\nstarburstPlatformLicense: starburst\nuserDatabase:\n  enabled: true\n  users:\n  - password: ******\n    username: ******\nworker:\n  envFrom:\n  - secretRef:\n      name: environment-vars\n  autoscaling:\n    enabled: true\n    maxReplicas: 10\n    minReplicas: 3\n    targetCPUUtilizationPercentage: 40\n  deploymentTerminationGracePeriodSeconds: 30\n  nodeSelector:\n    starburstpool: default-node-pool\n  resources:\n    limits:\n      cpu: 8\n      memory: 40Gi\n    requests:\n      cpu: 8\n      memory: 40Gi\n  starburstWorkerShutdownGracePeriodSeconds: 120\n  tolerations:\n    - key: \"kubernetes.azure.com\/scalesetpriority\"\n      operator: \"Exists\"\n      effect: \"NoSchedule\"\nadditionalVolumes:\n  - path: \/gcs-keyfile\/key.json\n    subPath: key.json\n    volume:\n      configMap:\n        name: \"sa-key\"\n```\n <\/code><\/pre>\n<p>En esta configuraci\u00f3n hay varios valores a tener en cuenta, como son catalogs, prometheus, worker y additionalVolumes.<\/p>\n<p>Vamos a empezar explicando la parte de catalogs. Para los que no lo sepan, un cat\u00e1logo en Starburst es la configuraci\u00f3n que permite acceder a unas fuentes de datos determinadas. Cada cl\u00faster de Starburst puede tener configurados m\u00faltiples cat\u00e1logos y, por tanto, permitir el acceso a diversas fuentes de datos. En nuestro caso hemos definido el cat\u00e1logo de Hive, PostgreSQL y Bigquery para poder acceder a dichas fuentes de datos:<\/p>\n<pre><code class=\"language-python\">```yaml\ncatalogs:\n  hive: |\n    connector.name=hive\n    hive.security=starburst\n    hive.metastore.uri=thrift:\/\/hive:9083\n    hive.gcs.json-key-file-path=\/gcs-keyfile\/key.json\n    hive.gcs.use-access-token=false\n  postgres: |\n    connector.name=postgresql\n    connection-url=jdbc:postgresql:\/\/postgresql:5432\/insights\n    connection-user=******\n    connection-password=******\n  bigquery: |\n      connector.name=bigquery\n      bigquery.project-id=******\n      bigquery.credentials-file=\/gcs-keyfile\/key.json\n```\n <\/code><\/pre>\n<p>La segunda configuraci\u00f3n a tener en cuenta es la de Prometheus, esto lo realizamos para exponer ciertas m\u00e9tricas a Prometheus y poder sacar informaci\u00f3n relevante en un dashboard de Grafana. Para ello tenemos la siguiente configuraci\u00f3n:<\/p>\n<pre><code class=\"language-python\">```yaml\nprometheus:\n  enabled: true\n  agent:\n    version: \"0.16.1\"\n    port: 8081\n    config: \"\/etc\/starburst\/telemetry\/prometheus.yaml\"\n  rules:\n    - pattern: trino.execution&lt;name=QueryManager&gt;&lt;&gt;(running_queries|queued_queries)\n      name: $1\n      attrNameSnakeCase: true\n      type: GAUGE\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;FailedQueries.TotalCount'\n      name: 'starburst_failed_queries'\n      type: COUNTER\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;(running_queries)'\n      name: 'starburst_running_queries'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;StartedQueries.FiveMinute.Count'\n      name: 'starburst_started_queries'\n    - pattern: 'trino.execution&lt;name=SqlTaskManager&gt;&lt;&gt;InputPositions.FiveMinute.Count'\n      name: 'starburst_input_rows'\n    - pattern: 'trino.execution&lt;name=SqlTaskManager&gt;&lt;&gt;InputDataSize.FiveMinute.Count'\n      name: 'starburst_input_data_bytes'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;UserErrorFailures.FiveMinute.Count'\n      name: 'starburst_failed_queries_user'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;ExecutionTime.FiveMinutes.P50'\n      name: 'starburst_latency_p50'\n    - pattern: 'trino.execution&lt;name=QueryManager&gt;&lt;&gt;WallInputBytesRate.FiveMinutes.P90'\n      name: 'starburst_latency_p90'\n    - pattern: 'trino.failuredetector&lt;name=HeartbeatFailureDetector&gt;&lt;&gt;ActiveCount'\n      name: 'starburst_active_node'\n    - pattern: 'trino.memory&lt;type=ClusterMemoryPool, name=general&gt;&lt;&gt;FreeDistributedBytes'\n      name: 'starburst_free_memory_pool'\n    - pattern: 'trino.memory&lt;name=ClusterMemoryManager&gt;&lt;&gt;QueriesKilledDueToOutOfMemory'\n      name: 'starburst_queries_killed_due_to_out_of_memory'\n    - pattern: 'java.lang&lt;type=Memory&gt;&lt;HeapMemoryUsage&gt;committed'\n      name: 'starburst_heap_size_usage'\n    - pattern: 'java.lang&lt;type=Threading&gt;&lt;&gt;ThreadCount'\n      name: 'starburst_thread_count'\n```\n <\/code><\/pre>\n<p>En la configuraci\u00f3n de los workers, vamos a activar el autoescalado de estos pods. Para ello vamos a realizar una configuraci\u00f3n para que haya un m\u00ednimo de 3 pods workers que se traducir\u00e1n en 3 nodos en nuestro cluster de GKE y un m\u00e1ximo de 10 pods. Para el autoescalado vamos a usar la m\u00e9trica de consumo de CPU.&nbsp;<\/p>\n<p>Los valores son los siguientes:<\/p>\n<pre><code class=\"language-python\">```yaml\nworker:\n  envFrom:\n  - secretRef:\n      name: environment-vars\n  autoscaling:\n    enabled: true\n    maxReplicas: 10\n    minReplicas: 3\n    targetCPUUtilizationPercentage: 40\n```\n <\/code><\/pre>\n<p>Por \u00faltimo, a\u00f1adiremos un volumen adicional a nuestro despliegue para poder montar las credenciales de Google cloud tanto en el coordinator como en los workers.<\/p>\n<p>Esto lo haremos de la siguiente forma:<\/p>\n<pre><code class=\"language-python\">```yaml\nadditionalVolumes:\n  - path: \/gcs-keyfile\/key.json\n    subPath: key.json\n    volume:\n      configMap:\n        name: \"sa-key\"\n```\n <\/code><\/pre>\n<p>Con todos estos pasos, tendr\u00edamos nuestro cluster de Starburst ya operativo.<\/p>\n<p><img decoding=\"async\" width=\"756\" height=\"129\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image6.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image6.png 756w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image6-300x51.png 300w\" sizes=\"(max-width: 756px) 100vw, 756px\"><br \/>\n<img decoding=\"async\" width=\"1024\" height=\"588\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11-1024x588.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11-1024x588.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11-300x172.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11-768x441.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11-1536x882.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image11.png 1832w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<h2>Consultas en GCP y autoescalado de Starburst<\/h2>\n<p>Una vez realizado el levantamiento del cluster de Starburst, vamos a realizar algunas consultas para probar su rendimiento y funcionamiento. Para ello vamos a realizar consultas de lectura en el esquema de TPCH<a href=\"\/#referencias\">[13]<\/a> y despu\u00e9s vamos a escribir la salida de estas consultas en el bucket de Google que hemos creado en los pasos de despliegue.&nbsp;<\/p>\n<p>Las consultas que vamos a ejecutar se encuentran en la carpeta de queries en los archivos `tpch.sql` y `gcs_storage.sql`.<\/p>\n<p>Para lanzar las consultas ser\u00e1 tan sencillo como irnos al apartado de consultas de la interfaz web y ejecutar las primeras consultas del archivo `tpch.sql`:<\/p>\n<pre><code class=\"language-python\">```sql\n CREATE SCHEMA hive.logistic WITH (location = 'gs:\/\/starburst-bluetab-test\/logistic');\nCREATE VIEW \"hive\".\"logistic\".\"shipping_priority\" SECURITY DEFINER AS\nSELECT\n  l.orderkey\n, SUM((l.extendedprice * (1 - l.discount))) revenue\n, o.orderdate\n, o.shippriority\nFROM\n  tpch.tiny.customer c\n, tpch.tiny.orders o\n, tpch.tiny.lineitem l\nWHERE ((c.mktsegment = 'BUILDING') AND (c.custkey = o.custkey) AND (l.orderkey = o.orderkey))\nGROUP BY l.orderkey, o.orderdate, o.shippriority\nORDER BY revenue DESC, o.orderdate ASC;\nCREATE VIEW \"hive\".\"logistic\".\"minimum_cost_supplier\" SECURITY DEFINER AS\nSELECT\n  s.acctbal\n, s.name SupplierName\n, n.name Nation\n, p.partkey\n, p.mfgr\n, s.address\n, s.phone\n, s.comment\nFROM\n  tpch.tiny.part p\n, tpch.tiny.supplier s\n, tpch.tiny.partsupp ps\n, tpch.tiny.nation n\n, tpch.tiny.region r\nWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (p.size = 15) AND (p.type LIKE '%BRASS') AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE') AND (ps.supplycost = (SELECT MIN(ps.supplycost)\nFROM\n  tpch.tiny.partsupp ps\n, tpch.tiny.supplier s\n, tpch.tiny.nation n\n, tpch.tiny.region r\nWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE'))\n)))\nORDER BY s.acctbal DESC, n.name ASC, s.name ASC, p.partkey ASC;\nselect\n  cst.name as CustomerName,\n  cst.address,\n  cst.phone,\n  cst.nationkey,\n  cst.acctbal as BookedOrders,\n  cst.mktsegment,\n  nat.name as Nation,\n  reg.name as Region\nfrom tpch.sf1.customer as cst\njoin tpch.sf1.nation as nat on nat.nationkey = cst.nationkey\njoin tpch.sf1.region as reg on reg.regionkey = nat.regionkey\nwhere reg.regionkey = 1;\nselect\n  nat.name as Nation,\n  avg(cst.acctbal) as average_booking\nfrom tpch.sf100.customer as cst\njoin tpch.sf100.nation as nat on nat.nationkey = cst.nationkey\njoin tpch.sf100.region as reg on reg.regionkey = nat.regionkey\nwhere reg.regionkey = 1\ngroup by nat.name;\n```\n <\/code><\/pre>\n<p><img decoding=\"async\" width=\"1024\" height=\"496\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1-1024x496.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1-1024x496.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1-300x145.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1-768x372.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1-1536x744.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image1.png 1850w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>En estas pruebas crearemos una serie de vistas y haremos unos selects con varios cruces sobre las tablas de customer(15000000 rows), nation(25 rows) y region(5 rows) del esquema sf100 para comprobar que todo funciona correctamente y ver que tenemos nuestra plataforma operativa. Una vez comprobado que todo es correcto, probaremos a escribir algunos resultados en el bucket que hemos creado.<\/p>\n<p>Para ello lanzaremos las consultas que se encuentran en el archivo `gcs_storage.sql`:<\/p>\n<pre><code class=\"language-python\">{\"type\":\"elementor\",\"siteurl\":\"https:\/\/bluetab.net\/es\/wp-json\/\",\"elements\":[{\"id\":\"1a82503\",\"elType\":\"widget\",\"isInner\":false,\"isLocked\":false,\"settings\":{\"code_language\":\"python\",\"code_block\":\"```sqln CREATE SCHEMA hive.logistic WITH (location = 'gs:\/\/starburst-bluetab-test\/logistic');nnCREATE VIEW \"hive\".\"logistic\".\"shipping_priority\" SECURITY DEFINER ASnSELECTn  l.orderkeyn, SUM((l.extendedprice * (1 - l.discount))) revenuen, o.orderdaten, o.shipprioritynFROMn  tpch.tiny.customer cn, tpch.tiny.orders on, tpch.tiny.lineitem lnWHERE ((c.mktsegment = 'BUILDING') AND (c.custkey = o.custkey) AND (l.orderkey = o.orderkey))nGROUP BY l.orderkey, o.orderdate, o.shipprioritynORDER BY revenue DESC, o.orderdate ASC;nnnCREATE VIEW \"hive\".\"logistic\".\"minimum_cost_supplier\" SECURITY DEFINER ASnSELECTn  s.acctbaln, s.name SupplierNamen, n.name Nationn, p.partkeyn, p.mfgrn, s.addressn, s.phonen, s.commentnFROMn  tpch.tiny.part pn, tpch.tiny.supplier sn, tpch.tiny.partsupp psn, tpch.tiny.nation nn, tpch.tiny.region rnWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (p.size = 15) AND (p.type LIKE '%BRASS') AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE') AND (ps.supplycost = (SELECT MIN(ps.supplycost)nFROMn  tpch.tiny.partsupp psn, tpch.tiny.supplier sn, tpch.tiny.nation nn, tpch.tiny.region rnWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE'))n)))nORDER BY s.acctbal DESC, n.name ASC, s.name ASC, p.partkey ASC;nnnnselectn  cst.name as CustomerName,n  cst.address,n  cst.phone,n  cst.nationkey,n  cst.acctbal as BookedOrders,n  cst.mktsegment,n  nat.name as Nation,n  reg.name as Regionnfrom tpch.sf1.customer as cstnjoin tpch.sf1.nation as nat on nat.nationkey = cst.nationkeynjoin tpch.sf1.region as reg on reg.regionkey = nat.regionkeynwhere reg.regionkey = 1;nnselectn  nat.name as Nation,n  avg(cst.acctbal) as average_bookingnfrom tpch.sf100.customer as cstnjoin tpch.sf100.nation as nat on nat.nationkey = cst.nationkeynjoin tpch.sf100.region as reg on reg.regionkey = nat.regionkeynwhere reg.regionkey = 1ngroup by nat.name;n```n\",\"_title\":\"\",\"_margin\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_margin_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_margin_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_padding\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_padding_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_padding_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_element_width\":\"\",\"_element_width_tablet\":\"\",\"_element_width_mobile\":\"\",\"_element_custom_width\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":[]},\"_element_custom_width_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_element_custom_width_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_element_vertical_align\":\"\",\"_element_vertical_align_tablet\":\"\",\"_element_vertical_align_mobile\":\"\",\"_position\":\"\",\"_offset_orientation_h\":\"start\",\"_offset_x\":{\"unit\":\"px\",\"size\":\"0\",\"sizes\":[]},\"_offset_x_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_x_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_x_end\":{\"unit\":\"px\",\"size\":\"0\",\"sizes\":[]},\"_offset_x_end_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_x_end_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_orientation_v\":\"start\",\"_offset_y\":{\"unit\":\"px\",\"size\":\"0\",\"sizes\":[]},\"_offset_y_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_y_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_y_end\":{\"unit\":\"px\",\"size\":\"0\",\"sizes\":[]},\"_offset_y_end_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_offset_y_end_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_z_index\":\"\",\"_z_index_tablet\":\"\",\"_z_index_mobile\":\"\",\"_element_id\":\"\",\"_css_classes\":\"\",\"motion_fx_motion_fx_scrolling\":\"\",\"motion_fx_translateY_effect\":\"\",\"motion_fx_translateY_direction\":\"\",\"motion_fx_translateY_speed\":{\"unit\":\"px\",\"size\":4,\"sizes\":[]},\"motion_fx_translateY_affectedRange\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":0,\"end\":100}},\"motion_fx_translateX_effect\":\"\",\"motion_fx_translateX_direction\":\"\",\"motion_fx_translateX_speed\":{\"unit\":\"px\",\"size\":4,\"sizes\":[]},\"motion_fx_translateX_affectedRange\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":0,\"end\":100}},\"motion_fx_opacity_effect\":\"\",\"motion_fx_opacity_direction\":\"out-in\",\"motion_fx_opacity_level\":{\"unit\":\"px\",\"size\":10,\"sizes\":[]},\"motion_fx_opacity_range\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":20,\"end\":80}},\"motion_fx_blur_effect\":\"\",\"motion_fx_blur_direction\":\"out-in\",\"motion_fx_blur_level\":{\"unit\":\"px\",\"size\":7,\"sizes\":[]},\"motion_fx_blur_range\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":20,\"end\":80}},\"motion_fx_rotateZ_effect\":\"\",\"motion_fx_rotateZ_direction\":\"\",\"motion_fx_rotateZ_speed\":{\"unit\":\"px\",\"size\":1,\"sizes\":[]},\"motion_fx_rotateZ_affectedRange\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":0,\"end\":100}},\"motion_fx_scale_effect\":\"\",\"motion_fx_scale_direction\":\"out-in\",\"motion_fx_scale_speed\":{\"unit\":\"px\",\"size\":4,\"sizes\":[]},\"motion_fx_scale_range\":{\"unit\":\"%\",\"size\":\"\",\"sizes\":{\"start\":20,\"end\":80}},\"motion_fx_transform_origin_x\":\"center\",\"motion_fx_transform_origin_y\":\"center\",\"motion_fx_devices\":[\"desktop\",\"tablet\",\"mobile\"],\"motion_fx_range\":\"\",\"motion_fx_motion_fx_mouse\":\"\",\"motion_fx_mouseTrack_effect\":\"\",\"motion_fx_mouseTrack_direction\":\"\",\"motion_fx_mouseTrack_speed\":{\"unit\":\"px\",\"size\":1,\"sizes\":[]},\"motion_fx_tilt_effect\":\"\",\"motion_fx_tilt_direction\":\"\",\"motion_fx_tilt_speed\":{\"unit\":\"px\",\"size\":4,\"sizes\":[]},\"sticky\":\"\",\"sticky_on\":[\"desktop\",\"tablet\",\"mobile\"],\"sticky_offset\":0,\"sticky_offset_tablet\":\"\",\"sticky_offset_mobile\":\"\",\"sticky_effects_offset\":0,\"sticky_effects_offset_tablet\":\"\",\"sticky_effects_offset_mobile\":\"\",\"sticky_parent\":\"\",\"_animation\":\"\",\"_animation_tablet\":\"\",\"_animation_mobile\":\"\",\"animation_duration\":\"\",\"_animation_delay\":\"\",\"_transform_rotate_popover\":\"\",\"_transform_rotateZ_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateZ_effect_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateZ_effect_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotate_3d\":\"\",\"_transform_rotateX_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateX_effect_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateX_effect_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translate_popover\":\"\",\"_transform_translateX_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateX_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateX_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_popover\":\"\",\"_transform_keep_proportions\":\"yes\",\"_transform_scale_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skew_popover\":\"\",\"_transform_skewX_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skewX_effect_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewX_effect_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_flipX_effect\":\"\",\"_transform_flipY_effect\":\"\",\"_transform_rotate_popover_hover\":\"\",\"_transform_rotateZ_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateZ_effect_hover_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateZ_effect_hover_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotate_3d_hover\":\"\",\"_transform_rotateX_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateX_effect_hover_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateX_effect_hover_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect_hover_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_rotateY_effect_hover_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_perspective_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translate_popover_hover\":\"\",\"_transform_translateX_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateX_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateX_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_translateY_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_popover_hover\":\"\",\"_transform_keep_proportions_hover\":\"yes\",\"_transform_scale_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scale_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleX_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect_hover_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_scaleY_effect_hover_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skew_popover_hover\":\"\",\"_transform_skewX_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skewX_effect_hover_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewX_effect_hover_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect_hover_tablet\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_skewY_effect_hover_mobile\":{\"unit\":\"deg\",\"size\":\"\",\"sizes\":[]},\"_transform_flipX_effect_hover\":\"\",\"_transform_flipY_effect_hover\":\"\",\"_transform_transition_hover\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"motion_fx_transform_x_anchor_point\":\"\",\"motion_fx_transform_x_anchor_point_tablet\":\"\",\"motion_fx_transform_x_anchor_point_mobile\":\"\",\"motion_fx_transform_y_anchor_point\":\"\",\"motion_fx_transform_y_anchor_point_tablet\":\"\",\"motion_fx_transform_y_anchor_point_mobile\":\"\",\"_background_background\":\"\",\"_background_color\":\"\",\"_background_color_stop\":{\"unit\":\"%\",\"size\":0,\"sizes\":[]},\"_background_color_b\":\"#f2295b\",\"_background_color_b_stop\":{\"unit\":\"%\",\"size\":100,\"sizes\":[]},\"_background_gradient_type\":\"linear\",\"_background_gradient_angle\":{\"unit\":\"deg\",\"size\":180,\"sizes\":[]},\"_background_gradient_position\":\"center center\",\"_background_image\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_image_tablet\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_image_mobile\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_position\":\"\",\"_background_position_tablet\":\"\",\"_background_position_mobile\":\"\",\"_background_xpos\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_xpos_tablet\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_xpos_mobile\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_ypos\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_ypos_tablet\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_ypos_mobile\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_attachment\":\"\",\"_background_repeat\":\"\",\"_background_repeat_tablet\":\"\",\"_background_repeat_mobile\":\"\",\"_background_size\":\"\",\"_background_size_tablet\":\"\",\"_background_size_mobile\":\"\",\"_background_bg_width\":{\"unit\":\"%\",\"size\":100,\"sizes\":[]},\"_background_bg_width_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_background_bg_width_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_background_video_link\":\"\",\"_background_video_start\":\"\",\"_background_video_end\":\"\",\"_background_play_once\":\"\",\"_background_play_on_mobile\":\"\",\"_background_privacy_mode\":\"\",\"_background_video_fallback\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_slideshow_gallery\":[],\"_background_slideshow_loop\":\"yes\",\"_background_slideshow_slide_duration\":5000,\"_background_slideshow_slide_transition\":\"fade\",\"_background_slideshow_transition_duration\":500,\"_background_slideshow_background_size\":\"\",\"_background_slideshow_background_size_tablet\":\"\",\"_background_slideshow_background_size_mobile\":\"\",\"_background_slideshow_background_position\":\"\",\"_background_slideshow_background_position_tablet\":\"\",\"_background_slideshow_background_position_mobile\":\"\",\"_background_slideshow_lazyload\":\"\",\"_background_slideshow_ken_burns\":\"\",\"_background_slideshow_ken_burns_zoom_direction\":\"in\",\"_background_hover_background\":\"\",\"_background_hover_color\":\"\",\"_background_hover_color_stop\":{\"unit\":\"%\",\"size\":0,\"sizes\":[]},\"_background_hover_color_b\":\"#f2295b\",\"_background_hover_color_b_stop\":{\"unit\":\"%\",\"size\":100,\"sizes\":[]},\"_background_hover_gradient_type\":\"linear\",\"_background_hover_gradient_angle\":{\"unit\":\"deg\",\"size\":180,\"sizes\":[]},\"_background_hover_gradient_position\":\"center center\",\"_background_hover_image\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_hover_image_tablet\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_hover_image_mobile\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_hover_position\":\"\",\"_background_hover_position_tablet\":\"\",\"_background_hover_position_mobile\":\"\",\"_background_hover_xpos\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_xpos_tablet\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_xpos_mobile\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_ypos\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_ypos_tablet\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_ypos_mobile\":{\"unit\":\"px\",\"size\":0,\"sizes\":[]},\"_background_hover_attachment\":\"\",\"_background_hover_repeat\":\"\",\"_background_hover_repeat_tablet\":\"\",\"_background_hover_repeat_mobile\":\"\",\"_background_hover_size\":\"\",\"_background_hover_size_tablet\":\"\",\"_background_hover_size_mobile\":\"\",\"_background_hover_bg_width\":{\"unit\":\"%\",\"size\":100,\"sizes\":[]},\"_background_hover_bg_width_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_background_hover_bg_width_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_background_hover_video_link\":\"\",\"_background_hover_video_start\":\"\",\"_background_hover_video_end\":\"\",\"_background_hover_play_once\":\"\",\"_background_hover_play_on_mobile\":\"\",\"_background_hover_privacy_mode\":\"\",\"_background_hover_video_fallback\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_background_hover_slideshow_gallery\":[],\"_background_hover_slideshow_loop\":\"yes\",\"_background_hover_slideshow_slide_duration\":5000,\"_background_hover_slideshow_slide_transition\":\"fade\",\"_background_hover_slideshow_transition_duration\":500,\"_background_hover_slideshow_background_size\":\"\",\"_background_hover_slideshow_background_size_tablet\":\"\",\"_background_hover_slideshow_background_size_mobile\":\"\",\"_background_hover_slideshow_background_position\":\"\",\"_background_hover_slideshow_background_position_tablet\":\"\",\"_background_hover_slideshow_background_position_mobile\":\"\",\"_background_hover_slideshow_lazyload\":\"\",\"_background_hover_slideshow_ken_burns\":\"\",\"_background_hover_slideshow_ken_burns_zoom_direction\":\"in\",\"_background_hover_transition\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_border_border\":\"\",\"_border_width\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_width_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_width_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_color\":\"\",\"_border_radius\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_radius_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_radius_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_box_shadow_box_shadow_type\":\"\",\"_box_shadow_box_shadow\":{\"horizontal\":0,\"vertical\":0,\"blur\":10,\"spread\":0,\"color\":\"rgba(0,0,0,0.5)\"},\"_box_shadow_box_shadow_position\":\" \",\"_border_hover_border\":\"\",\"_border_hover_width\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_hover_width_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_hover_width_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_hover_color\":\"\",\"_border_radius_hover\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_radius_hover_tablet\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_border_radius_hover_mobile\":{\"unit\":\"px\",\"top\":\"\",\"right\":\"\",\"bottom\":\"\",\"left\":\"\",\"isLinked\":true},\"_box_shadow_hover_box_shadow_type\":\"\",\"_box_shadow_hover_box_shadow\":{\"horizontal\":0,\"vertical\":0,\"blur\":10,\"spread\":0,\"color\":\"rgba(0,0,0,0.5)\"},\"_box_shadow_hover_box_shadow_position\":\" \",\"_border_hover_transition\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_switch\":\"\",\"_mask_shape\":\"circle\",\"_mask_image\":{\"url\":\"\",\"id\":\"\",\"size\":\"\"},\"_mask_notice\":\"\",\"_mask_size\":\"contain\",\"_mask_size_tablet\":\"\",\"_mask_size_mobile\":\"\",\"_mask_size_scale\":{\"unit\":\"%\",\"size\":100,\"sizes\":[]},\"_mask_size_scale_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_size_scale_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_position\":\"center center\",\"_mask_position_tablet\":\"\",\"_mask_position_mobile\":\"\",\"_mask_position_x\":{\"unit\":\"%\",\"size\":0,\"sizes\":[]},\"_mask_position_x_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_position_x_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_position_y\":{\"unit\":\"%\",\"size\":0,\"sizes\":[]},\"_mask_position_y_tablet\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_position_y_mobile\":{\"unit\":\"px\",\"size\":\"\",\"sizes\":[]},\"_mask_repeat\":\"no-repeat\",\"_mask_repeat_tablet\":\"\",\"_mask_repeat_mobile\":\"\",\"hide_desktop\":\"\",\"hide_tablet\":\"\",\"hide_mobile\":\"\",\"_attributes\":\"\",\"custom_css\":\"\"},\"defaultEditSettings\":{\"defaultEditRoute\":\"content\"},\"elements\":[],\"widgetType\":\"elementor-syntax-highlighter\",\"editSettings\":{\"defaultEditRoute\":\"content\",\"panel\":{\"activeTab\":\"content\",\"activeSection\":\"content_section\"}},\"htmlCache\":\"tt&lt;div class=\"elementor-widget-container\"&gt;nttt&lt;pre&gt;&lt;code class='language-python'&gt;```sqln CREATE SCHEMA hive.logistic WITH (location = 'gs:\/\/starburst-bluetab-test\/logistic');nnCREATE VIEW &amp;quot;hive&amp;quot;.&amp;quot;logistic&amp;quot;.&amp;quot;shipping_priority&amp;quot; SECURITY DEFINER ASnSELECTn  l.orderkeyn, SUM((l.extendedprice * (1 - l.discount))) revenuen, o.orderdaten, o.shipprioritynFROMn  tpch.tiny.customer cn, tpch.tiny.orders on, tpch.tiny.lineitem lnWHERE ((c.mktsegment = 'BUILDING') AND (c.custkey = o.custkey) AND (l.orderkey = o.orderkey))nGROUP BY l.orderkey, o.orderdate, o.shipprioritynORDER BY revenue DESC, o.orderdate ASC;nnnCREATE VIEW &amp;quot;hive&amp;quot;.&amp;quot;logistic&amp;quot;.&amp;quot;minimum_cost_supplier&amp;quot; SECURITY DEFINER ASnSELECTn  s.acctbaln, s.name SupplierNamen, n.name Nationn, p.partkeyn, p.mfgrn, s.addressn, s.phonen, s.commentnFROMn  tpch.tiny.part pn, tpch.tiny.supplier sn, tpch.tiny.partsupp psn, tpch.tiny.nation nn, tpch.tiny.region rnWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (p.size = 15) AND (p.type LIKE '%BRASS') AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE') AND (ps.supplycost = (SELECT MIN(ps.supplycost)nFROMn  tpch.tiny.partsupp psn, tpch.tiny.supplier sn, tpch.tiny.nation nn, tpch.tiny.region rnWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE'))n)))nORDER BY s.acctbal DESC, n.name ASC, s.name ASC, p.partkey ASC;nnnnselectn  cst.name as CustomerName,n  cst.address,n  cst.phone,n  cst.nationkey,n  cst.acctbal as BookedOrders,n  cst.mktsegment,n  nat.name as Nation,n  reg.name as Regionnfrom tpch.sf1.customer as cstnjoin tpch.sf1.nation as nat on nat.nationkey = cst.nationkeynjoin tpch.sf1.region as reg on reg.regionkey = nat.regionkeynwhere reg.regionkey = 1;nnselectn  nat.name as Nation,n  avg(cst.acctbal) as average_bookingnfrom tpch.sf100.customer as cstnjoin tpch.sf100.nation as nat on nat.nationkey = cst.nationkeynjoin tpch.sf100.region as reg on reg.regionkey = nat.regionkeynwhere reg.regionkey = 1ngroup by nat.name;n```n &lt;\/code&gt;&lt;\/pre&gt;&lt;script&gt;nif (!document.getElementById('syntaxed-prism')) {ntvar my_awesome_script = document.createElement('script');ntmy_awesome_script.setAttribute('src','https:\/\/bluetab.net\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');ntmy_awesome_script.setAttribute('id','syntaxed-prism');ntdocument.body.appendChild(my_awesome_script);n} else {ntwindow.Prism &amp;&amp; Prism.highlightAll();n}n&lt;\/script&gt;tt&lt;\/div&gt;ntt\"}]} <\/code><\/pre>\n<p>En esta prueba lo m\u00e1s relevante es que vamos a escribir los datos de la tablas customer(15000000 rows), orders(150000000 rows), supplier(1000000 rows), nation(25 rows) y region(5 rows) en nuestro bucket de GCS.<\/p>\n<p>Como comentamos anteriormente, Starburst no solo es una herramienta que te permite lanzar consultas para analizar datos, sino que tambi\u00e9n te puede ayudar en las migraciones de datos de tu compa\u00f1\u00eda, volcando la informaci\u00f3n de tu base de datos a tu plataforma de la nube. Una cosa muy importante a tener en cuenta es que Starburst te permite trabajar con distintos tipos de fichero, pudiendo escribir tus tablas finales en ORC, Parquet o formatos como Delta o Hudi d\u00e1ndote una libertad muy amplia en las migraciones al cloud.<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"321\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10-1024x321.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10-1024x321.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10-300x94.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10-768x241.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10-1536x482.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image10.png 1898w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>Como \u00faltima prueba para ver que todo est\u00e1 funcionando correctamente, vamos a lanzar una consulta para federar distintos datos de diversas fuentes. En nuestro caso, federaremos datos de la anterior tabla que hemos creado en Google Cloud Storage llamada <b>customer <\/b>con una tabla llamada <b>nation,<\/b> que nos crearemos en el PostgreSQL que hemos configurado en nuestro despliegue, y la tabla <b>region<\/b> que est\u00e1 en el esquema tcph. Esta consulta la podemos encontrar en el archivo `federate.sql`:<\/p>\n<pre><code class=\"language-python\">create schema postgres.logistic;\ncreate table postgres.logistic.nation as select * from tpch.sf1.nation;\nselect\n  cst.name as CustomerName,\n  cst.address,\n  cst.phone,\n  cst.nationkey,\n  cst.acctbal as BookedOrders,\n  cst.mktsegment,\n  nat.name as Nation,\n  reg.name as Region\nfrom hive.datalake.customer as cst\njoin postgres.logistic.nation as nat on nat.nationkey = cst.nationkey\njoin tpch.sf1.region as reg on reg.regionkey = nat.regionkey\nwhere reg.regionkey = 1;\n <\/code><\/pre>\n<p>Este tipo de consultas es uno de los puntos fuertes que tiene Starburst, poder federar consultas que se encuentren en distintos silos de informaci\u00f3n sin la necesidad de migrar los datos y pudiendo atacar a distintos Cloud o a informaci\u00f3n que se tenga en el onpremise.&nbsp;<\/p>\n<p>Una vez que hemos probado que tanto las consultas como la escritura en GCS funcionan correctamente, vamos a realizar unos test de performance para simular usuarios en paralelo y ver como autoescala nuestra plataforma. Vamos a configurar JMeter para estas pruebas. Para ello hemos tenido que configurar el conector jdbc de trino para que mande consultas a nuestro cluster.<\/p>\n<p>Vamos a simular 20 usuarios en paralelo, y cada uno lanzar\u00e1 una secuencia de 5 consultas. Esto significa que habr\u00e1 20 consultas en paralelo al mismo tiempo, simulando un escenario real, ya que generalmente no se lanzar\u00e1n consultas de todos los usuarios en el mismo momento. Las consultas que vamos a ejecutar son las siguiente:<\/p>\n<pre><code class=\"language-python\">```sql\nselect\n  cst.name as CustomerName,\n  cst.address,\n  cst.phone,\n  cst.nationkey,\n  cst.acctbal as BookedOrders,\n  cst.mktsegment,\n  nat.name as Nation,\n  reg.name as Region\nfrom tpch.sf1.customer as cst\njoin tpch.sf1.nation as nat on nat.nationkey = cst.nationkey\njoin tpch.sf1.region as reg on reg.regionkey = nat.regionkey\nwhere reg.regionkey = 1;\nSELECT\n  s.acctbal\n, s.name SupplierName\n, n.name Nation\n, p.partkey\n, p.mfgr\n, s.address\n, s.phone\n, s.comment\nFROM\n  tpch.tiny.part p\n, tpch.tiny.supplier s\n, tpch.tiny.partsupp ps\n, tpch.tiny.nation n\n, tpch.tiny.region r\nWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (p.size = 15) AND (p.type LIKE '%BRASS') AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE') AND (ps.supplycost = (SELECT MIN(ps.supplycost)\nFROM\n  tpch.tiny.partsupp ps\n, tpch.tiny.supplier s\n, tpch.tiny.nation n\n, tpch.tiny.region r\nWHERE ((p.partkey = ps.partkey) AND (s.suppkey = ps.suppkey) AND (s.nationkey = n.nationkey) AND (n.regionkey = r.regionkey) AND (r.name = 'EUROPE'))\n)))\nORDER BY s.acctbal DESC, n.name ASC, s.name ASC, p.partkey ASC;\nSELECT\ncount(*)\nFROM\n  tpch.sf1.customer c\n, tpch.sf1.orders o\n, tpch.sf1.lineitem l\nWHERE ((c.mktsegment = 'BUILDING') AND (c.custkey = o.custkey) AND (l.orderkey = o.orderkey))\nGROUP BY l.orderkey, o.orderdate, o.shippriority\nORDER BY o.orderdate ASC;\n```\n <\/code><\/pre>\n<p><img decoding=\"async\" width=\"1024\" height=\"325\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3-1024x325.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3-1024x325.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3-300x95.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3-768x244.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3-1536x487.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image3.png 1837w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>Si nos fijamos, en nuestro cluster de Kubernetes podemos ver que se est\u00e1n levantando m\u00e1s workers de Starburst por el momento de alta demanda en nuestra simulaci\u00f3n:<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"143\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image7-1024x143.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image7-1024x143.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image7-300x42.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image7-768x107.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image7.png 1271w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><br \/>\n<img decoding=\"async\" width=\"750\" height=\"191\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image5.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image5.png 750w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image5-300x76.png 300w\" sizes=\"(max-width: 750px) 100vw, 750px\"><\/p>\n<p>Esto es una de las caracter\u00edsticas m\u00e1s c\u00f3modas e importantes que nos da Starburst, ya que hace que nuestra plataforma de anal\u00edtica de datos sea 100% el\u00e1stica y podamos ir adapt\u00e1ndonos a los picos de demanda que tengamos.<\/p>\n<h2>M\u00e9tricas<\/h2>\n<p>Por \u00faltimo, Starburst nos proporciona una interfaz donde visualizar ciertas m\u00e9tricas del consumo de nuestro cluster, como puede ser la memoria, la cpu o las consultas realizadas en tiempo real en nuestro cluster.<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"412\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9-1024x412.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9-1024x412.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9-300x121.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9-768x309.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9-1536x618.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image9.png 1842w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>Adem\u00e1s de estas m\u00e9tricas, hemos a\u00f1adido tambi\u00e9n a nuestra configuraci\u00f3n el despliegue de Prometheus y Grafana para integrarnos con las herramientas m\u00e1s comunes dentro de cualquier organizaci\u00f3n. Las m\u00e9tricas que hemos a\u00f1adido a Grafana son consumo de memoria de nuestro cluster de Starburst, consultas realizadas por los usuarios, consultas con errores, memoria total de nuestro cluster de Kubernetes y Workers activos. Una vez integradas dichas m\u00e9tricas, el dashboard que tendr\u00edamos ser\u00eda el siguiente:<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"594\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8-1024x594.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8-1024x594.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8-300x174.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8-768x446.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8-1536x891.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2023\/05\/image8.png 1822w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>Una vez integrado con Grafana, podr\u00edamos crearnos alertas de env\u00edo de mensajes por si hay alg\u00fan problema en nuestro cluster de Starburst, y as\u00ed tener todo el flujo de operaciones cubierto para evitarnos dolores de cabeza si hubiera alg\u00fan tipo de incidencia o indisponibilidad.<\/p>\n<p>El dashboard est\u00e1 publicado en Grafana<a href=\"\/#referencias\">[14]<\/a> para que cualquier persona pueda hacer uso de \u00e9l.<\/p>\n<h2>Conclusiones<\/h2>\n<p>Desde hace ya unos a\u00f1os, las grandes corporaciones se enfrentan a un desaf\u00edo com\u00fan cuando intentan compartir y analizar informaci\u00f3n entre departamentos ya que cada departamento almacena y gestiona sus datos de manera aislada. Estos silos dificultan el acceso y la integraci\u00f3n de datos, lo que impide una visi\u00f3n completa y unificada de la informaci\u00f3n empresarial. La falta de interoperabilidad entre los silos de datos obstaculiza la toma de decisiones informada, ralentiza los procesos anal\u00edticos y limita la capacidad de las organizaciones para obtener una ventaja competitiva. Si tu organizaci\u00f3n se encuentra en una situaci\u00f3n similar, Starburst es tu herramienta.<\/p>\n<p>Starburst te facilita el acceso y an\u00e1lisis a todos estos silos de informaci\u00f3n y da la capacidad de federar datos de diversas fuentes y ubicaciones, ya sea datos en el Cloud o en tu datacenter onpremise. Permite realizar consultas en tiempo real sin necesidad de mover o transformar los datos previamente. Esto agiliza el proceso anal\u00edtico y brinda a las organizaciones una visi\u00f3n 360 de sus datos. Adem\u00e1s, no solo te ayuda a la hora de consultar datos de distintas fuentes, sino que tambi\u00e9n te puede ayudar en tus migraciones al Cloud, ya que te permite consultar cualquier origen y volcar dicha informaci\u00f3n en un almacenamiento como S3 o GCS en formato de ficheros abierto, como puede ser Parquet.<\/p>\n<p>Una de las principales ventajas de Starburst, es que te permite desplegar la infraestructura en Kubernetes para aprovechar as\u00ed todo su potencial. Kubernetes te da la capacidad de adaptarse din\u00e1micamente a la carga de trabajo. Con esta funci\u00f3n, los cl\u00fasteres de Starburst pueden aumentar o disminuir autom\u00e1ticamente el n\u00famero de Workers seg\u00fan la demanda. Esto permite optimizar el uso de recursos y garantizar un rendimiento \u00f3ptimo, ya que los pods adicionales se crean cuando la carga aumenta y se eliminan cuando disminuye. Esto dentro de cualquier organizaci\u00f3n es un punto muy importante, ya que mejora la eficiencia operativa al minimizar el tiempo de inactividad y los costos innecesarios, al tiempo que asegura una disponibilidad constante y una respuesta \u00e1gil a los picos de trabajo. Adem\u00e1s, una cosa a tener en cuenta es que puedes realizar la instalaci\u00f3n de Starburst tanto en cualquiera de los Cloud, como en onpremise.<\/p>\n<p>Adem\u00e1s, tambi\u00e9n te permite tener un roleado y gobierno de los usuarios dentro de tu plataforma, dando una granularidad a nivel de acceso a los datos a cada usuario, permiti\u00e9ndote crear roles para ciertos esquemas, tablas o hasta columnas y filas dentro de una tabla.<\/p>\n<p>Los que trabajamos con datos sabemos de la dificultad de trabajar con multitud de fuentes de datos, entornos diversos, herramientas de todo tipo, etc. Uno de los puntos m\u00e1s diferenciales de Starburst es tener la capacidad de consultar los datos desde su almacenamiento, eliminando duplicidad de informaci\u00f3n, pudiendo as\u00ed tener una mejor eficiencia en cuanto al storage, y facilitando tambi\u00e9n el gobierno de estos datos.<\/p>\n<p>En conclusi\u00f3n, Starburst es una herramienta a tener en cuenta si quieres llevar a tu organizaci\u00f3n al siguiente nivel en el mundo de los datos, o si te est\u00e1s planteando una estrategia de datos con una visi\u00f3n y una filosof\u00eda m\u00e1s orientada al data mesh.<\/p>\n<h2>Referencias<\/h2>\n<p>[1] Qu\u00e9 es Starburst.[<a href=\"https:\/\/www.starburst.io\/\">link<\/a>]&nbsp;<\/p>\n<p>[2] Qu\u00e9 es Trino. [<a href=\"https:\/\/trino.io\/\">link<\/a>]<\/p>\n<p>[3] Principios del Data Mesh. [<a href=\"https:\/\/martinfowler.com\/articles\/data-mesh-principles.html\">link<\/a>]<\/p>\n<p>[4] Introducci\u00f3n&nbsp; a DBT. [<a href=\"https:\/\/www.getdbt.com\/\">link<\/a>]<\/p>\n<p>[5] Introducci\u00f3n a Jupyter Notebook. [<a href=\"https:\/\/jupyter.org\/\">link<\/a>]<\/p>\n<p>[6] Introducci\u00f3n a Power BI. [<a href=\"https:\/\/powerbi.microsoft.com\/en-au\/\">link<\/a>]<\/p>\n<p>[7] Qu\u00e9 es Prometheus.. [<a href=\"https:\/\/prometheus.io\/\">link<\/a>]<\/p>\n<p>[8] Qu\u00e9 es Grafana. [<a href=\"https:\/\/grafana.com\/\">link<\/a>]<\/p>\n<p>[9] Qu\u00e9 es Terraform. [<a href=\"https:\/\/developer.hashicorp.com\/terraform\">link<\/a>]<\/p>\n<p>[10] Qu\u00e9 es Jmeter.[<a href=\"https:\/\/jmeter.apache.org\/\">link<\/a>]<\/p>\n<p>[11] M\u00f3dulo de GKE.[<a href=\"https:\/\/github.com\/lucasberlang\/gcp-gke\">link<\/a>]<\/p>\n<p>[12] M\u00f3dulo de VPC.[<a href=\"https:\/\/github.com\/lucasberlang\/gcp-network\">link<\/a>]<\/p>\n<p>[13] Qu\u00e9 es TPCH.[<a href=\"https:\/\/www.tpc.org\/tpch\/\">link<\/a>]<\/p>\n<p>[14] Dashboard Grafana.[<a href=\"https:\/\/grafana.com\/grafana\/dashboards\/18767-starburst-k8s\/\">link<\/a>]<\/p>\n<p>[15] Repositorio de Github con el despliegue.[<a href=\"https:\/\/github.com\/lucasberlang\/starburst-deploy-gcp\">link<\/a>]<\/p>\n<h4>\n\t\t\t\tNavegaci\u00f3n<\/h4>\n<figure><a href=\"https:\/\/www.linkedin.com\/in\/lucascalvoberlanga\/\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2021\/09\/lucas-150x150.png\" alt=\"\" loading=\"lazy\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/in\/lucascalvoberlanga\/\" target=\"_blank\" rel=\"noopener\">Lucas Calvo<\/a><\/h4>\n<p>Cloud Engineer<\/p>\n<h5>\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\n<p><a href=\"\/\" role=\"button\"><br \/>\nDESCUBRE BLUETAB<br \/>\n<\/a><\/p>\n<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/p>\n<h5>DATA STRATEGY<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-strategy\/\"><\/a><a href=\"\/soluciones\/data-strategy\/\"><\/a><a href=\"\/soluciones\/data-strategy\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/p>\n<h5>DATA FABRIC<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-fabric\/\"><\/a><a href=\"\/soluciones\/data-fabric\/\"><\/a><a href=\"\/soluciones\/data-fabric\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/p>\n<h5>AUGMENTED ANALYTICS<\/h5>\n<p><\/a><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><a href=\"\/soluciones\/augmented-analytics\/\"><\/a><a href=\"\/soluciones\/augmented-analytics\/\">\t\t\t\t\t\t<\/a><\/p>\n<p>Te puede interesar<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lucas Calvo Cloud Engineer Introducci\u00f3n En este nuevo art\u00edculo vamos a hablar de uno de nuestros partners: Starburst[1]. Starburst es la versi\u00f3n empresarial de Trino[2] realizando nuevas integraciones, mejoras de rendimiento, una capa de seguridad y restando complejidad a la gesti\u00f3n con una interfaz de usuario muy f\u00e1cil de usar y que te permite realizar [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":20829,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,29,30],"tags":[],"class_list":["post-15253","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-es","category-practices-en","category-tech-en"],"acf":[],"jetpack_featured_media_url":"https:\/\/bluetab.org\/wp-content\/uploads\/2023\/05\/9.png","_links":{"self":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts\/15253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/comments?post=15253"}],"version-history":[{"count":0,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/posts\/15253\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/media\/20829"}],"wp:attachment":[{"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/media?parent=15253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/categories?post=15253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.org\/en\/wp-json\/wp\/v2\/tags?post=15253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}