Tema representativo de entrevista

Entrevista de Ingeniería de Datos: ¿Cómo diseñarías un Apache Iceberg REST Catalog?

DatosDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Tu lakehouse debe dar servicio a Spark, Trino y clientes en otros lenguajes. ¿Cómo diseñarías un Apache Iceberg REST Catalog que mantenga consistentes los metadatos, haga que los commits sean reintentables y controle los riesgos de autorización y caché?

Planteamiento y alcance

Tu equipo almacena los datos de las tablas en almacenamiento de objetos, mientras que el cómputo se expande de Spark a Trino y a un servicio interno. El antiguo enfoque de Hive Metastore requiere múltiples implementaciones de clientes, y las actualizaciones concurrentes de metadatos pueden sobrescribirse entre sí. Diseña un Apache Iceberg REST Catalog, cubriendo lo que administra, los commits de snapshots, la autenticación y autorización, y la recuperación ante fallas.

La especificación de Apache Iceberg REST Catalog expone las operaciones del catálogo a través de una API HTTP independiente del lenguaje y utiliza commits basados en cambios para ayudar al servidor a resolver conflictos de actualizaciones concurrentes y reintentos. Administra namespaces, metadatos de tablas y referencias de snapshots; los archivos de datos permanecen en el almacén de objetos subyacente. La entrevista se centra en el plano de control de metadatos, no en reconstruir un motor de consultas o un almacenamiento de objetos.

Qué evalúa el entrevistador

Una respuesta sólida separa el plano de datos del plano de control de metadatos y luego deduce los componentes a partir de la compatibilidad de clientes, la concurrencia de commits, los límites de autorización y la recuperación. El entrevistador espera una conexión entre el descubrimiento de configuraciones, la carga de tablas, las actualizaciones, la concurrencia optimista, el almacenamiento en caché de snapshots y la entrega de credenciales.

Una respuesta débil se limita a añadir "un servicio REST" sin explicar cómo dos escritores evitan sobrescribir snapshots ni cómo se gestionan las credenciales de datos emitidas por el catálogo, la autenticación entre múltiples motores y los clientes antiguos.

Preguntas para clarificar primero

Patrones de acceso y objetivos de consistencia

Pregunta sobre el tamaño de las tablas, la cantidad de namespaces, la proporción de lectura/escritura, la tasa de commits de snapshots y si se requieren commits atómicos entre múltiples tablas. Una carga de trabajo por lotes de baja frecuencia puede requerir únicamente una base de datos de metadatos simple. Muchos motores realizando commits de forma concurrente requieren detección explícita de conflictos, presupuestos de reintentos y objetivos de latencia de commits.

Límite de almacenamiento y catálogo

Confirma quién es el propietario del almacenamiento de objetos, FileIO, la base de datos del catálogo y los motores de cómputo. El REST Catalog devuelve metadatos y configuración, pero no debe actuar como proxy de archivos de datos grandes a través del servicio de catálogo. Las credenciales de datos se pueden entregar para una tabla o ubicación con permisos restringidos y un tiempo de vida corto.

Autenticación y gobernanza

Pregunta si los clientes utilizan OAuth2, firma de solicitudes en la nube o cuentas de servicio, y si se necesita aislamiento de inquilinos, auditoría o políticas de columnas y filas. La autorización del catálogo controla el descubrimiento, las lecturas y los commits; el almacenamiento de objetos debe hacer cumplir nuevamente el principio de privilegio mínimo, de modo que el catálogo no sea el único límite de seguridad.

Estructura de respuesta en 30 segundos

“Construiría el REST Catalog como un plano de control de metadatos sin estado. Un cliente primero llama al endpoint de configuración y luego usa las API de namespaces y tablas para cargar los metadatos. La base de datos del catálogo almacena la ubicación actual de los metadatos, las referencias de snapshots y la versión del commit; un escritor envía un cambio basado en una versión esperada, y el servidor detecta conflictos y devuelve un resultado reintentable. La autenticación utiliza OAuth2 o firma en la nube, mientras que los permisos del catálogo y las credenciales del almacén de objetos están separados. Los metadatos pueden almacenarse en caché brevemente, pero deben verificarse con una versión o ETag. Cuando el catálogo no está disponible, las lecturas pueden usar un snapshot antiguo verificado, pero las escrituras no deben eludir el protocolo de commit ni editar directamente los metadatos raíz.”

Solución paso a paso

Paso 1: Definir el modelo del plano de control

El catálogo necesita al menos un namespace, un identificador de tabla, la ubicación actual de los metadatos, referencias de snapshots, una versión y campos de auditoría. Los archivos de metadatos de las tablas permanecen en el almacenamiento de objetos; el catálogo registra sus ubicaciones y versiones de commit. Los clientes pueden cargar snapshots bajo demanda y el catálogo no se convierte en una ruta de transferencia de archivos grandes.

Paso 2: Diseñar la API útil más pequeña

El endpoint de configuración devuelve los valores predeterminados del servidor, anulaciones y endpoints compatibles. Las API de namespaces crean, listan y administran propiedades. Las API de tablas crean, cargan, actualizan, realizan commits, eliminan y renombran tablas. Una respuesta de carga puede incluir la configuración de acceso a tablas y datos, tras lo cual el cliente se comunica directamente con el almacenamiento de objetos. Una respuesta de commit devuelve la nueva versión para que los clientes puedan actualizar su caché.

Paso 3: Proteger los commits con concurrencia optimista

Un escritor lee la versión V, escribe nuevos metadatos y envía “Estoy basado en V y quiero cambiar a la ubicación M”. El servidor actualiza atómicamente el catálogo solo si la versión actual sigue siendo V. Si otro escritor realizó un commit primero, devuelve un conflicto; el cliente recarga, fusiona su cambio y reintenta. Los reintentos necesitan un límite y variación aleatoria (jitter) para que varios motores no transformen un solo conflicto en una tormenta de commits.

Paso 4: Manejar el caché y la consistencia de lectura

Los clientes pueden almacenar en caché la configuración de la tabla y las referencias de snapshots, pero la clave debe incluir el identificador completo de la tabla y la identidad del servidor. Prefiere la validación mediante ETag, versión o referencia de snapshot sobre un tiempo de vida (TTL) por sí solo. Las lecturas pueden usar un snapshot confirmado dentro de un presupuesto de obsolescencia explícito; las solicitudes que requieran la última rama, un cambio de permisos o lectura tras escritura deben revalidar la versión del catálogo.

Paso 5: Separar autenticación, autorización y entrega de credenciales

La API del catálogo se autentica con OAuth2, firma en la nube o una cuenta de servicio empresarial. La autorización distingue namespace, tabla y operación. Si el catálogo entrega credenciales temporales de almacenamiento de objetos, estas deben cubrir únicamente la ubicación y las acciones requeridas, tener un TTL corto y estar vinculadas a registros de auditoría con una ruta de revocación. Los clientes no deben escribir esas credenciales en registros o configuraciones compartidas como claves permanentes.

Paso 6: Diseñar rutas de falla y recuperación

Cuando la base de datos del catálogo no está disponible, los snapshots en caché verificados pueden atender lecturas con una marca de tiempo de obsolescencia visible. Las operaciones de creación, commit y eliminación deben fallar y reintentarse más tarde; no deben editar directamente los metadatos raíz del almacén de objetos. Si el almacenamiento de objetos no está disponible temporalmente, el catálogo no debe reportar éxito con una nueva versión de catálogo que apunte a un archivo faltante. La recuperación valida las ubicaciones de metadatos, las referencias de snapshots y los manifiestos de archivos antes de reabrir las escrituras.

Paso 7: Agregar observabilidad y evolución de compatibilidad

Registra el ID de solicitud, el motor del cliente, el identificador de la tabla, las versiones esperada y real, el recuento de conflictos, el recuento de reintentos y el alcance de las credenciales, pero nunca tokens o claves. Rastrea la latencia de commits, la tasa de conflictos, la tasa de aciertos de caché y la proporción de lecturas obsoletas por API, namespace y motor. Los nuevos endpoints o campos deben utilizar descubrimiento de capacidades y valores predeterminados compatibles con versiones anteriores; un campo desconocido no debe alterar la semántica de commit existente para clientes antiguos.

Respuesta de ejemplo de alta calidad

Definiría el Iceberg REST Catalog como un plano de control de metadatos. El almacenamiento de objetos contiene archivos de datos y archivos de metadatos de tablas. La base de datos del catálogo almacena el identificador de la tabla, la ubicación actual de los metadatos, las referencias de snapshots, la versión y los datos de auditoría de autorización. Spark, Trino y los clientes de otros lenguajes implementan entonces un único protocolo HTTP.

El cliente lee la configuración y carga la tabla. Un escritor lee la versión V, escribe nuevos metadatos y envía una versión esperada V. El servidor verifica esa versión dentro de una transacción; si sigue siendo V, cambia atómicamente a la nueva ubicación. De lo contrario, devuelve un conflicto. El cliente recarga y fusiona, luego reintenta con retroceso exponencial y un presupuesto acotado. Esto es más seguro que el criterio de que el último escritor gana (last-writer-wins), el cual puede perder silenciosamente el cambio de esquema o snapshot de otro escritor.

La autenticación puede usar OAuth2 o firma en la nube. La autorización del catálogo controla el descubrimiento, las lecturas y los commits. Si el catálogo entrega credenciales del almacén de objetos, las limito a la ubicación y a un TTL corto. Las cachés de metadatos utilizan ETags o versiones, de modo que los cambios de permisos y la lectura tras escritura no dependan de una entrada obsoleta no verificada. Durante una interrupción del catálogo, permito lecturas solo con un marcador explícito de obsolescencia y hago fallar las escrituras. Después de la recuperación, verifico las ubicaciones de metadatos, las referencias de snapshots y la existencia de archivos. Finalizo con pruebas de compatibilidad para commits concurrentes, reintentos duplicados, fallas del catálogo, credenciales expiradas, cachés obsoletas y solicitudes de clientes antiguos.

Errores comunes

  • Error: Enrutar cada archivo de datos a través del catálogo como proxy. → Por qué falla: El plano de control de metadatos se convierte en un cuello de botella de alto ancho de banda y acopla la autorización a la transferencia de datos. → Solución: Devolver metadatos y configuración de acceso con alcance delimitado, y luego permitir que los clientes lean el almacenamiento de objetos directamente.
  • Error: Usar "el último escritor gana" para commits concurrentes. → Por qué falla: Un escritor posterior puede sobrescribir silenciosamente el esquema o snapshot de otro escritor. → Solución: Enviar una versión esperada, detectar conflictos con una actualización condicional atómica y reintentar dentro de un presupuesto.
  • Error: Confiar únicamente en un TTL fijo para la frescura. → Por qué falla: La lectura tras escritura y los cambios de permisos pueden observar una vista errónea antes de que expire el TTL. → Solución: Validar con ETags, versiones o referencias de snapshots y forzar la actualización según el riesgo de la solicitud.
  • Error: Editar los metadatos raíz directamente cuando el catálogo está caído. → Por qué falla: Elude el protocolo de commit y desincroniza el índice del catálogo respecto al estado de los archivos. → Solución: Hacer fallar y reintentar las escrituras, luego validar ubicaciones, snapshots y manifiestos durante la recuperación.

Preguntas de seguimiento y respuestas

Seguimiento 1: Dos escritores se basan en la versión V. ¿Cómo fusionas los cambios de esquema?

El servidor rechaza el segundo commit en lugar de adivinar. El cliente recarga los metadatos actuales y verifica si sus cambios de esquema, partición o propiedades entran en conflicto con el nuevo estado. Crea y envía nuevos metadatos solo cuando la fusión es segura. Un cambio que no se puede fusionar automáticamente se convierte en un conflicto explícito para una decisión a nivel de operador o de trabajo.

Seguimiento 2: ¿Qué sucede si la caché del catálogo y el almacenamiento de objetos no coinciden?

Trata la versión del catálogo como el hecho consolidado del commit y la ubicación de metadatos en el almacén de objetos como una copia verificable. Un verificador en segundo plano valida que la ubicación sea legible, que las referencias de snapshots estén completas y que los manifiestos se resuelvan. Si el catálogo apunta a una ubicación faltante, congela las escrituras posteriores, restaura la versión verificable más reciente y conserva un registro de auditoría. Aumentar el TTL de la caché solo oculta la falla.

Seguimiento 3: ¿Por qué no permitir que cada motor hable directamente con Hive Metastore?

Los clientes en múltiples lenguajes repetirían la autenticación, el manejo de conflictos y la evolución de características, aumentando el costo a medida que se agregan motores. REST Catalog proporciona un protocolo único y descubrimiento de capacidades, mientras que el servidor centraliza la resolución de conflictos, el almacenamiento en caché y la entrega de credenciales. Si una organización tiene un despliegue estable de Hive y un solo motor, mantenerlo puede ser más simple; la migración debe justificarse por la compatibilidad entre motores y los beneficios de gobernanza.

Seguimiento 4: ¿Qué pasa si un cliente registra una credencial del almacén de objetos en los logs?

Las credenciales deben ser de corta duración, de privilegio mínimo y estar asociadas a un ID de solicitud. La redacción se ejecuta tanto en el cliente como en el servicio de catálogo. En caso de exposición, revoca o acorta la sesión, inspecciona los registros de auditoría de acceso y emite un reemplazo. Para datos altamente sensibles, un proxy de servidor o la firma remota pueden reducir la exposición de credenciales a costa del rendimiento de lectura directa.

Fuentes públicas

Preguntas relacionadas