5

Tôi đang viết một ứng dụng có Luồng Kafka (v0.10.0.1) và muốn làm phong phú thêm các bản ghi mà tôi đang xử lý bằng dữ liệu tra cứu. Dữ liệu này (tệp thời gian) được ghi vào thư mục HDFS trên cơ sở hàng ngày (hoặc 2-3 lần một ngày).Dòng Kafka với dữ liệu tra cứu trên HDFS

Làm cách nào để tải ứng dụng này trong ứng dụng Kafka Streams và tham gia vào KStream thực tế?
Thực hành tốt nhất để đọc lại dữ liệu từ HDFS khi một tệp mới đến đó là gì?

Hoặc sẽ chuyển đổi thành Kafka Connect và viết nội dung bảng RDBMS thành chủ đề Kafka có thể được tiêu thụ bởi tất cả các trường hợp ứng dụng Kafka Streams?

Cập nhật:
Như đã đề cập Kafka Connect sẽ là con đường để đi. Vì dữ liệu tra cứu được cập nhật trong RDBMS trên cơ sở hàng ngày, tôi đã nghĩ đến việc chạy Kafka Connect theo lịch biểu one-off job thay vì giữ kết nối luôn mở. Có, bởi vì ngữ nghĩa và chi phí của việc giữ một kết nối luôn luôn mở và đảm bảo rằng nó sẽ không bị gián đoạn..vv. Đối với tôi, việc tìm nạp được lên lịch trong trường hợp này sẽ an toàn hơn.

Dữ liệu tra cứu không lớn và các bản ghi có thể là đã xóa/thêm/sửa đổi. Tôi không biết làm thế nào tôi luôn có thể có một bãi chứa đầy đủ vào một chủ đề Kafka và cắt ngắn các hồ sơ trước đó. Việc bật tính năng nén nhật ký và gửi giá trị null cho các khóa đã bị xóa có thể sẽ không hoạt động vì tôi không biết những gì đã bị xóa trong hệ thống nguồn. Ngoài ra AFAIK tôi không có quyền kiểm soát khi quá trình nén xảy ra.

+1

Tôi không quen với các chi tiết của Kafka Connect, nhưng việc sử dụng nó để đưa dữ liệu vào một chủ đề là cách được khuyến nghị để xử lý nó bằng luồng Kafka. Tuy nhiên, nó sẽ là xấu cho trường hợp của bạn nếu Connect cập nhật liên tục thay vì hàng ngày? Thay vào đó, bạn luôn có thể sử dụng API bộ xử lý cho phép thực thi mã tùy ý. Tuy nhiên, nó nỗ lực nhiều hơn để sử dụng. –

Trả lời

2

Cách tiếp cận đề xuất cũng thực sự là nhập dữ liệu tra cứu vào Kafka - ví dụ thông qua Kafka Connect - như bạn đã đề xuất ở trên.

Nhưng trong trường hợp này làm cách nào tôi có thể lên lịch công việc Connect để chạy hàng ngày thay vì tìm nạp liên tục từ bảng nguồn không cần thiết trong trường hợp của tôi?

Có lẽ bạn có thể cập nhật câu hỏi của mình mà bạn không muốn thực hiện công việc Kafka Connect liên tục? Bạn có quan tâm đến việc tiêu thụ tài nguyên (tải trên DB), bạn có lo lắng về ngữ nghĩa của việc xử lý nếu nó không phải là "hàng ngày udpates", hay ...?

Cập nhật: Như đã đề cập Kafka Connect sẽ là con đường để đi. Bởi vì dữ liệu tra cứu được cập nhật trong RDBMS trên cơ sở hàng ngày, tôi đã nghĩ đến việc chạy Kafka Connect như một công việc một lần được lập lịch thay vì giữ kết nối luôn mở. Có, bởi vì ngữ nghĩa và chi phí của việc giữ một kết nối luôn luôn mở và đảm bảo rằng nó sẽ không bị gián đoạn..vv. Đối với tôi, việc tìm nạp được lên lịch trong trường hợp này sẽ an toàn hơn.

Kafka Connect là an toàn, và kết nối JDBC đã được xây dựng cho chính xác mục đích ăn bảng DB vào Kafka một cách mạnh mẽ, fault-tolerant, và performant (có rất nhiều triển khai sản xuất đã được). Vì vậy, tôi sẽ đề nghị không dự phòng để "cập nhật hàng loạt" mô hình chỉ vì "nó trông an toàn hơn"; cá nhân, tôi nghĩ rằng kích hoạt ingestions hàng ngày là hoạt động kém thuận tiện hơn là chỉ giữ nó chạy cho liên tục (và thời gian thực!), và nó cũng dẫn đến một số nhược điểm cho trường hợp sử dụng thực tế của bạn (xem đoạn tiếp theo).

Nhưng tất nhiên, số dặm của bạn có thể thay đổi - vì vậy nếu bạn được cài đặt cập nhật chỉ một lần mỗi ngày, hãy thực hiện. Nhưng bạn mất khả năng làm phong phú thêm các bản ghi của bạn với dữ liệu DB mới nhất tại thời điểm khi việc làm giàu xảy ra, và ngược lại, b) bạn có thể làm phong phú thêm các bản ghi đến với dữ liệu cũ/cũ cho đến ngày tiếp theo cập nhật hoàn thành, mà hầu hết có thể sẽ dẫn đến dữ liệu không chính xác mà bạn đang gửi hạ lưu/cung cấp cho các ứng dụng khác để tiêu thụ. Ví dụ: nếu khách hàng cập nhật địa chỉ giao hàng (trong DB) nhưng bạn chỉ cung cấp thông tin này cho ứng dụng xử lý luồng của mình (và có khả năng nhiều ứng dụng khác) một lần mỗi ngày thì ứng dụng xử lý đơn đặt hàng sẽ gửi các gói đến sai địa chỉ cho đến khi lần nhập hàng ngày tiếp theo sẽ hoàn thành.

Dữ liệu tra cứu không lớn và các bản ghi có thể bị xóa/thêm/sửa đổi. Tôi không biết làm thế nào tôi luôn có thể có một bãi chứa đầy đủ vào một chủ đề Kafka và cắt ngắn các hồ sơ trước đó. Việc bật tính năng nén nhật ký và gửi giá trị null cho các khóa đã bị xóa có thể sẽ không hoạt động vì tôi không biết những gì đã bị xóa trong hệ thống nguồn.

Trình kết nối JDBC cho Kafka Connect đã xử lý tự động cho bạn: 1. nó chèn/cập nhật/xóa được phản ánh chính xác trong chủ đề Kafka và 2. Biên dạng nhật ký của Kafka đảm bảo rằng chủ đề mục tiêu không không phát triển ngoài giới hạn. Có lẽ bạn có thể muốn đọc lên trên trình kết nối JDBC trong tài liệu để tìm hiểu chức năng nào bạn chỉ nhận được miễn phí: http://docs.confluent.io/current/connect/connect-jdbc/docs/?

+0

đã cập nhật câu trả lời của tôi :-) –

Các vấn đề liên quan