Spark Structured Streaming con datos web: conceptos, casos de uso y consideraciones de producción
TL;DR
Spark Structured Streaming procesa nuevos registros de manera incremental; no descubre ni renderiza páginas web por sí mismo.
Una arquitectura de datos web confiable ejecuta un rastreador limitado en la parte superior, aterriza eventos de página inmutables en una fuente soportada y permite que Spark consuma esos eventos.
Nstdata Crawl es una API de rastreo web para datos listos para LLM: puede descubrir páginas dentro de límites explícitos, renderizar JavaScript y devolver Markdown, HTML, datos en bruto, enlaces, PDFs o capturas de pantalla.
Trata una presentación de rastreo exitosa como una aceptación de trabajo, no como prueba de que cada página tuvo éxito; concilia conteos completados, fallidos, pendientes y totales.
Utiliza una clave de página estable, tiempo de observación, punto de control y un sumidero idempotente para que los reinicios no cuenten silenciosamente los actualizaciones de manera duplicada.
Evalúa el costo por registro aceptado y oportuno en lugar de solo las solicitudes.
¿Qué significa realmente Spark Structured Streaming con datos web?
Spark Structured Streaming con datos web significa procesar continuamente nuevos registros de página recolectados a través del motor DataFrame incremental de Spark. Es útil cuando un equipo de producto necesita precios cambiantes, páginas de políticas públicas, documentación o señales de mercado para llegar a un almacén o índice de IA sin reconstruir un conjunto de datos por lotes completo cada vez. Resumen de Apache Spark's Structured Streaming describe el modelo de ejecución de micro-lotes y la recuperación basada en puntos de control.
Para la recolección de páginas, Nstdata Crawl proporciona la API de rastreo web en la parte superior para datos listos para LLM.
La distinción importa: una URL no es una fuente de streaming. Spark puede leer archivos, Kafka y otras fuentes soportadas, mientras que un rastreador maneja el descubrimiento, acceso, renderización y extracción. Llamar a una API HTTP dentro de es un efecto secundario de un callback de de streaming; no convierte esa API en una fuente soportada con desplazamientos de fuente. La muestra el patrón más amplio de recolección a consumo.
Esta arquitectura vale la pena usarla cuando muchas páginas que cambian independientemente alimentan las mismas transformaciones aguas abajo y la frescura importa más que una exportación completa diaria. Un minorista puede observar páginas de productos permitidos para cambios en ofertas; un equipo de IA puede actualizar un corpus RAG cuando la documentación pública cambia; un equipo de riesgo puede rastrear revisiones de políticas públicas. El valor comercial proviene de actualizaciones más pequeñas, trazables y decisiones más rápidas, siempre que las observaciones de la fuente sean realmente frescas.
Para un pequeño conjunto de URLs actualizadas una vez al día, un trabajo por lotes programado suele ser más simple. Spark Structured Streaming agrega almacenamiento de puntos de control, gestión de esquemas, semánticas de sumidero y operaciones continuas. Elígelo solo si esos costos compran una ganancia útil en frescura o rendimiento. La visión general de recolección de datos automatizada ayuda a establecer un objetivo de nivel de servicio antes de seleccionar un modo de procesamiento.
¿Qué componentes conforman un flujo de datos web en producción?
Un flujo de datos web en producción tiene un trabajo de adquisición limitado, una capa de aterrizaje duradera, una transformación estructurada y un destino observable. El flujo es:
URLs semilla o mapa del sitio revisado → Nstdata Crawl → conciliación de trabajo → eventos JSON inmutables → Kafka o almacenamiento de objetos → Spark Structured Streaming → tabla o índice validado
Nstdata Crawl puede enviar un rastreo de sitio desde una URL de entrada con maxDepth, maxPages, includeUrls, excludeUrls y ignoreQuery. Esos controles mantienen una sección de catálogo de expandirse en páginas de búsqueda, rutas de cuentas o variantes de consulta interminables. Su renderización en navegador puede capturar contenido que aparece después de que JavaScript se ejecuta, y sus salidas sirven a diferentes consumidores: Markdown para RAG, HTML o datos en bruto para extracción de campo, enlaces para descubrimiento y capturas de pantalla o PDFs para investigación. La orquestación de proxy incorporada significa que el llamador no tiene que configurar un endpoint de proxy separado. Estas son capacidades de recolección, no una promesa de que los campos comerciales de una página ya estén normalizados. Consulta la documentación de la API de Nstdata Crawl para el contrato actual de solicitud y respuesta.
El evento de aterrizaje debe incluir source_url, observed_at, crawl_id, page_status, content_hash, y una referencia de contenido o artefacto normalizado. Mantén la respuesta en bruto o una referencia duradera para depuración. Evita poner un PDF grande o captura de pantalla en un mensaje de Kafka; almacénalo por separado y pasa una referencia. Si la API devuelve una referencia de artefacto grande, recupérala a través del endpoint de lectura de almacenamiento documentado en lugar de adivinar una URL.
¿Cómo conectas Nstdata Crawl a Spark sin inventar un conector?
Conecta Nstdata Crawl a Spark a través de un programador y una fuente duradera que Spark ya admite. El ejemplo a continuación utiliza una presentación de rastreo de sitio limitado y un directorio de aterrizaje de líneas JSON. Es un patrón de integración, no un conector nativo de Nstdata para Spark.
Paso 1: Envía un rastreo limitado
Crea una cuenta de Nstdata, obtén una clave de API de Rastreo, elige una URL de semilla pública permitida y establece el alcance antes de comenzar el trabajo. Almacena la clave en NSTDATA_API_KEY. El endpoint documentado para el rastreo de sitios es POST https://api.nstdata.io/api/v1/crawl con el encabezado x-api-key.
curl-sS-X POST 'https://api.nstdata.io/api/v1/crawl'\-H"x-api-key: $NSTDATA_API_KEY"\-H'Content-Type: application/json'\--data'{"url":"https://docs.example.org/guide/","formats":["markdown","links"],"maxDepth":2,"maxPages":100,"includeUrls":["*docs.example.org/guide/*"],"excludeUrls":["*docs.example.org/guide/search*"],"ignoreQuery":true,"onlyMainContent":true}'
Reemplaza el host de ejemplo con una URL que estés autorizado a recoger. La respuesta debería contener un ID de rastreo; regístralo con la ejecución programada. No asumas que la presentación significa que la recopilación se completó. La guía para convertir sitios web a Markdown cubre decisiones sobre semillas y alcances.
Paso 2: Conciliar el trabajo y registrar los eventos de páginas aceptadas
Consulta GET /api/v1/crawl/status/{crawlId} hasta que la tarea alcance un estado terminal, luego inspecciona total, completed, failed y pending. Recupera páginas a través de GET /api/v1/crawl/pages/{crawlId}. La documentación actual muestra nextCursor en la respuesta, pero no define claramente el parámetro de solicitud del cursor, así que verifica el contrato de paginación con tu cuenta o SDK antes de reclamar la recuperación completa a gran escala. Persiste un evento inmutable por cada página aceptada, particionado por la fecha de observación y el ID de ejecución. Escribe nuevos archivos de manera atómica para que Spark nunca vea JSON medio escrito.
Paso 3: Procesar eventos aterrizados con un punto de control
Define un esquema en lugar de pedir a un flujo que infiera uno de páginas cambiantes. Un consumidor PySpark mínimo puede leer archivos JSON delimitados por líneas a medida que llegan:
El código requiere PySpark y directorios que sean escribibles por el proceso de Spark. Demuestra el límite de archivo fuente admitido; no puede ejecutarse contra el servicio Nstdata sin tu clave API y proceso de aterrizaje. Para un sumidero de producción, agrega validación, deduplicación y una clave estable como la URL canónica más el hash del contenido o la versión de observación. Mantén el estado del punto de control en un almacenamiento confiable. La guía de la API de DataFrame de streaming de Spark documenta sumideros y la semántica de foreachBatch.
¿Cómo sabes que el flujo es correcto y fresco?
El flujo es correcto y fresco solo cuando el rastreador y Spark están de acuerdo sobre la cobertura, latencia y registros aceptados. Compara las URL solicitadas y las descubiertas, las páginas completas y fallidas, los archivos aterrizados, las filas de entrada de Spark y las filas de destino. Muestra páginas renderizadas contra su Markdown o HTML; una respuesta 200 aún puede contener una pantalla de inicio de sesión, un shell vacío o una localidad incorrecta. Rastrea observed_at hasta la disponibilidad del destino, no solo la latencia de procesamiento de Spark.
Establece reglas de aceptación explícitas: campos requeridos presentes, contenido principal no vacío, alcance de URL esperado, idioma aceptable, ninguna versión duplicada y un presupuesto de errores para fallos. Mantén eventos de carta muerta con una razón y URL de origen. Para la recuperación de IA, inspecciona la calidad y la procedencia del fragmento antes de indexarlo. Un artefacto de página genérico no es automáticamente un producto preciso o un hecho de política.
¿Qué riesgos y límites de costos deberías planificar?
Los principales riesgos son la expansión de rastreo no controlada, contenido de página obsoleto o incompleto, desviación del esquema, procesamiento repetido y costo operativo oculto. Limite el descubrimiento vinculado con la profundidad, el recuento de páginas y los filtros de URL; limite por separado la concurrencia del programador. La renderización de JavaScript puede aumentar la latencia, y un cambio en el diseño de la página puede romper la asignación de campos incluso cuando el rastreo tiene éxito. No infiera una regla de facturación o un precio fijo a partir de un recuento de solicitudes; verifique su plan y mida el costo por página aceptada, incluidos el trabajo rechazado y el reintentado.
También confirme que la recolección cumple con los términos del sitio, la ley aplicable, las obligaciones de privacidad y la política interna. Evite la elusión de autenticación y las páginas no públicas. Si se requiere un SLA estricto a nivel de eventos o un flujo de baja latencia, pruebe la latencia de origen a destino contra sitios representativos antes de comprometerse con la arquitectura.
¿Qué enfoque debería elegir su equipo?
Elija lotes programados para un conjunto de URL pequeño y que cambie lentamente, y elija Streaming Estructurado cuando un feed de eventos de página durable y un procesamiento continuo paralelo justifiquen las operaciones adicionales. Comience con un trabajo de Nstdata Crawl limitado, concilie cada página y realice eventos inmutables; luego conecte el almacén de eventos a Spark. La misma salida de Markdown también puede alimentar un flujo de trabajo de datos web RAG una vez que se implementen las verificaciones de calidad.
P: ¿Puede Spark Structured Streaming rastrear un sitio web directamente?
Spark Structured Streaming no proporciona descubrimiento de sitios web, renderización de navegador o gestión de estado de rastreo. Utilice un rastreador en la parte superior y alimente Spark a través de una fuente durable y compatible.
P: ¿Es suficiente una presentación exitosa de Nstdata Crawl para crear un evento de Spark?
Una presentación exitosa solo confirma que el trabajo fue aceptado. Espere los resultados de la página, inspeccione el estado y el contenido, y luego emita eventos aceptados.
P: ¿Debería cada actualización de página convertirse en una nueva fila?
Cada observación puede ser un evento, pero las tablas en la parte inferior deben aplicar una regla de versión documentada o de deduplicación. Mantenga source_url, el tiempo de observación y el hash de contenido para que los rastreos repetidos sean explicables.
P: ¿Reemplaza Nstdata Crawl las transformaciones de Spark?
Nstdata Crawl proporciona artefactos web accesados y procesados. Spark u otro sistema en la parte inferior aún maneja la asignación de esquema específico del dominio, uniones, reglas de calidad y entrega.
Kai Watanabe
Nov. 3rd 2026
Rastrea sitios web completos con una sola solicitud API
99,8% de éxito con renderizado JavaScript
Obtén datos limpios, listos para LLM, en múltiples formatos
Convierte cualquier sitio web en Markdown, HTML, JSON, enlaces, PDF y más, sin gestionar infraestructura de rastreo.