Introduction
Blog này giới thiệu về cách thiết lập phân tích realtime mã nguồn mở. Chúng tôi sẽ sử dụng Kafka và Apache {Airflow, Superset, Druid}.
Việc có số liệu phân tích của bạn theo kiểu truyền trực tuyến cho phép bạn liên tục phân tích hành vi của khách hàng và hành động theo hành vi đó. Chung quy là mình cũng muốn test thử khả năng realtime của Druid mình đang nghiên cứu một vài solution realtime analytic chi tiết code có thể tham khảo tại repo Github
Trong bài viết này sử dụng Aiflow như một producer có nhiệm vụ gửi data đến kafka topic, dữ liệu phân tích được lưu trữ trong Druid và được hiển thị trực quan bằng Superset.
Kafka
Kafka là một hệ thống message theo cơ chế Pub-Sub. Nó cho phép các nhà sản xuất (gọi là producer) viết các message vào Kafka mà một, hoặc nhiều người tiêu dùng (gọi là consumer) có thể đọc, xử lý được những message đó. Các message được gửi tới Kafka theo Topic, các Topic giống như là các kênh lưu trữ message từ Producer gửi đến Kafka, người tiêu dùng (Consumer) đăng kí một hoặc nhiều Topic để tiêu thụ những message đó.
Kafka có thời gian lưu giữ, vì vậy nó sẽ lưu trữ message của bạn theo thời gian hoặc kích thước bạn cấu hình và có thể được chỉ định gửi theo Topic.Kafka hoạt động tốt khi kết hợp với Apache Flink và Apache Spark để phân tích và hiển thị dữ liệu truyền trực tuyến theo thời gian thực. Trong bài viết này kafka được sử dụng để thu thập dữ liệu và load vào trong Druid.
Druid
Druid cung cấp khả năng nhập dữ liệu thời gian thực có độ trễ thấp từ Kafka, thăm dò dữ liệu linh hoạt và tổng hợp dữ liệu nhanh chóng. Druid không được coi là một hồ dữ liệu (data lake) mà thay vào đó là một dòng sông dữ liệu. Vì dữ liệu đang được tạo ra bởi người dùng, cảm biến hoặc bất cứ thứ gì, nó sẽ chảy trong bối cảnh ứng dụng. Như với thiết lập Hive / Presto, dữ liệu thường thực hiện hàng giờ hoặc hàng ngày, nhưng với Druid, dữ liệu có sẵn để truy vấn khi truy cập vào cơ sở dữ liệu. Druid đươck đánh giá là cải thiện 90% -98% tốc độ so với Apache Hive (chưa kiểm chứng).
Superset
Apache SuperSet là một công cụ trực quan hóa dữ liệu Nguồn mở có thể được sử dụng để biểu diễn dữ liệu bằng đồ họa. Superset ban đầu được tạo ra bởi AirBnB và sau đó được phát hành cho cộng đồng Apache. Apache Superset được phát triển bằng ngôn ngữ Python và sử dụng Flask Framework cho tất cả các tương tác web. Superset hỗ trợ phần lớn RDMBS thông qua SQL Alchemy.
Bắt đầu thôi!
Sử dụng Docker, thật dễ dàng để thiết lập một phiên bản cục bộ và có thể thử và khám phá các khả năng.
Để thiết lập hệ thống, bắt đầu bằng cách sao chép kho lưu trữ git:
git clone https://github.com/apot-group/real-time-analytic.git
cd real-time-analytic
Tiếp theo, chúng ta cần xây dựng các hình ảnh cục bộ:
docker-compose rm -f && docker-compose build && docker-compose up
Vì xây dựng hình ảnh từ đầu, nên việc này có thể mất một lúc. Sau khi thực hiện lệnh docker-compile up, các dịch vụ sẽ khởi động. Có thể mất một khoảng thời gian trước khi mọi thứ bắt đầu và chạy.
Service | URL | User/Password |
---|---|---|
Druid Unified | http://localhost:8888/ | None |
Druid Legacy | http://localhost:8081/ | None |
Superset | http://localhost:8088/ | docker exec -it superset bash superset-init |
Airflow | http://localhost:3000/ | admin - a-airflow/app/standalone_admin_password.txt |
Lưu ý là với airflow user admin và password sẽ tự tạo tại a-airflow/app/standalone_admin_password.txt dùng thông tin này để đăng nhập nhé. Còn với superset thì cần đi đến container đang chạy và thực hiện lệnh init để tạo user với pass:
docker exec -it <superset_container_name> bash superset-init
Airflow dags tại a-airflow /app/dags/demo.py mỗi phút sẽ gữi tin nhắn đến topic 'demo' kafka với dữ liệu về danh sách coin ['BTC', 'ETH', 'BTT', 'DOT']
cấu trúc của thông báo dữ liệu như bên dưới. để bật start streaming thì login vào airflow và bật dags demo lên nhé.
{ "data_id" : 454, "name": 'BTC', "timestamp": '2021-02-05T10:10:01'
}
Từ http://localhost:8888/ chọn load data > kafka điền thông tin kafka server kakfa:9092
và topic demo
và config output.
Cuối cùng là login vào Superset http://localhost:8088/ tạo kết nối với với druid như một database với sqlalchemy uri: druid://broker:8082/druid/v2/sql/
chi tiết các kết nối hơn có thể tham khảo Superset-Database-Connect
Cuối cùng là tạo chart > dashboard và enjoy cái moment thoi!