Tuyên bố từ chối trách nhiệm: Tôi là người khởi xướng Flink Apache và thành viên PMC và chỉ quen thuộc với thiết kế cấp cao của Storm chứ không phải nội bộ của Storm.
Apache Flink là một khuôn khổ cho quy trình xử lý luồng và hợp nhất. Flink của thời gian chạy natively hỗ trợ cả hai tên miền do truyền dữ liệu pipelined giữa các nhiệm vụ song song bao gồm shuffles pipelined. Hồ sơ được chuyển ngay lập tức từ các nhiệm vụ sản xuất để nhận nhiệm vụ (sau khi được thu thập một bộ đệm để chuyển mạng). Công việc hàng loạt có thể được thực thi tùy chọn bằng cách sử dụng truyền dữ liệu chặn.
Apache Spark là một khuôn khổ cũng hỗ trợ xử lý hàng loạt và luồng. API hàng loạt của Flink trông khá giống nhau và đề cập đến các trường hợp sử dụng tương tự như Spark nhưng khác nhau ở bên trong. Để phát trực tuyến, cả hai hệ thống đều tuân theo các cách tiếp cận rất khác nhau (các lô nhỏ so với phát trực tuyến), điều này giúp chúng phù hợp với các loại ứng dụng khác nhau. Tôi có thể nói so sánh Spark và Flink là hợp lệ và hữu ích, tuy nhiên Spark không phải là công cụ xử lý luồng tương tự nhất cho Flink.
Đến với câu hỏi ban đầu, Apache Storm là bộ xử lý luồng dữ liệu không có khả năng theo lô. Trong thực tế, động cơ pipelined của Flink trông hơi giống Storm, tức là các giao diện của các tác vụ song song của Flink tương tự như các bu lông của Storm. Storm và Flink có điểm chung là chúng nhằm mục đích xử lý luồng trễ thấp bằng cách truyền dữ liệu pipelined. Tuy nhiên, Flink cung cấp API cấp cao hơn so với Storm. Thay vì thực hiện chức năng của một bu lông với một hoặc nhiều người đọc và người thu thập, API DataStream của Flink cung cấp các chức năng như Bản đồ, GroupBy, Cửa sổ và Tham gia. Rất nhiều chức năng này phải được thực hiện thủ công khi sử dụng Storm. Một khác biệt khác là xử lý ngữ nghĩa. Storm đảm bảo xử lý ít nhất một lần trong khi Flink cung cấp chính xác một lần. Các triển khai cung cấp cho các đảm bảo xử lý khác nhau khá một chút. Trong khi Storm sử dụng các xác nhận mức kỷ lục, Flink sử dụng một biến thể của thuật toán Chandy-Lamport. Tóm lại, các nguồn dữ liệu định kỳ tiêm các dấu mốc vào luồng dữ liệu. Bất cứ khi nào một nhà điều hành nhận được một điểm đánh dấu như vậy, nó sẽ kiểm tra trạng thái bên trong của nó. Khi một điểm đánh dấu được nhận bởi tất cả các bồn chứa dữ liệu, điểm đánh dấu (và tất cả các bản ghi đã được xử lý trước đó) được cam kết. Trong trường hợp thất bại, tất cả các nhà khai thác nguồn sẽ được đặt lại về trạng thái của họ khi họ thấy điểm đánh dấu đã cam kết cuối cùng và quá trình xử lý được tiếp tục. Cách tiếp cận điểm đánh dấu này là nhẹ hơn sự thừa nhận mức kỷ lục của Storm. Điều này slide set và tương ứng talk thảo luận về phương pháp xử lý luồng của Flink bao gồm khả năng chịu lỗi, kiểm tra điểm và xử lý trạng thái.
Bão cũng cung cấp API chính xác một lần, được gọi là Trident. Tuy nhiên, Trident được dựa trên các lô nhỏ và do đó tương tự như Spark hơn Flink.
Độ trễ có thể điều chỉnh của Flink đề cập đến cách Flink gửi bản ghi từ một tác vụ sang tác vụ khác. Tôi đã nói trước đó, Flink sử dụng truyền dữ liệu pipelined và chuyển tiếp các bản ghi ngay khi chúng được tạo ra. Để có hiệu quả, các bản ghi này được thu thập trong bộ đệm được gửi qua mạng khi đã đầy hoặc một ngưỡng thời gian nhất định được đáp ứng. Ngưỡng này kiểm soát độ trễ của các bản ghi vì nó chỉ định khoảng thời gian tối đa mà một bản ghi sẽ ở trong bộ đệm mà không được gửi đến tác vụ tiếp theo. Tuy nhiên, nó không thể được sử dụng để bảo đảm chắc chắn về thời gian cần thiết cho một bản ghi từ khi rời khỏi chương trình vì điều này cũng phụ thuộc vào thời gian xử lý trong các nhiệm vụ và số lượng chuyển mạng trong số những thứ khác.
Nguồn
2015-06-08 21:08:56
Lưu ý rằng Apache * Spark * (trọng tâm của câu hỏi được liên kết) không giống với Apache * Storm * (câu hỏi này) - vì vậy, không, điều này không có nghĩa là trùng lặp. – fnl