Spark Structured Streaming Với Dữ liệu Web: Khái niệm, Trường hợp sử dụng và Các xem xét về Sản xuất
TL;DR
Spark Structured Streaming xử lý các bản ghi mới một cách gia tăng; nó không tự khám phá hoặc hiển thị các trang web.
Một kiến trúc dữ liệu web đáng tin cậy chạy một trình thu thập dữ liệu giới hạn ở phía trên, hạ cánh các sự kiện trang không thay đổi vào một nguồn được hỗ trợ, và cho phép Spark tiêu thụ các sự kiện đó.
Nstdata Crawl là một API Thu thập Dữ liệu Web cho dữ liệu sẵn sàng LLM: nó có thể khám phá các trang trong các giới hạn rõ ràng, hiển thị JavaScript, và trả về Markdown, HTML, dữ liệu thô, liên kết, PDF, hoặc ảnh chụp màn hình.
Xem việc gửi thành công một phiên thu thập dữ liệu như một sự chấp nhận công việc, không phải là bằng chứng rằng mỗi trang đều thành công; điều chỉnh số lượng hoàn thành, thất bại, đang chờ, và tổng số.
Sử dụng một khóa trang ổn định, thời gian quan sát, điểm kiểm tra, và điểm tiêu thụ không thay đổi để các lần khởi động lại không âm thầm đếm gấp đôi cập nhật.
Đánh giá chi phí cho mỗi bản ghi đã chấp nhận và đúng hạn thay vì chỉ dựa vào các yêu cầu.
Spark Structured Streaming với dữ liệu web có nghĩa là gì?
Spark Structured Streaming với dữ liệu web có nghĩa là liên tục xử lý các bản ghi trang mới thu thập được thông qua động cơ DataFrame gia tăng của Spark. Điều này hữu ích khi một nhóm sản phẩm cần các giá cả thay đổi, các trang chính sách công, tài liệu, hoặc các tín hiệu thị trường để gửi đến kho hoặc chỉ mục AI mà không cần xây dựng lại toàn bộ tập dữ liệu theo lô mỗi lần. Tổng quan về Structured Streaming của Apache Spark mô tả mô hình thực thi micro-batch và phục hồi dựa trên điểm kiểm tra.
Đối với việc thu thập trang, Nstdata Crawl cung cấp API Thu thập Dữ liệu Web ở phía trên cho dữ liệu sẵn sàng LLM.
Sự phân biệt rất quan trọng: một URL không phải là một nguồn phát trực tuyến. Spark có thể đọc tệp, Kafka, và các nguồn hỗ trợ khác, trong khi một trình thu thập xử lý việc khám phá, truy cập, hiển thị, và trích xuất. Gọi một API HTTP bên trong foreachBatch là một tác dụng phụ của gọi lại phát trực tuyến; nó không biến API đó thành một nguồn hỗ trợ với các độ lệch nguồn. Hướng dẫn cho thấy mô hình rộng hơn từ thu thập đến tiêu thụ.
Kiến trúc này đáng sử dụng khi nhiều trang thay đổi độc lập cung cấp các chuyển đổi ở phía dưới giống nhau và độ tươi mới quan trọng hơn một lần xuất đầy đủ hàng ngày. Một nhà bán lẻ có thể theo dõi các trang sản phẩm được phép về các thay đổi về ưu đãi; một nhóm AI có thể làm mới một kho tài liệu RAG khi tài liệu công khai thay đổi; một nhóm rủi ro có thể theo dõi các sửa đổi chính sách công. Giá trị kinh doanh đến từ các cập nhật nhỏ hơn, có thể theo dõi và quyết định nhanh hơn, miễn là các quan sát nguồn thực sự tươi mới.
Đối với một tập hợp nhỏ các URL được làm mới một lần mỗi ngày, một công việc theo lịch theo lô thường đơn giản hơn. Structured Streaming thêm lưu trữ điểm kiểm tra, quản lý lược đồ, ngữ nghĩa sink, và các hoạt động liên tục. Chọn nó chỉ khi những chi phí đó mang lại việc tươi mới hoặc thông lượng hữu ích. Tổng quan về thu thập dữ liệu tự động giúp đặt một mục tiêu cấp dịch vụ trước khi chọn chế độ xử lý.
Các thành phần nào tạo nên một luồng dữ liệu web sản xuất?
Một luồng dữ liệu web sản xuất có một công việc thu nhận có giới hạn, một lớp hạ cánh bền bỉ, một chuyển đổi có cấu trúc, và một đích quan sát được. Luồng là:
Seed URLs hoặc sơ đồ trang đã được xem xét → Nstdata Crawl → điều chỉnh công việc → các sự kiện JSON không thay đổi → Kafka hoặc lưu trữ đối tượng → Spark Structured Streaming → bảng hoặc chỉ mục đã được xác thực
Nstdata Crawl có thể gửi một lần thu thập trang từ một URL đầu vào với maxDepth, maxPages, includeUrls, excludeUrls, và ignoreQuery. Những điều khiển đó giữ cho một phần danh mục không mở rộng thành các trang tìm kiếm, các tuyến tài khoản, hoặc các biến thể truy vấn vô tận. Việc hiển thị trình duyệt của nó có thể ghi lại nội dung xuất hiện sau khi JavaScript được thực thi, và các đầu ra của nó phục vụ cho các người tiêu dùng khác nhau: Markdown cho RAG, HTML hoặc dữ liệu thô cho việc trích xuất trường, liên kết cho việc khám phá, và ảnh chụp màn hình hoặc PDF cho việc điều tra. Việc điều phối proxy tích hợp có nghĩa là người gọi không cần phải cấu hình một điểm cuối proxy riêng biệt. Đây là khả năng thu thập, không phải là một lời hứa rằng các trường dữ liệu thương mại của một trang đã được chuẩn hóa. Xem tài liệu API Nstdata Crawl để biết hợp đồng yêu cầu và phản hồi hiện tại.
Sự kiện hạ cánh nên bao gồm source_url, observed_at, crawl_id, page_status, content_hash, và một tham chiếu nội dung hoặc đối tượng đã chuẩn hóa. Giữ lại phản hồi thô hoặc một tham chiếu bền bỉ để gỡ lỗi. Tránh đưa một PDF lớn hoặc ảnh chụp màn hình vào một thông điệp Kafka; lưu trữ nó riêng và truyền đạt một tham chiếu. Nếu API trả về một tham chiếu đối tượng lớn, hãy lấy nó thông qua điểm cuối đọc lưu trữ đã được tài liệu hóa thay vì đoán một URL.
Làm thế nào để kết nối Nstdata Crawl với Spark mà không cần phát minh một kết nối?
Kết nối Nstdata Crawl với Spark thông qua một trình lập lịch và một nguồn bền vững mà Spark đã hỗ trợ. Ví dụ dưới đây sử dụng một yêu cầu thu thập trang có giới hạn và một thư mục landing được định dạng JSON-lines. Đó là một mẫu tích hợp, không phải là một kết nối Spark Nstdata bản địa.
Bước 1: Gửi yêu cầu thu thập có giới hạn
Tạo một tài khoản Nstdata, lấy một khóa API thu thập, chọn một URL hạt giống công cộng được phép, và thiết lập phạm vi trước khi bắt đầu công việc. Lưu khóa trong NSTDATA_API_KEY. Điểm cuối thu thập được tài liệu là POST https://api.nstdata.io/api/v1/crawl với tiêu đề 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}'
Thay thế tên miền ví dụ bằng một URL mà bạn được phép thu thập. Phản hồi nên chứa một ID thu thập; ghi lại nó với phiên chạy đã lên lịch. Đừng giả định rằng việc gửi yêu cầu có nghĩa là việc thu thập đã hoàn tất. Hướng dẫn chuyển đổi trang web sang Markdown đề cập đến các quyết định về hạt giống và phạm vi.
Bước 2: Kê khai công việc và sự kiện trang được chấp nhận
Thực hiện lệnh GET /api/v1/crawl/status/{crawlId} cho đến khi nhiệm vụ đạt trạng thái cuối cùng, sau đó kiểm tra total, completed, failed, và pending. Lấy các trang thông qua GET /api/v1/crawl/pages/{crawlId}. Tài liệu hiện tại cho thấy nextCursor trong phản hồi nhưng không định nghĩa rõ ràng tham số yêu cầu con trỏ, vì vậy hãy xác minh hợp đồng phân trang với tài khoản hoặc SDK của bạn trước khi yêu cầu thu thập hoàn chỉnh ở quy mô lớn. Bảo tồn một sự kiện không thể thay đổi cho mỗi trang được chấp nhận, phân vùng theo ngày quan sát và ID chạy. Ghi các tệp mới một cách nguyên tử để Spark không bao giờ thấy JSON chưa hoàn chỉnh.
Bước 3: Xử lý các sự kiện đã được hạ cánh với một điểm kiểm tra
Định nghĩa một sơ đồ thay vì yêu cầu một luồng suy luận từ các trang thay đổi. Một người tiêu dùng PySpark tối thiểu có thể đọc các tệp JSON được phân cách bằng dòng theo thời gian đến:
Đoạn mã yêu cầu PySpark và các thư mục có thể ghi được bởi quy trình Spark. Nó minh họa ranh giới nguồn tệp được hỗ trợ; nó không thể chạy chống lại dịch vụ Nstdata mà không có khóa API và quy trình hạ cánh của bạn. Đối với một nơi chứa sản xuất, thêm xác thực, loại bỏ trùng lặp, và một khóa ổn định như URL chính thức cộng với mã băm nội dung hoặc phiên quan sát. Giữ trạng thái điểm kiểm tra trên lưu trữ đáng tin cậy. Hướng dẫn API DataFrame luồng của Spark tài liệu các nơi chứa và ngữ nghĩa foreachBatch.
Làm thế nào bạn biết luồng là chính xác và tươi mới?
Luồng là chính xác và tươi mới chỉ khi bộ thu thập và Spark đồng ý về phạm vi, độ trễ và các bản ghi được chấp nhận. So sánh các URL được yêu cầu và phát hiện, các trang đã hoàn tất và thất bại, các tệp đã hạ cánh, hàng đầu vào Spark và hàng đích. Mẫu các trang đã được kết xuất so với Markdown hoặc HTML của chúng; một phản hồi 200 có thể vẫn chứa màn hình đăng nhập, shell trống hoặc ngôn ngữ sai. Theo dõi observed_at đến sự sẵn có của điểm đến, không chỉ đơn giản là độ trễ xử lý của Spark.
Thiết lập các quy tắc chấp nhận rõ ràng: các trường bắt buộc hiện diện, nội dung chính không trống, phạm vi URL mong đợi, ngôn ngữ chấp nhận được, không có phiên bản trùng lặp, và một ngân sách lỗi cho các lỗi. Giữ các sự kiện chết với lý do và URL nguồn. Đối với việc thu thập AI, kiểm tra chất lượng và nguồn gốc của các chunk trước khi lập chỉ mục. Một đối tượng trang chung không tự động là một sản phẩm chính xác hoặc sự thật chính sách.
Những rủi ro và ranh giới chi phí nào bạn nên lập kế hoạch?
Các rủi ro chính là sự mở rộng thu thập không kiểm soát, nội dung trang lỗi thời hoặc không đầy đủ, trôi dạt sơ đồ, xử lý lặp lại và chi phí hoạt động ẩn. Ràng buộc phát hiện với độ sâu, số lượng trang và bộ lọc URL; tách biệt giới hạn tính đồng thời của bộ lập lịch. Kết xuất JavaScript có thể làm tăng độ trễ, và một bố cục trang thay đổi có thể làm hỏng ánh xạ trường ngay cả khi việc thu thập thành công. Không suy ra quy tắc lập hóa đơn hoặc mức giá cố định từ số lượng yêu cầu; xác minh kế hoạch của bạn và đo lường chi phí cho mỗi trang được chấp nhận, bao gồm cả công việc bị từ chối và thử lại.
Cũng xác nhận rằng việc thu thập tuân thủ các điều khoản của trang web, luật áp dụng, nghĩa vụ về quyền riêng tư và chính sách nội bộ. Tránh bỏ qua xác thực và các trang không công khai. Nếu cần SLA theo sự kiện nghiêm ngặt hoặc luồng độ trễ thấp, hãy kiểm tra độ trễ từ nguồn đến đích đối với các trang đại diện trước khi cam kết kiến trúc.
Đội ngũ của bạn nên chọn phương pháp nào?
Chọn lô trình đã lên lịch cho một tập hợp URL nhỏ, thay đổi chậm và chọn Luồng Có Cấu Trúc khi một bản tin sự kiện trang bền vững và xử lý liên tục phía dưới biện minh cho các hoạt động đã thêm. Bắt đầu với một công việc thu thập Nstdata có giới hạn, hòa giải mọi trang và hạ cánh các sự kiện không thể thay đổi; sau đó kết nối kho lưu trữ sự kiện với Spark. Đầu ra Markdown giống nhau cũng có thể cung cấp cho một luồng dữ liệu web RAG khi việc kiểm tra chất lượng được thực hiện.
Q: Có phải Spark Structured Streaming có thể thu thập một trang web trực tiếp không?
Spark Structured Streaming không cung cấp phát hiện trang web, kết xuất trình duyệt hoặc quản lý trạng thái thu thập. Sử dụng một trình thu thập ở phía trên và cung cấp Spark thông qua một nguồn bền vững được hỗ trợ.
Q: Có phải chỉ cần gửi thành công Nstdata Crawl là đủ để tạo một sự kiện Spark không?
Một lần gửi thành công chỉ xác nhận rằng công việc đã được chấp nhận. Chờ kết quả trang, kiểm tra trạng thái và nội dung, sau đó phát ra các sự kiện đã chấp nhận.
Q: Có mỗi lần cập nhật trang trở thành một hàng mới không?
Mỗi quan sát có thể là một sự kiện, nhưng các bảng phía dưới cần áp dụng một quy tắc phiên bản hoặc loại bỏ trùng lặp đã được tài liệu hóa. Giữ source_url, thời gian quan sát và băm nội dung để việc thu thập lặp lại có thể được giải thích.
Q: Nstdata Crawl có thay thế các biến đổi Spark không?
Nstdata Crawl cung cấp các tài liệu web đã truy cập và xử lý. Spark hoặc một hệ thống phía dưới khác vẫn xử lý ánh xạ sơ đồ cụ thể theo miền, kết nối, quy tắc chất lượng và giao hàng.
Kai Watanabe
Nov. 3rd 2026
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.