Apache Arrow truyền batch crawl: stream, file và lỗi giữa chừng
Apache Arrow truyền batch crawl là cách chuyển kết quả parse từ bước này sang bước khác dưới dạng RecordBatch của Arrow, qua định dạng IPC, thay vì ghi JSON rồi đọc lại. Bước nhận đọc thẳng vào bộ nhớ dạng cột, không phải phân tích văn bản. Nhưng có hai biến thể IPC là stream và file, và chúng phản ứng rất khác khi bên ghi sập giữa chừng. ProxyVN chạy pyarrow 26.0.1 ngày 03/11/2026 với 100.000 dòng dữ liệu crawl chia năm batch, so với JSONL, truyền qua pipe giữa hai tiến trình, cắt cụt tệp để xem đọc được gì. Bài ghi lại con số thật.
Apache Arrow truyền batch crawl: mục tiêu và phạm vi không lặp
Phần này chốt bài toán, đầu ra và ranh giới.
Bài toán
Một pipeline crawl có bước parse viết bằng Python, chạy trong một tiến trình, và bước xử lý tiếp theo chạy trong tiến trình khác, có khi bằng ngôn ngữ khác. Hiện hai bước trao đổi qua tệp JSONL. Mỗi lần trao đổi, bước parse chuyển dữ liệu thành văn bản, bước sau phân tích văn bản trở lại. Với vài trăm nghìn dòng, việc này tốn thời gian và dễ sai kiểu dữ liệu.
Đầu ra nghiệm thu
Đầu ra gồm cách ghi và đọc RecordBatch qua Arrow IPC ở cả hai biến thể, số đo so với JSONL, và phép truyền qua pipe giữa hai tiến trình. Kèm theo là hành vi khi schema lệch hoặc khi bên ghi sập giữa chừng. Mỗi kết luận có số liệu từ lab.
Ranh giới với Parquet
Parquet là định dạng lưu trữ dài hạn, nén chặt, có thống kê để đọc chọn lọc. Arrow IPC là định dạng trao đổi, gần như giống hệt cách Arrow giữ dữ liệu trong bộ nhớ, ưu tiên tốc độ đọc ghi hơn dung lượng. Bài không bàn lưu trữ dài hạn. Dữ liệu cuối cùng vẫn nên ghi Parquet.
Phiên bản đã khóa
Lab dùng pyarrow 26.0.1, Python 3.12 trên Windows. Dữ liệu gồm năm RecordBatch, mỗi batch 20.000 dòng với bốn cột url, price, status, fetched_at. Thời gian đo trên một máy, một lần chạy, chỉ dùng để so tương đối.
Ai nên đọc
Người có pipeline nhiều bước và đang trao đổi dữ liệu bằng JSON hay pickle giữa các bước. Người cần truyền dữ liệu từ Python sang công cụ viết bằng ngôn ngữ khác. Người muốn hiểu khi nào chọn stream, khi nào chọn file.
Arrow trong bộ nhớ và trên đường truyền
Điểm đặc biệt của Arrow là định dạng trong bộ nhớ và định dạng trên đường truyền gần như trùng nhau. Bên gửi không phải chuyển đổi nhiều khi ghi, bên nhận không phải dựng lại cấu trúc khi đọc. Đây là nguồn gốc của tốc độ, khác với JSON hay pickle phải mã hóa và giải mã từng giá trị.
Khi nào chưa cần Arrow
Nếu hai bước chạy trong cùng một tiến trình Python, truyền thẳng đối tượng là đủ, không cần định dạng trao đổi nào. Nếu dữ liệu chỉ vài nghìn dòng, chênh lệch tốc độ không đáng kể. Arrow IPC có ích khi dữ liệu đi qua ranh giới tiến trình hoặc ngôn ngữ, và đủ lớn để chi phí phân tích văn bản trở thành vấn đề.
Trao đổi RecordBatch qua Arrow IPC giữa bước parse và xử lý với Apache Arrow truyền batch crawl
Phần này giải thích các khái niệm cần dùng.
Bảng và batch
Một bảng Arrow là danh sách các batch cùng schema. Đọc toàn bộ stream bằng read_all trả về bảng, đọc từng batch bằng vòng lặp trả về từng batch. Với dữ liệu lớn, xử lý từng batch giữ bộ nhớ thấp. Với dữ liệu vừa phải, đọc thành bảng tiện hơn cho các phép tính trên cả tập.
RecordBatch
RecordBatch là một khối dữ liệu dạng cột với schema cố định: mỗi cột là một mảng Arrow, mọi cột cùng số dòng. Bước parse có thể tạo một batch cho mỗi trang danh mục hay mỗi vài nghìn sản phẩm, rồi gửi đi ngay, không chờ parse xong toàn bộ.
Hai định dạng IPC
Theo trang Streaming, Serialization, and IPC trong tài liệu pyarrow, Arrow có hai định dạng nhị phân. Định dạng stream dùng để gửi một chuỗi batch có độ dài tùy ý, phải đọc từ đầu tới cuối. Định dạng file với số batch cố định, hỗ trợ truy cập ngẫu nhiên. Định dạng file thường dùng đuôi arrow, định dạng stream thường dùng đuôi arrows.
Stream ghi gì
Stream bắt đầu bằng schema, tiếp theo là các batch nối nhau, kết thúc bằng một dấu hết. Bên đọc nhận từng batch theo thứ tự. Không cần biết trước có bao nhiêu batch. Hợp với dữ liệu sinh dần như kết quả parse.
File ghi gì
File có cấu trúc giống stream ở phần đầu, cộng thêm phần chân ở cuối tệp chứa vị trí của từng batch. Nhờ phần chân, bên đọc có thể nhảy tới batch bất kỳ mà không đọc các batch trước. Nhưng phần chân chỉ được ghi khi đóng tệp.
Batch không cần cùng kích thước
Các batch trong một stream có thể có số dòng khác nhau, miễn cùng schema. Bước parse có thể gửi batch nhỏ cho trang danh mục ít sản phẩm và batch lớn cho trang nhiều sản phẩm. Bên nhận không cần biết trước kích thước của batch nào.
Schema đi trước dữ liệu
Cả hai định dạng ghi schema đầu tiên. Bên đọc biết kiểu của mọi cột trước khi nhận dòng nào. Không có chuyện giá đọc thành chuỗi ở dòng này, số ở dòng khác như với JSON.
Kiểu dữ liệu không mất khi truyền
Thời điểm có múi giờ đi qua IPC vẫn là thời điểm có múi giờ. Số nguyên 16 bit vẫn là 16 bit. Với JSON, thời điểm thành chuỗi và số nguyên thành số chung chung, bên nhận phải đoán lại. Lỗi kiểu dữ liệu giữa các bước là một trong những lỗi khó tìm nhất của pipeline, và IPC loại bỏ phần lớn nguồn gốc của nó.
Ánh xạ bộ nhớ
Với định dạng file trên đĩa, pyarrow có thể ánh xạ tệp vào bộ nhớ và đọc batch mà không chép dữ liệu. Các mảng Arrow trỏ thẳng vào vùng nhớ của tệp. Lab sẽ đo lượng bộ nhớ cấp phát khi đọc theo cách này.
Ghi stream và file từ bước parse của Apache Arrow truyền batch crawl
Phần này ghi năm batch ra hai định dạng và so với JSONL.
Schema của batch
SCHEMA = pa.schema([("url", pa.string()), ("price", pa.int64()),
("status", pa.int16()),
("fetched_at", pa.timestamp("us", tz="UTC"))])
Schema giống bài Parquet: giá số nguyên, trạng thái int16, thời điểm có múi giờ UTC. Mỗi batch được tạo bằng RecordBatch.from_pydict với schema này.
Ghi stream
with ipc.new_stream("lo.arrows", SCHEMA) as w:
for b in batches:
w.write_batch(b)
new_stream nhận đích ghi và schema. write_batch ghi từng batch. Khối with đảm bảo dấu hết được ghi khi kết thúc.
Đóng stream đúng cách
Khối with gọi close khi kết thúc, ghi dấu hết của stream. Nếu quên đóng, bên đọc sẽ chờ thêm batch hoặc báo lỗi thiếu dữ liệu ở cuối. Khi truyền qua pipe, đóng writer rồi đóng luôn đầu ghi của pipe để bên nhận biết không còn gì nữa.
Ghi file
with ipc.new_file("lo.arrow", SCHEMA) as w:
for b in batches:
w.write_batch(b)
Cú pháp giống hệt, chỉ đổi new_stream thành new_file. Khác biệt nằm ở phần chân được ghi khi khối with đóng.
Tên tệp và đuôi
Đuôi arrow cho file và arrows cho stream là quy ước, không bắt buộc. Đặt đúng đuôi giúp người khác biết nên mở bằng hàm nào. Mở stream bằng open_file sẽ báo lỗi không phải tệp Arrow, dễ làm người dùng tưởng tệp hỏng.
Dung lượng
Stream và file đều nặng 4.537 KB cho 100.000 dòng. Phần chân của file rất nhỏ so với dữ liệu. JSONL cùng dữ liệu nặng 11.664 KB. Arrow IPC không nén mặc định, nhưng vẫn nhỏ hơn JSONL khoảng 2,6 lần nhờ lưu số dạng nhị phân và không lặp tên trường.
Tốc độ đọc

Arrow và JSONL
Đọc JSONL bằng json.loads từng dòng mất 276 mili giây. Đọc stream Arrow thành bảng mất 22,5 mili giây. Nhanh hơn khoảng 12 lần, và kết quả đã là cột có kiểu, không phải danh sách dict cần chuyển tiếp.
Chuyển danh sách dict thành batch tốn bao nhiêu
Lab đo thời gian đọc, không đo thời gian bước parse tạo batch. Nếu bước parse vốn tạo danh sách dict, việc chuyển sang batch tốn thêm một bước. Có thể tránh bằng cách để parser ghi thẳng vào các danh sách theo cột rồi tạo batch từ đó, như lab làm với from_pydict.
Pickle đối chứng
Lab thử pickle danh sách 100.000 dict: 8.894 KB, lớn gần gấp đôi Arrow IPC. Pickle chỉ đọc được bằng Python, và đọc pickle từ nguồn không tin cậy là rủi ro bảo mật. Arrow IPC đọc được bằng nhiều ngôn ngữ và không thực thi mã khi đọc.
Không nén khi truyền
Arrow IPC hỗ trợ nén từng bộ đệm bằng lz4 hoặc zstd qua tùy chọn ghi. Lab không bật. Với truyền qua pipe hay ổ đĩa cục bộ, nén thường không đáng vì tốn CPU. Với truyền qua mạng chậm, nén có thể giúp. Lab chưa đo.
Đọc file bằng truy cập ngẫu nhiên và ánh xạ bộ nhớ với Apache Arrow truyền batch crawl
Phần này đọc file mà không đọc toàn bộ.
Mở file bằng memory map
with pa.memory_map("lo.arrow", "r") as src:
f = ipc.open_file(src)
print(f.num_record_batches)
b3 = f.get_batch(3)
open_file đọc phần chân, biết có năm batch. get_batch(3) nhảy thẳng tới batch thứ tư, trả 20.000 dòng, URL đầu tiên là https://shop.vn/p/3-0. Ba batch trước không được đọc.
Không cấp phát thêm bộ nhớ
Lab ghi lượng bộ nhớ pyarrow đã cấp phát trước và sau khi đọc toàn bộ file qua memory map. Con số không đổi: 4.644.800 byte trước và sau. Bảng đọc ra trỏ vào vùng nhớ của tệp, không chép dữ liệu sang bộ nhớ mới.
Với tệp lớn hơn bộ nhớ, cách này cho phép xử lý từng batch mà hệ điều hành tự nạp phần cần. Lab không thử tệp lớn hơn bộ nhớ.
Memory map và tệp bị ghi đè
Khi đọc qua memory map, bảng trỏ thẳng vào tệp trên đĩa. Nếu một tiến trình khác ghi đè tệp trong lúc bảng còn được dùng, dữ liệu trong bảng có thể thay đổi hoặc hỏng. Với trao đổi theo lô, không ghi đè tệp đang được đọc, ghi tệp mới với tên mới.
Truy cập ngẫu nhiên hợp với gì
Bước xử lý song song có thể chia batch cho nhiều tiến trình: tiến trình một đọc batch 0 và 1, tiến trình hai đọc batch 2 và 3. Mỗi tiến trình mở cùng tệp, nhảy tới batch của mình. Với stream, chỉ có thể đọc tuần tự, không chia được như vậy.
File chỉ đọc được sau khi đóng
Phần chân chỉ có khi bên ghi đóng tệp. Trong lúc bên ghi đang ghi, tệp chưa có phần chân, bên đọc chưa mở được. File hợp với trao đổi theo lô: ghi xong, đóng, rồi mới giao cho bên đọc.
Một tệp hay nhiều tệp
Với trao đổi theo lô, có thể ghi mỗi lô một tệp file nhỏ, hoặc một tệp stream dài cho cả ngày. Nhiều tệp nhỏ dễ chia việc và dễ xử lý lại từng phần. Một tệp dài thì gọn hơn nhưng hỏng một chỗ ảnh hưởng nhiều dữ liệu. Với dữ liệu crawl theo trang danh mục, mỗi trang danh mục một tệp nhỏ là cách chia tự nhiên.
Stream đọc được trong lúc ghi
Stream không cần phần chân. Bên đọc có thể bắt đầu nhận batch đầu khi bên ghi còn đang tạo batch sau. Hợp với dòng dữ liệu liên tục như kết quả parse sinh dần.
Truyền qua pipe giữa hai tiến trình với Apache Arrow truyền batch crawl
Phần này truyền stream qua đầu vào chuẩn của tiến trình con.
Bên nhận
r = ipc.open_stream(sys.stdin.buffer)
for b in r:
xu_ly(b)
Tiến trình con mở stream trên đầu vào chuẩn ở chế độ nhị phân, đọc từng batch cho tới hết.
Bên gửi
p = subprocess.Popen([sys.executable, "-c", code], stdin=subprocess.PIPE)
with ipc.new_stream(p.stdin, SCHEMA) as w:
for b in batches:
w.write_batch(b)
p.stdin.close()
Tiến trình cha ghi stream thẳng vào pipe. Không có tệp trung gian, không có bước chuyển đổi nào ở giữa, và không tốn chỗ trên đĩa.
Kết quả

Truyền qua pipe
Tiến trình con báo nhận 5 batch, 100.000 dòng, schema gồm url, price, status, fetched_at. Dữ liệu đi qua ranh giới tiến trình với đầy đủ kiểu, không qua bước chuyển văn bản nào.
Pipe trên Windows
Lab chạy trên Windows, dùng đầu vào chuẩn ở chế độ nhị phân qua sys.stdin.buffer. Dùng sys.stdin ở chế độ văn bản sẽ làm hỏng dữ liệu nhị phân vì chuyển đổi ký tự xuống dòng. Đây là lỗi hay gặp khi chuyển mã từ Linux sang Windows.
Ngôn ngữ khác
Bên nhận có thể viết bằng bất kỳ ngôn ngữ nào có thư viện Arrow: C++, Java, Rust, Go, JavaScript và nhiều ngôn ngữ khác. Định dạng IPC giống nhau. Lab chỉ thử Python với Python, chưa thử ngôn ngữ khác.
Bên nhận sập giữa chừng
Nếu tiến trình nhận sập, pipe bị đóng ở đầu đọc, và lần write_batch tiếp theo của bên gửi sẽ báo lỗi pipe hỏng. Bên gửi biết ngay bên nhận không còn. Lab không thử ca này, nhưng đây là hành vi chung của pipe, không riêng Arrow.
Áp lực ngược
Pipe có bộ đệm giới hạn. Nếu bên nhận xử lý chậm, bên gửi sẽ bị chặn ở write_batch cho tới khi bên nhận đọc bớt. Đây là áp lực ngược tự nhiên, giữ bộ nhớ không phình. Với hàng đợi qua tệp, không có cơ chế này, bên gửi có thể ghi vô hạn.
Truyền qua mạng
Thay pipe bằng socket, cùng mã ghi stream vẫn dùng được, vì new_stream nhận bất kỳ đối tượng ghi được nào. Arrow còn có Arrow Flight, một giao thức dựa trên gRPC để truyền batch qua mạng có xác thực. Lab không thử truyền qua mạng.
Kích thước batch
Batch quá nhỏ làm chi phí mỗi thông điệp chiếm tỷ lệ lớn. Batch quá lớn làm bên nhận phải chờ lâu mới có dữ liệu đầu tiên và tốn bộ nhớ. Lab dùng 20.000 dòng mỗi batch. Với dữ liệu crawl, vài nghìn tới vài chục nghìn dòng là khoảng hợp lý, nên đo với dữ liệu thật.
Kiểm schema lệch và bên ghi sập giữa chừng với Apache Arrow truyền batch crawl
Phần này thử hai loại lỗi.
Lỗi ở bên ghi là lỗi tốt
Lỗi schema ở bên ghi xảy ra ngay tại chỗ sinh ra dữ liệu sai, với đầy đủ ngữ cảnh: trang nào, batch nào, giá trị nào. Người sửa tìm được nguyên nhân nhanh. Lỗi ở bên đọc, như trong bài Parquet, xảy ra muộn và xa nguồn gốc, khó lần lại.
Ghi batch có schema khác
Lab mở stream với SCHEMA, ghi một batch đúng, rồi ghi một batch có price là chuỗi 150.000. write_batch báo ArrowInvalid: Tried to write record batch with different schema. Batch lệch bị chặn ngay lúc ghi.
Khác với Parquet trong bài trước, nơi các tệp riêng lẻ có thể mang schema khác nhau, một stream Arrow chỉ có một schema. Mọi batch phải khớp. Lỗi xảy ra ở bên ghi, không đợi tới bên đọc.
Mô phỏng sập bằng cắt tệp
Lab không giết tiến trình thật, mà cắt tệp đã ghi xong còn 60 phần trăm. Kết quả tương đương với tiến trình ghi bị dừng đột ngột sau khi ghi khoảng ba phần năm dữ liệu, trước khi đóng. Cách mô phỏng này cho kết quả lặp lại được mỗi lần chạy.
Bên ghi sập giữa chừng: stream
Lab cắt tệp stream còn 60 phần trăm dung lượng, mô phỏng bên ghi sập khi đang ghi batch thứ ba. Đọc stream này, bên đọc nhận được 40.000 dòng, tức hai batch đầu đầy đủ, rồi báo OSError: không đọc đủ số byte cho thân thông điệp.
Hai batch đầu dùng được. Batch thứ ba bị hỏng và bị loại. Bên đọc biết chính xác mình đã nhận đến đâu.
Bên ghi sập giữa chừng: file

Tệp bị cắt
Lab cắt tệp file còn 60 phần trăm. open_file báo ArrowInvalid: Not an Arrow file. Không đọc được batch nào, kể cả những batch đã ghi đầy đủ.
Lý do là phần chân nằm ở cuối tệp, bị cắt mất. Không có phần chân, trình đọc không biết đây là tệp Arrow hợp lệ. Toàn bộ dữ liệu trong tệp trở nên không dùng được bằng open_file.
Chọn định dạng theo rủi ro
Tình huống |
stream |
file |
|---|---|---|
Đọc khi bên ghi chưa xong |
được |
không |
Truy cập ngẫu nhiên batch |
không |
được |
Bên ghi sập giữa chừng |
đọc được các batch đủ |
không mở được |
Ghi batch lệch schema |
bị chặn khi ghi |
bị chặn khi ghi |
Ánh xạ bộ nhớ không chép |
đọc tuần tự |
được |
Ghi file an toàn
Nếu cần định dạng file, ghi vào tệp tạm rồi đổi tên sau khi đóng. Bên đọc chỉ thấy tệp hoàn chỉnh. Nếu bên ghi sập, tệp tạm dở dang bị bỏ, không ai đọc nhầm. Lab chưa cài bước đổi tên, chỉ thử tệp bị cắt để thấy hậu quả.
Đọc phần còn lại của file bị cắt
open_file không mở được file bị cắt, nhưng phần đầu của file có cùng cấu trúc với stream. Về lý thuyết, có thể đọc phần đầu bằng trình đọc stream để cứu các batch đủ. Lab chưa thử cách này, và không nên dựa vào nó trong thiết kế. Ghi qua tệp tạm là cách phòng tránh đúng.
Đánh dấu tiến độ
Với stream truyền qua pipe, bên nhận nên ghi lại số batch đã xử lý xong. Nếu bên gửi sập và khởi động lại, bên gửi có thể bỏ qua những batch bên nhận đã xác nhận. Arrow không lo việc này, đó là logic của pipeline.
Đầu ra nghiệm thu: RecordBatch qua IPC, số đo và ca lỗi của Apache Arrow truyền batch crawl
Phần cuối gom kết quả thành bộ bàn giao.
Một batch cũng là một đơn vị xác nhận
Vì stream bị cắt vẫn giữ được các batch đủ, mỗi batch có thể coi là một đơn vị dữ liệu hoàn chỉnh. Thiết kế batch theo đơn vị có ý nghĩa, như một trang danh mục hay một nguồn, giúp việc xử lý lại sau sự cố đơn giản: biết batch nào đã nhận, gửi lại batch còn thiếu.
Bộ bàn giao
Bộ bàn giao gồm lab.py ghi năm batch ra stream, file, JSONL, đọc lại, truyền qua pipe, thử schema lệch và tệp bị cắt. Người nhận chạy lại, phải thấy stream và file cùng 4.537 KB, đọc Arrow nhanh hơn JSONL hơn mười lần, stream bị cắt đọc được 40.000 dòng, file bị cắt không mở được.
Tiêu chí đạt
Bước parse ghi batch theo schema cố định. Batch lệch schema bị chặn ở bên ghi. Bên nhận đọc đủ dữ liệu với đúng kiểu. Lỗi giữa chừng được nhận ra và không làm mất các batch đã nhận đủ khi dùng stream.
Kiểm schema ở bên nhận
Bên nhận nên so schema của stream với schema mong đợi ngay khi mở, trước khi đọc batch nào. Nếu bên gửi đổi schema, ví dụ thêm cột, bên nhận biết ngay và quyết định chấp nhận hay từ chối. Lỗi phát hiện ở đầu luồng rẻ hơn nhiều so với lỗi phát hiện sau khi đã xử lý một nửa dữ liệu.
Quy tắc chọn định dạng
Dùng stream cho dữ liệu truyền liên tục qua pipe hay socket, và khi cần đọc trong lúc bên ghi chưa xong. Dùng file cho trao đổi theo lô qua đĩa, khi cần truy cập ngẫu nhiên hay ánh xạ bộ nhớ, và luôn ghi qua tệp tạm rồi đổi tên. Lưu trữ dài hạn thì chuyển sang Parquet.
Khi nào cần proxy với Apache Arrow truyền batch crawl
Arrow IPC truyền dữ liệu giữa các tiến trình trên cùng máy hoặc qua mạng nội bộ, không liên quan tới proxy IP. Proxy chỉ liên quan tới bước crawl trước khi có dữ liệu để parse. Nếu stream được gửi qua mạng tới máy khác, đó là kết nối nội bộ, không nên đi qua proxy dùng cho crawl.
Với bước crawl website được phép thu thập, có lúc cần IP tại Việt Nam để nhận đúng trang trong nước. Khi đó anh em có thể mua proxy tĩnh Việt Nam tại trang chủ ProxyVN. Proxy không làm batch truyền nhanh hơn và không sửa schema lệch. Vai trò hợp lệ của proxy được giải thích ở bài Web Scraping proxy là gì.
Tách cấu hình mạng
Tiến trình crawl có thể đặt biến môi trường proxy. Nếu tiến trình đó cũng gửi stream Arrow qua mạng nội bộ, nên loại địa chỉ nội bộ khỏi proxy bằng NO_PROXY. Cách viết chuỗi proxy và cấu hình loại trừ có trong bài định dạng proxy.
Đo trước khi chuyển
Trước khi thay JSONL bằng Arrow trong pipeline thật, đo thời gian của từng bước hiện tại. Nếu bước chậm nhất là tải trang hay gọi mạng, đổi định dạng trao đổi không làm pipeline nhanh hơn đáng kể. Arrow giúp nhiều nhất khi bước đọc ghi dữ liệu trung gian là điểm nghẽn.
Những gì lab chưa thử
Lab chưa thử Arrow Flight để truyền qua mạng, chưa thử nén lz4 hay zstd trong IPC, chưa thử bên nhận bằng ngôn ngữ khác Python. Lab chưa thử tệp lớn hơn bộ nhớ với memory map, chưa thử kiểu lồng nhau như danh sách hay struct. Thời gian đo trên một máy, một lần.
Checklist Apache Arrow truyền batch crawl

Checklist
- Schema cố định, tạo batch bằng from_pydict với schema.
- Stream cho dữ liệu liên tục, file cho trao đổi theo lô.
- Ghi file qua tệp tạm rồi đổi tên.
- Bên nhận ghi lại số batch đã xử lý xong.
- Bắt OSError khi đọc stream để biết đã nhận tới đâu.
- Chọn kích thước batch vài nghìn tới vài chục nghìn dòng.
- Không dùng pickle để trao đổi giữa tiến trình.
- Lưu dài hạn bằng Parquet, không bằng IPC.
Câu hỏi thường gặp về Apache Arrow truyền batch crawl
Stream và file khác nhau thế nào?
Stream đọc tuần tự, đọc được khi bên ghi chưa xong. File có phần chân ở cuối, cho truy cập ngẫu nhiên nhưng chỉ đọc được sau khi đóng.
Arrow IPC nhanh hơn JSON bao nhiêu?
Trong lab, đọc 100.000 dòng mất 22,5 mili giây với Arrow so với 276 mili giây với JSONL.
Bên ghi sập thì mất gì?
Với stream, lab đọc được hai batch đầu đủ rồi gặp lỗi. Với file, lab không mở được tệp vì mất phần chân.
Ghi batch sai schema thì sao?
Bị chặn ngay khi ghi, lab nhận ArrowInvalid báo schema khác.
Có nên dùng Arrow IPC để lưu dài hạn?
Không. IPC tối ưu cho trao đổi, lưu dài hạn nên dùng Parquet nén chặt hơn.
Truyền Arrow có cần proxy không?
Không. Proxy chỉ liên quan tới bước crawl trước đó.
Apache Arrow truyền batch crawl và những điều cần nhớ
Apache Arrow truyền batch crawl thay JSON bằng dữ liệu cột có kiểu giữa các bước, nhỏ hơn và đọc nhanh hơn hơn mười lần trong lab. Stream cho phép đọc dần và giữ được các batch đủ khi bên ghi sập, còn file cho truy cập ngẫu nhiên nhưng mất trắng nếu phần chân bị cắt. Batch lệch schema bị chặn ngay ở bên ghi. Chọn định dạng theo cách trao đổi, và luôn ghi file qua tệp tạm. Cần IP tĩnh cho bước crawl trước khi Apache Arrow truyền batch crawl, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.