Cần trợ giúp để thực hiện phương pháp hay nhất. Môi trường hoạt động như sau:Apache Spark on YARN: Số lượng lớn các tệp dữ liệu đầu vào (kết hợp nhiều tệp đầu vào trong tia lửa)
- Tệp dữ liệu nhật ký đến không đều.
- Kích thước của tệp dữ liệu nhật ký là từ 3.9KB đến 8.5MB. Trung bình khoảng 1MB.
- Số lượng hồ sơ của tệp dữ liệu là từ 13 dòng đến 22000 dòng. Trung bình là khoảng 2700 dòng.
- Tệp dữ liệu phải được xử lý trước khi tổng hợp.
- Thuật toán xử lý sau có thể thay đổi.
- Tệp được xử lý sau được quản lý riêng với tệp dữ liệu gốc vì thuật toán sau xử lý có thể bị thay đổi.
- Kết hợp hàng ngày được thực hiện. Tất cả các tệp dữ liệu sau xử lý phải được lọc theo từng bản ghi và tổng hợp (trung bình, tối đa ...) được tính toán.
- Vì tổng hợp là chi tiết, số lượng bản ghi sau khi tổng hợp không quá nhỏ. Nó có thể bằng một nửa số lượng bản ghi gốc.
- Tại một thời điểm, số lượng tệp được xử lý sau có thể là khoảng 200.000.
- Tệp dữ liệu sẽ có thể bị xóa riêng lẻ.
Trong thử nghiệm, tôi đã cố gắng xử lý 160.000 tệp được xử lý sau bởi Spark bắt đầu bằng sc.textFile() với đường dẫn glob, không thành công với ngoại lệ OutOfMemory trên quy trình trình điều khiển.
Phương pháp hay nhất để xử lý loại dữ liệu này là gì? Tôi có nên sử dụng HBase thay vì các tệp đơn giản để lưu dữ liệu đã xử lý không?
Cảm ơn bạn đã chia sẻ điều này. Tôi nghĩ rằng đối số kích thước đặc biệt có giá trị, vì nó không thể được xác định trên coalesce(). – zeodtr
Giải pháp này là tốt hơn so với coalesce bởi vì nó hoạt động ở giai đoạn bản đồ, nhưng sau đó kết hợp lại. –
Kể từ bây giờ, Hadoop hỗ trợ CombineTextInputFormat (ít nhất là từ 2.2), kết hợp các tệp đầu vào nhỏ có thể được thực hiện với sc.newAPIHadoopFile(), mà không cần triển khai một lớp tùy chỉnh. – zeodtr