IoT industrial

Unified Namespace vs data lake: ¿complementarios o rivales?

Un Unified Namespace y un data lake resuelven problemas distintos. Esta comparativa explica el estado en tiempo real frente a la analítica histórica, dónde encaja cada uno y cómo un simple suscriptor conecta ambos.

Ilustración comparativa de Unified Namespace vs data lake con el estado vivo de la planta fluyendo hacia almacenamiento a largo plazo
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

El debate Unified Namespace vs data lake suele surgir cuando un equipo de IT ya tiene un data lake y un equipo de OT propone un UNS, y ambos se preguntan si uno vuelve redundante al otro. En este artículo aprenderás para qué sirve realmente cada arquitectura, dónde se solapan, por qué funcionan mejor juntas y cómo llevar datos desde un namespace basado en MQTT a un almacenamiento de tipo lake con un suscriptor pequeño y fiable.

Dos preguntas distintas

La forma más sencilla de separarlos es por la pregunta que responde cada uno.

Un Unified Namespace responde a "¿qué está pasando ahora mismo?". Es un hub orientado a eventos, normalmente un broker MQTT, donde cada máquina y sistema publica su estado actual bajo un árbol de topics estructurado. Los consumidores se suscriben y reaccionan en milisegundos o segundos. El namespace conserva el último valor de cada topic, normalmente como retained message, y poco más.

Un data lake responde a "¿qué pasó y qué significa?". Es una capa de almacenamiento, normalmente almacenamiento de objetos con archivos en formatos abiertos como Parquet, con motores de consulta por encima. Guarda meses o años de datos brutos y refinados para que analistas y científicos de datos puedan cruzar los datos de producción con los de calidad, mantenimiento, ERP y energía.

Uno es un sistema nervioso; el otro, la memoria a largo plazo. Preguntar cuál elegir es como preguntar si una planta necesita su SCADA o su base de datos de informes.

Unified Namespace vs data lake de un vistazo

Dimensión Unified Namespace Data lake
Propósito principal Estado y eventos en tiempo real Analítica histórica y ML
Horizonte temporal Ahora (último valor) De meses a años
Patrón de acceso Publicación y suscripción, push Consultas por lotes o interactivas, pull
Latencia De milisegundos a segundos Son aceptables minutos u horas
Forma de los datos Mensajes pequeños por topic Grandes archivos y tablas columnares
Estructura Jerarquía de topics, a menudo ISA-95 Esquemas, tablas, particiones
Consumidores típicos HMI, MES, alertas, dashboards, otras máquinas Herramientas de BI, notebooks, pipelines de ML
Propiedad Normalmente OT o conjunta OT/IT Normalmente IT o el equipo de plataforma de datos
Impacto de un fallo Las operaciones en vivo pierden visibilidad Los informes y modelos quedan desactualizados

Lee cualquier fila y la conclusión es la misma: son capas, no alternativas.

De dónde viene la confusión

Hay tres razones comprensibles por las que se les trata como rivales.

Primero, ambos prometen acabar con los silos de datos. Un UNS lo hace dando a todos los sistemas un único lugar donde publicar y suscribirse; un data lake lo hace reuniendo los datos de todos los sistemas en una sola capa de almacenamiento. Mismo objetivo, distinta escala temporal.

Segundo, algunos fabricantes difuminan la frontera. Los brokers con persistencia integrada y los lakes con ingesta en streaming se acercan al otro lado. Esas funciones existen, pero estirar demasiado cualquiera de las dos herramientas crea problemas: los brokers no están diseñados para responder "temperatura media por turno el último trimestre" y los lakes no están diseñados para enviar una señal de parada a una línea en menos de un segundo.

Tercero, los primeros proyectos UNS a veces omiten por completo el almacenamiento y luego descubren que operaciones quiere tendencias e ingeniería quiere análisis de causa raíz. La solución no es abandonar el UNS, sino añadir un consumidor de almacenamiento.

Cómo encajan

El patrón que funciona es sencillo: el UNS es la fuente única de los datos en vivo y el data lake es uno de sus suscriptores.

PLCs / gateways / Sparkplug edge nodes
              |
              v
   Unified namespace (MQTT broker, ISA-95 topics)
     |            |              |               |
     v            v              v               v
 Dashboards    Alerting     Historian      Lake ingestion
                            (hot data)     (raw files, then
                                            curated tables)

Ventajas de esta disposición:

  • Una integración por fuente. Un gateway de PLC publica una vez; el lake no necesita su propio conector hacia cada máquina.
  • El contexto viene gratis. Como los topics siguen la jerarquía ISA-95, el proceso de ingesta puede convertir sitio, área, línea y máquina en columnas sin tabla de correspondencias.
  • Evolución independiente. Puedes sustituir la plataforma del lake sin tocar la planta y añadir nuevos datos de planta sin cambiar el pipeline del lake.
  • Rutas caliente y fría. Un historian guarda los datos recientes de alta resolución para los operadores; el lake guarda la cola larga para la analítica. Nuestra guía sobre el historian MQTT compara las opciones de historian.

Si partes de cero, construye primero el namespace. Nuestro tutorial sobre cómo construir un Unified Namespace te guía paso a paso, y la ingesta hacia el lake que verás a continuación se conecta directamente a él.

Llevar datos del UNS a un data lake

La ingesta es simplemente otro cliente MQTT. El script siguiente se suscribe a una rama del namespace y escribe cada mensaje como una línea JSON en archivos particionados por fecha y hora, una disposición de landing zone habitual en un lake. Un proceso programado puede convertir después los archivos a Parquet y cargar tablas depuradas.

Supone topics con la forma <prefix>/<site>/<area>/<line>/<machine>/<kind> y payloads JSON. Instala el cliente con pip install "paho-mqtt>=2.0".

import json
import os
from datetime import datetime, timezone

import paho.mqtt.client as mqtt

BROKER = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "1883"))
PREFIX = os.getenv("UNS_PREFIX", "connectmq/demo/k4p9")
LANDING = os.getenv("LANDING_DIR", "./landing/uns")

def on_connect(client, userdata, flags, reason_code, properties):
    print("ingestion connected:", reason_code)
    client.subscribe(f"{PREFIX}/+/+/+/+/telemetry", qos=1)

def on_message(client, userdata, msg):
    if msg.retain:
        return  # omite la reproducción de retenidos para que los reinicios no dupliquen filas
    levels = msg.topic[len(PREFIX) + 1:].split("/")
    if len(levels) != 5:
        return
    site, area, line, machine, _ = levels
    try:
        data = json.loads(msg.payload)
    except ValueError:
        print("skipping non-JSON payload on", msg.topic)
        return
    received = datetime.now(timezone.utc)
    row = {
        "received_at": received.isoformat(),
        "site": site, "area": area, "line": line, "machine": machine,
        **data,
    }
    folder = os.path.join(LANDING, f"date={received:%Y-%m-%d}", f"hour={received:%H}")
    os.makedirs(folder, exist_ok=True)
    with open(os.path.join(folder, f"{site}.jsonl"), "a", encoding="utf-8") as f:
        f.write(json.dumps(row) + "\n")

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="lake-ingest-k4p9")
if os.getenv("MQTT_USERNAME"):
    client.username_pw_set(os.getenv("MQTT_USERNAME"), os.getenv("MQTT_PASSWORD"))
    client.tls_set()
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, PORT, keepalive=60)
client.loop_forever()

Después, convierte un día de archivos de landing a Parquet con pandas (pip install pandas pyarrow):

import glob
import pandas as pd

files = glob.glob("./landing/uns/date=2026-10-16/hour=*/*.jsonl")
df = pd.concat((pd.read_json(f, lines=True) for f in files), ignore_index=True)
df.to_parquet("./curated/telemetry_2026-10-16.parquet", index=False)
print(df.groupby(["site", "line", "machine"])["temperature_c"].mean())

Apunta el directorio de landing a una carpeta que se sincronice con tu almacenamiento de objetos o sustituye la escritura en archivo por la llamada de subida del SDK de tu nube. Prueba primero contra el servidor MQTT público gratuito con datos simulados; es solo para pruebas y cualquiera puede leerlo, así que los datos reales de planta deben ir a un broker privado con credenciales.

Cómo hacer fiable la ingesta

Un suscriptor de landing zone es sencillo, lo cual es bueno, pero planifica estos detalles:

  1. Usa una sesión persistente. Con un client ID fijo, clean_session=False (MQTT 3.1.1) o un intervalo de expiración de sesión (MQTT 5), el broker encola los mensajes QoS 1 durante cortes breves de la ingesta.
  2. Escala con suscripciones compartidas. En MQTT 5, varios workers de ingesta pueden compartir una suscripción como $share/lake/<prefix>/# para que cada mensaje se procese una sola vez.
  3. Registra ambos timestamps. Conserva el timestamp de origen del payload y la hora de recepción para poder detectar datos tardíos o almacenados en búfer.
  4. No confíes al broker el histórico. La cola de un broker cubre minutos de desconexión, no días. Los cortes largos requieren búfer en el edge, por ejemplo store-and-forward.
  5. Versiona el esquema. Añade a los payloads un campo de versión de esquema para que el lake pueda gestionar los cambios.

En ConnectMQ, las suscripciones compartidas están disponibles en el plan Serverless de pago y superiores, y el plan gratuito admite QoS hasta 1, que es lo que necesita este patrón de ingesta. ConnectMQ no incluye puentes integrados hacia bases de datos o data lakes; el patrón honesto y flexible es exactamente este, un suscriptor externo que tú controlas.

¿Cuál deberías construir primero?

Si no tienes ninguno, ya sea en una mina en Chile o en una planta química en Tarragona, empieza con el namespace para una línea y añade después el almacenamiento como primer consumidor. La visibilidad en tiempo real aporta valor rápidamente y más adelante proporciona al lake una entrada limpia y contextualizada. Si ya tienes un lake alimentado por exportaciones por lotes desde SCADA o MES, añadir un UNS te da datos más frescos y elimina conectores ad hoc; apunta la ingesta del lake al namespace y retira las exportaciones una a una.

Para la arquitectura más amplia, nuestra guía de MQTT para IoT industrial muestra dónde encajan ambos junto a PLC, gateways y SCADA.

Conecta tu Unified Namespace al almacenamiento con ConnectMQ

El namespace solo alimenta el lake de forma fiable si el broker que está en medio es robusto. ConnectMQ es un broker MQTT gestionado, un broker MQTT en la nube con MQTT 3.1.1 y 5.0, TLS, retained messages y suscripciones compartidas en los planes de pago, además de detección de topics ISA-95 en el portal. Crea un broker en el plan gratuito Serverless en app.connectmq.com, sin tarjeta de crédito, y ejecuta hoy mismo tu suscriptor de ingesta contra él.

Preguntas frecuentes

¿Puede un Unified Namespace sustituir a un data lake?

No. Un UNS contiene el estado actual y transmite eventos; no está diseñado para el almacenamiento a largo plazo ni para consultas analíticas. Funciona mejor como la fuente que alimenta un lake.

¿Puede un data lake sustituir a un Unified Namespace?

No para el uso en tiempo real. Los lakes están optimizados para grandes consultas históricas, no para enviar valores en vivo a HMI, alertas y otras máquinas en cuestión de segundos.

¿Cómo llevo datos MQTT a un data lake?

Ejecuta un suscriptor, como un script de Python, Telegraf o Node-RED, que consuma los topics del namespace y escriba archivos o filas en tu almacenamiento. Particiona por fecha y conserva los niveles ISA-95 como columnas.

¿Deben suscribirse al UNS tanto el historian como el data lake?

A menudo, sí. El historian sirve a los operadores tendencias recientes de alta resolución, mientras que el lake conserva los datos a largo plazo para analítica y machine learning.

Artículos relacionados

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.