Trong project này, chúng ta sẽ sử dụng SMACK Stack để viết chương trình ứng dụng Lambda Architecture trong việc phân tích bài đăng trên Twitter. Ở đây chúng ta chỉ giới hạn bài toán trong việc thống kê và tìm các hashtag phổ biến nhất được đăng tải trên Twitter về một chủ đề cụ thể nhằm mô phỏng nguyên tắc hoạt động cũng như cách thức xây dựng một hệ thống Lambda Architecture với SMACK stack.

Cấu trúc tổng quan của hệ thống có thể được mô tả như hình dưới đây:

Trước hết chúng ta sẽ sử dụng thư viện Twitter4J (xem thêm tại bài tutorial Xử lý dữ liệu Twitter trong thời gian thực) để thu thập các tweet đăng tải trên Twitter rồi truyền về Kafka. Dữ liệu từ Kafka sau đó được lưu vào Cassandra Database, đồng thời cũng được chuyển đến Spark Streaming để thực hiện việc xử lý thông tin trong thời gian thực. Tiếp theo chúng ta sử dụng Spark Batch Processing để phân tích dữ liệu trong Cassandra. Ở đây ta sử dụng Akka Scheduler để thiết lập việc chay Batch processing cứ 30 phút một lần. Kết quả phân tích của Spark Streaming (real time) và Spark Batch processing sau đó được lưu vào Cassandra. Cuối cùng, chúng ta viết một Client UI đơn giản và sử dụng Akka HTTP để tạo ra REST API nhằm giúp người dùng có thể truy xuất được thông tin cần thiết.

Ngôn ngữ chủ yếu sử dụng trong Project này là Scala (ngoại trừ ClientUI được viết bằng Java) và các đoạn code được chia thành 5 packages (main_package, data_collector package và 3 packages còn lại tương ứng với 3 layers của Lambda Architecture như đã trình bày trong bài tutorial Giới thiệu về Lambda Architecture) như sau:

– main_package: đây là package chứa đoạn code để chạy Lambda Architecture (Server side) và User Interface (Client side). Mục tiêu của project là về Lambda Architecture do đó Client side chỉ là một UI đơn giản nhằm giúp người dùng có thể truy xuất thông tin cần thiết từ hệ thống.

– data_collector: package này thực hiện nhiệm vụ thu thập các streaming tweet trên Twitter rồi truyền về Kafka broker. Sau đó dữ liệu của Kafka Broker được kết nối và lưu vào trong Cassandra Database bằng cách sử dụng Kafka Cassandra Sink (xem thêm tại bài tutorial Kết nối Kafka với Cassandra Sink). Trung package này, chúng ta sẽ sử dụng ba thành phần là C(Cassandra), A(Akka) và K(Kafka) của SMACK stack

– batch_layer: package này thực hiện nhiệm vụ của Batch Layer trong Lambda Architecture bằng việc sử dụng Spark Cassandra Connector để đọc dữ liệu từ Cassandra Database rồi dùng Spark DataFrame để phân tích dữ liệu. Sau đó, kết quả phân tích được lưu vào batch_view table trong Cassandra Database. Bên cạnh việc sử dụng S(Spark) và C(Cassandra), package này còn sử dụng A(Akka) để phát triển các actor đảm nhận vai trò Batch Processing.

– speed_layer: package này thực hiện nhiệm vụ của Speed Layer trong Lambda Architecture bằng việc sử dụng Spark Structured Streaming để đọc dữ liệu từ Kafka broker rồi dùng Spark DataFrame để phân tích dữ liệu. Sau đó, kết quả phân tích được lưu vào realtime_view table trong Cassandra Database. Như vậy package này sử dụng cả bốn thành phần là S(Spark), A(Akka), C(Cassandra) và K(Kafka) trong SMACK stack. Akka ở đây cũng được sử dụng để phát triển các actor đảm nhận vai trò Realtime Processing tương tự như trong batch_layer.

– serving_layer: package này thực hiện nhiệm vụ của Serving Layer trong Lambda Architecture bằng việc sử dụng Akka Http để cung cấp RestAPI giúp người dùng có thể truy cập dữ liệu từ UI ở Client side. Khi người dùng gửi một GET request thì RestAPI sẽ đọc dữ liệu từ Cassandra Database rồi trả về kết quả là kết quả tổng hợp của cả batch_view và realtime_view.

Các bạn có thể tham khảo full code của project này trên trang Gihub của ITechSeeker tại đây.

Tháng Ba 11, 2019
ITechSeeker