Trong bài báo cáo này, với ý tưởng từ kiến trúc Lambda áp dụng vào xây dựng một hệ thống dữ liệu thống kê dữ liệu lịch sử và dự đoán giao dịch bất thường của sự kiện giao dịch của khá
VẤN ĐỀ VÀ HƯỚNG GIẢI QUYẾT
ĐẶT VẤN ĐỀ
Trong bất cứ lĩnh vực nào thì các giao dịch khách hàng là yếu tố quan trọng để phân tích hành vi, thông tin giao dịch và nếu giao dịch đó có vấn đề dựa vào các phân tích có thể đưa ra hướng giải quyết khắc phục.
HƯỚNG GIẢI QUYẾT
Áp dụng cách xử lý dữ liệu của kiến trúc Lambda là xử lý dữ liệu lịch sử và dữ liệu theo thời gian thực để xây dựng mô hình xử lý dữ liệu để phát hiện ra các giao dịch bất thường
CƠ SỞ LÝ THUYẾT
GIỚI THIỆU
2.1.1 Khái niệm về dữ liệu
Chúng ta đang sống trong thời đại công nghệ ngày càng phát triển lớn mạnh thì sẽ có rất nhiều câu hỏi được đặt ra đó là dữ liệu là gì và chúng được hình thành như thế nào Một cách hiểu đơn giản thì dữ liệu là các thông tin, sự hiểu biết sâu sắc, kiến thức và sức mạnh để đưa ra nhận xét và phân tích dự đoán trên dữ liệu thu thập được Xung quanh cuộc sống hằng ngày đều tồn tại dữ liệu Những tiến bộ trong tin học trong những thập kỷ qua cho phép hàng loạt các nguồn dữ liệu mới ra đời Với việc ảnh hưởng đến lượng dữ liệu được tạo ra, bên cạnh đó phải có các phương pháp mới để lưu trữ dữ liệu này một cách hiệu quả, xử lý và biến nó thành những tập dữ liệu có giá trị
Dữ liệu có thể được coi là một đơn vị thông tin, do đó giá trị thực của dữ liệu được liên kết chặt chẽ với giá trị của thông tin có thể được trích xuất từ nó Thông tin có thể cải thiện việc ra quyết định, thúc đẩy tiến bộ khoa học và thịnh vượng kinh tế, về cơ bản là cải thiện và nâng cao chất lượng cuộc sống
Dữ liệu lớn (Big Data) là một thuật ngữ tương đối mới đang trở nên cực kỳ phổ biến trong vài năm qua Big Data là những nguồn thông tin có đặc điểm chung khối lượng lớn, tốc độ nhanh và dữ liệu định dạng dưới nhiều hình thức khác nhau, do đó muốn khai thác được các tập dữ liệu lớn đòi hỏi phải có hệ thống để đưa ra quyết định, khám phá và tối ưu hóa quy trình xử lý
Bộ dữ liệu lớn có thể được mở rộng lên đến terabyte hoặc thậm chí petabyte của dữ liệu có cấu trúc, bán cấu trúc hoặc phi cấu trúc Big Data cũng thường được mô tả bằng ba chữ V – Volume (khối lượng), Velocity (vận tốc) và Variety (sự đa dạng) [1] Sau này được bổ sung hai V đó là veracity (tính xác thực) và value (giá trị) Năm chữ V được mô tả như sau:
Volume (khối lượng): đặc điểm này đề cập đến số lượng dữ liệu Trước đây, việc lưu trữ hàng terabyte dữ liệu sẽ là một vấn đề đối với các nhà nghiên cứu, nhưng các công nghệ mới đã một phần khắc phục được vấn đề này
Velocity (vận tốc): vận tốc đề cập đến việc tạo dữ liệu và tốc độ di chuyển phải được xử lý kịp thời Đó là một khía cạnh quan trọng đối với dữ liệu đến từ các hệ thống trực tuyến, cảm biến hoặc phương tiện truyền thông xã hội
Variety (sự đa dạng): dữ liệu có thể có đủ loại định dạng, từ dữ liệu có cấu trúc có thể được lưu trữ trong cơ sở dữ liệu truyền thống đến dữ liệu phi cấu trúc như tệp hình ảnh hoặc video
Veracity (độ chính xác): độ chính xác mô tả mức độ chính xác và hợp lệ của dữ liệu Ví dụ về dữ liệu có tính xác thực bao gồm các bài đăng trên Facebook và Twitter có từ viết tắt hoặc lỗi chính tả
Value (giá trị): mô tả giá trị mà dữ liệu nắm giữ Nó thể hiện động lực lớn nhất để lưu trữ và xử lý dữ liệu
2.1.3 Xử lý dữ liệu theo hướng hiện đại
Với việc dữ liệu tăng dần theo thời gian và hình thành các bộ dữ liệu với dung lượng lớn thì bản chất dữ liệu lớn mang lại một số thách thức nếu dữ liệu được xử lý trên quy mô đầy đủ, trong khoảng thời gian có thể chấp nhận được và để cung cấp kết quả nhất quán Để xử lý dữ liệu lớn, một số điểm quan trọng nhất cần được giải quyết là:
Mở rộng cơ sở hạ tầng: các nền tảng dữ liệu có khả năng mở rộng có thể đáp ứng những thay đổi nhanh chóng trong quá trình tăng trưởng dữ liệu, cả về lưu lượng hoặc khối lượng
Xử lý phức tạp: vì dữ liệu đến từ nhiều nguồn ở các định dạng và khối lượng khác nhau nên quá trình xử lý dữ liệu hiện đại có thể bao gồm nhiều lớp và bao gồm các luồng dữ liệu phức tạp
Xử lý nhanh chóng: việc xử lý dữ liệu trong thời gian thực trở thành xu hướng công nghệ ngày nay Trong một số trường hợp, độ mới của dữ liệu có thể quan trọng hơn số
6 lượng hoặc kích thước của dữ liệu Giá trị của dữ liệu có thể giảm theo từng giây, điều này mang lại tầm quan trọng của khả năng xử lý nhanh của hệ thống
Luồng dữ liệu liên tục: dữ liệu được cập nhật liên tục thì các ứng dụng vẫn sẽ tiếp tục chạy mà không bị ảnh hưởng nhiều ngay cả khi có một hoặc nhiều lỗi hệ thống (lỗi máy chủ, lỗi mạng,…) Các ứng dụng sẽ có thể xử lý các lỗi một cách nhẹ nhàng mà không bị mất hoặc gián đoạn dữ liệu
Phân tích hiệu quả, có thể tái sử dụng: tầm quan trọng của khoa học dữ liệu đã tăng lên trong những năm gần đây Khi ngày càng có nhiều công ty sử dụng phương pháp tiếp cận dữ liệu dựa trên quá trình ra quyết định, điều quan trọng là phải đảm bảo rằng tạo ra các kết quả nhất quán, có thể lặp lại
XỬ LÝ DỮ LIỆU
Với việc dữ liệu hình thành liên tục và theo thời gian nó sẽ trở thành tập dữ liệu có dung lượng lớn thì sẽ có các quá trình xử lý phù hợp với tính chất của dữ liệu là một tập dữ liệu cứng hay dữ liệu luồng Có ba quá trình xử lý dữ liệu phổ biến là: batch processing, micro batch processing, streaming processing
Trong quá trình xử lý hàng loạt (batch processing), ta phải đợi một lượng dữ liệu thô nhất định được xếp chồng lên nhau trước khi chạy một job ETL (Hình 3) Thông thường, điều này có nghĩa là dữ liệu có từ một giờ đến vài ngày trước khi được cung cấp để phân tích Các job ETL hàng loạt thường sẽ được chạy theo thời gian được chỉ định trước (ví dụ: mỗi sau 24 giờ) hoặc trong một số trường hợp khi lượng dữ liệu đạt đến một ngưỡng nhất định thì sẽ xử lý theo quá trình batch processing
Hình 3 Kiến trúc batch processing [5]
Xử lý hàng loạt cho phép xử lý dữ liệu ở quy mô lớn, áp dụng nhiều phép biến đổi và tổng hợp khác nhau và cung cấp dữ liệu đầu ra cho các phân tích tiếp theo [5]
Micro batch processing là một phương pháp xử lý hiệu quả các tập dữ liệu lớn với độ trễ giảm và khả năng mở rộng được cải thiện hơn so với batch processing Nó chia các tập dữ liệu lớn thành các lô nhỏ hơn và chạy chúng song song, giúp xử lý kịp thời và chính xác hơn
Quá trình xử lý micro batch sẽ rất hữu ích khi chúng ta cần dữ liệu rất mới, nhưng không nhất thiết phải là thời gian thực – nghĩa là chúng ta không thể đợi một giờ hoặc một ngày để xử lý hàng loạt như batch processing Apache Spark Streaming là framework phổ biến nhất để xử lý micro batch
Stream processing là xử lý dữ liệu ngay khi có dữ liệu xuất hiện trong hệ thống, mở rộng hơn nữa thì stream processing có khả năng làm việc với luồng dữ liệu vô hạn, quá trình tính toán xảy ra liên tục
Quá trình xử lý luồng thường đòi hỏi nhiều tác vụ trên chuỗi dữ liệu đến “luồng dữ liệu”, có thể được thực hiện nối tiếp, song song hoặc cả hai Quy trình này được gọi là quy trình xử lý luồng, bao gồm việc tạo dữ liệu luồng, xử lý dữ liệu và phân phối dữ liệu đến vị trí cuối cùng [6]
Trong xử lý streaming, mỗi bản ghi được gọi là một sự kiện (event) Event liên quan đến một đối tượng cụ thể, độc lập và bất biến, chứa thông tin chi tiết về điều gì đã xảy ra tại một thời điểm Một event có chứa dấu thời gian (timestamp) cho biết thời gian xảy ra
Có 2 thuật ngữ đề cập đến thời gian trong hệ thống streaming:
Event time: thời gian xảy ra sự kiện
Stream time: thời gian sự kiện được đưa vào hệ thống
Trong quá trình xử lý hàng loạt, tệp được ghi một lần và sau đó có thể được đọc nhiều lần Tương tự, trong quá trình xử lý luồng, một sự kiện được tạo một lần thông qua người gửi (sender), sau đó có khả năng được xử lý bởi nhiều người nhận (consumer) Một tập hợp các bản ghi liên quan thường được gọi là một chủ đề (topic)
Hình 4 minh họa cho hệ thống truyền tin (message system) thực hiện thông báo cho consumer về một event mới Sender gửi tin (message) có chứa event, sau đó message được đẩy đến consumer
Một cách tiếp cận phổ biến để thông báo cho consumer về event mới là sử dụng hệ thống message: sender gửi một message có chứa dữ liệu về event để nạp vào consumer
Hệ thống message: hệ thống này hỗ trợ nhiều mô hình giao tiếp các nhau Mỗi mô hình được định nghĩa dựa trên cách trao đổi thông tin không đồng bộ giữa producer và consumer Nhìn chung, có 2 mô hình giao tiếp phổ biến: point-to-point (Hình 5) và publish-and-subscribe (Hình 6)
Message system chịu trách nhiệm truyền dữ liệu, cung cấp cách truyền dữ liệu không đồng bộ giữa producer và consumer.
• Mô hình Point-to-Point/ Message queues
Hình 5 Minh họa mô hình point-to-point [7]
Hình 5 mô tả cách thức hoạt động của hệ thống message với mô hình giao tiếp point- to-point Các message được lưu trữ tuần tự trong một hàng đợi (queue) Các producer (sender) đẩy các message vào cuối hàng đợi và các message đầu tiên được gửi đến consumer đầu tiên
Một message cụ thể chỉ được sử dụng bởi tối đa một consumer duy nhất Khi consumer lấy được một message, nó sẽ được xóa khỏi hàng đợi để consumer tiếp theo nhận được message tiếp theo Điều này cũng là hạn chế đối với hệ thống có nhiều consumer không thể đọc cùng một message từ hàng đợi
Mô hình này thực hiện trao đổi thông tin bằng cách sử dụng hàng đợi, cung cấp giao thức protocol không đồng bộ, nghĩa là người gửi và người nhận không cần có sự tương tác với nhau trong cùng thời điểm
Hình 4 Minh họa hệ thống truyền tin [8]
Nếu consumer không tồn tại trong khi thông tin đã được tạo ra, message sẽ được giữ lại để gửi đi vào lúc khác
KIẾN TRÚC STREAMING PROCESSING
Nhiều yếu tố có thể ảnh hưởng đến việc thiết kế hệ thống dữ liệu bao gồm kỹ năng và kinh nghiệm của người thiết kế, quy mô thời gian cung cấp, sự phụ thuộc của hệ thống cũ, khả năng chịu đựng của tổ chức đối với các loại rủi ro khác nhau hoặc thậm chí các ràng buộc về quy định Nhưng dù trong hoàn cảnh nào, có ba khía cạnh quan trọng mà hệ thống dữ liệu lớn cần tập trung vào:
Reliability (độ tin cậy): hệ thống sẽ tiếp tục hoạt động chính xác (thực hiện đúng chức năng ở mức hiệu suất mong muốn) ngay cả khi đối mặt với nghịch cảnh (phần cứng, phần mềm và lỗi của con người)
Scalability (khả năng mở rộng): khi hệ thống phát triển (dù là khối lượng dữ liệu, lưu lượng truy cập hay độ phức tạp của nó), thì cần có cách đối phó với sự phát triển đó
Maintainability (khả năng bảo trì): nhiều người khác nhau có thể làm việc trên hệ thống theo thời gian (kỹ thuật, vận hành), bảo trì hệ thống hoặc thích ứng với các trường hợp sử dụng mới Tất cả họ sẽ có thể làm việc trên nó một cách hiệu quả
2.4.1 Các thành phần kiến trúc dữ liệu lớn
Việc thuần hóa dữ liệu lớn luôn là một thách thức do bản chất của nó Thu thập, lưu trữ và xử lý hiệu quả một lượng lớn dữ liệu không đồng nhất cần thiết một cách tiếp cận tập trung, sẽ tránh được tất cả các cạm bẫy mà dữ liệu thể hiện ở tất cả các giai đoạn của nó trong hệ thống Kiến trúc dữ liệu lớn đề cập đến logic và cấu trúc vật lý cho biết lượng lớn dữ liệu được nhập, xử lý, lưu trữ, quản lý và truy cập
Hình 8 Kiến trúc dữ liệu lớn [6]
Khi nói về kiến trúc dữ liệu lớn, hầu hết chúng bao gồm một số hoặc tất cả các thành phần như hình Những thành phần trong Hình 8 bao gồm:
Data sources (nguồn dữ liệu): nguồn dữ liệu bao gồm dữ liệu tĩnh, chẳng hạn như các tệp do ứng dụng tạo ra (ví dụ: nhật ký) hoặc nguồn dữ liệu thời gian thực chẳng hạn dữ liệu cảm biến, dữ liệu giao dịch tài chính hoặc các luồng truyền thông xã hội
Data storage (lưu trữ dữ liệu): mục đích của chúng là lưu trữ dữ liệu để xử lý hàng loạt Các kho lưu trữ thường được xây dựng dựa trên ý tưởng “ghi một lần, đọc nhiều lần” Lượng dữ liệu trong chúng thường tăng theo thời gian, điều này yêu cầu lưu trữ dữ liệu phải có khả năng mở rộng và đáng tin cậy
Batch processing (xử lý hàng loạt): xử lý hàng loạt cho phép xử lý dữ liệu ở quy mô lớn, áp dụng nhiều phép biến đổi và tổng hợp khác nhau và cung cấp dữ liệu đầu ra cho các phân tích tiếp theo
Real-time message ingestion (nhập tin nhắn theo thời gian thực): các hệ thống tập trung vào xử lý luồng thường phải cung cấp cách thu thập và lưu trữ các tin nhắn này trước khi chúng được xử lý Cơ chế nhập tin nhắn cung cấp một cách để thúc đẩy cân bằng tải và khả năng chịu lỗi
Stream processing (xử lý luồng): sau khi các thông báo thời gian thực được ghi lại, chúng được đọc và xử lý bằng cách lọc, tổng hợp và các phương pháp khác chuẩn bị dữ liệu để phân tích Dữ liệu được xử lý được ghi vào một đầu ra
Analytical data store (lưu trữ dữ liệu phân tích): các kho lưu trữ dữ liệu phân tích cung cấp tùy chọn để truy vấn dữ liệu được tính toán bằng quá trình xử lý hàng loạt hoặc luồng và truy xuất dữ liệu đó ở định dạng có cấu trúc
Analysis and reporting (phân tích và báo cáo): một số hệ thống dễ dàng cung cấp thông tin chuyên sâu về dữ liệu thông qua phân tích và báo cáo Kiến trúc có thể bao gồm lớp mô hình hóa dữ liệu, trình bày cho người dùng khám phá dữ liệu tương tác
Orchestration (Phối hợp): Vì hầu hết các hoạt động và xử lý dữ liệu bao gồm tập hợp các bước lặp lại, chúng thường được gói gọn trong các quy trình thực hiện công việc Điều này có thể bao gồm các nền tảng triển khai và quản lý quy trình công việc giúp lên lịch các tác vụ xử lý, quản lý các phần phụ thuộc của quy trình công việc hoặctriển khai và nâng cấp cơ sở hạ tầng sự kiện
Kiến trúc Lambda và Kappa là hai kiến trúc phổ biến mà nó chứa đủ các quy trình cũng như thành phần để xử lý dữ liệu khổng lồ
Kiến trúc Lambda là kiến trúc xử lý dữ liệu được thiết kế để xử lý lượng dữ liệu lớn bằng cách tận dụng cả phương pháp xử lý hàng loạt (batch) và xử lý luồng (stream) Kiến trúc Lambda cân bằng độ trễ, thông lượng và khả năng chịu lỗi bằng cách áp dụng xử lý hàng loạt (batch) để cung cấp chế độ xem mộ cách toàn diện và chính xác cho dữ liệu, đồng thời áp dụng xử lý luồng thời gian thực (stream) để cung cấp dữ liệu thời gian thực
HỆ THỐNG APACHE KAFKA
Để hỗ trợ cho việc xử lý dữ liệu stream trong lớp speed của kiến trúc Lambda thì Apache Kafka sẽ thực hiện việc đó vì hệ thống Kafka có cấu trúc như là một message system (Mục 2.2.3)
Kafka là một nền tảng message publish/subscribe phân tán (distributed messaging system) mã nguồn mở được thiết kế, xây dựng nhằm mục đích xử lý dữ liệu streaming theo thời gian thực
Kafka có khả năng truyền một lượng lớn message theo thời gian thực, trong trường hợp bên nhận chưa nhận message vẫn được lưu trữ sao lưu trên một hàng đợi và cả trên ổ đĩa bảo đảm an toàn Đồng thời nó cũng được replicate trong cluster giúp phòng tránh mất dữ liệu
Hình 12 Minh họa hệ thống Apache Kafka [11]
Hình 12 mô tả các thành phần cơ bản của hệ thống Kafka bao gồm: các broker,producer, consumer và zookeeper
Producer: Kafka lưu, phân loại message theo topic, sử dụng producer để publish message vào các topic Dữ liệu được gửi đển partition của topic lưu trữ trên Broker
Consumer: Kafka sử dụng consumer để subscribe vào topic, các consumer được định danh bằng các group name Nhiều consumer có thể cùng đọc một topic
Topic: Dữ liệu truyền trong Kafka theo topic, khi cần truyền dữ liệu cho các ứng dụng khác nhau thì sẽ tạo ra các topic khác nhau
Partition: Đây là nơi dữ liệu cho một topic được lưu trữ Một topic có thể có một hay nhiều partition Trên mỗi partition thì dữ liệu lưu trữ cố định và được gán cho một mả định danh (ID) còn gọi là offset Trong một cụm Kafka thì một partition có thể sao
26 chép (replicate) ra nhiều bản Trong đó có một bản leader chịu trách nhiệm đọc ghi dữ liệu và các bản còn lại gọi là follower Khi bản leader bị lỗi thì sẽ có một bản follower lên làm leader thay thế Nếu muốn dùng nhiều consumer đọc song song dữ liệu của một topic thì topic đó cần phải có nhiều partition
Broker: một cụm Kafka là một tập hợp nhiều broker, các broker hoạt động song song với nhau để quản lý dữ liệu vào ra Các broker hoạt động ngang hàng với nhau và được quản lý bởi zookeeper
Zookeeper: được dùng để quản lý và bố trí các broker Có thể nói zookeeper hạt động như một sự phối hợp phân tán (distributed coordination) [12]
Hình 13 Minh họa quá trình truyền thông tin của Kafka [11]
Thêm vào đó, thông tin leader của các partition cũng được lưu trữ trên zookeeper, Khi có sự kiện thêm hoặc mất broker, thông tin trên zookeeper sẽ giúp toàn bộ các broker còn lại biết được hiện trạng của cụm để có những điều chỉnh phù hợp về leader.
NỀN TẢNG DOCKER
Docker hỗ trợ cho việc triển khai, kiểm thử một ứng dụng và chứa các thư viện hỗ trợ việc chạy phần mềm một cách nhanh chóng
Docker là nền tảng phần mềm cho phép xây dựng, kiểm thử và triển khai ứng dụng một cách nhanh chóng Docker đóng gói phần mềm vào các đơn vị tiêu chuẩn hóa được gọi là container có mọi thứ mà phần mềm cần để chạy, trong đó có thư viện, công cụ hệ thống, mã và thời gian chạy Bằng cách sử dụng docker, có thể nhanh chóng triển khai và thay đổi quy mô ứng dụng vào bất kỳ môi trường nào và biết chắc rằng code sẽ chạy được
Docker hoạt động bằng cách chạy mã bằng cung cấp phương thức tiêu chuẩn Nó giống như cách máy ảo – ảo hóa phần cứng của máy chủ nhằm loại bỏ nhu cầu trực tiếp quản lý, lúc này các container sẽ ảo hóa hệ điều hành của máy chủ Khi được cài đặt trên từng máy chủ, docker cung cấp các lệnh cơ bản để bạn có thể build, khởi tạo hay dừng container [13]
Cơ chế hoạt động của docker khá phức tạp Hoạt động của docker sẽ thông qua một docker engine có sự kết hợp của hai yếu tố server và client server và client giao tiếp với nhau thông qua REST API
Build: đây là bước đầu tiên để tạo một dockerfile Bên trong dockerfile chính là code của chúng ta Cụ thể dockerfile sẽ được xây dựng tại một máy tính đã cài đặt sẵn docker engine Sau khi build xong, chúng ta sẽ có được container và trong này sẽ có chứa ứng dụng kèm với toàn bộ thư viện
Push: sau khi có được container, bước push là bước đẩy contain lên cloud và lưu trữ tại đó
Pull, Run: trong trường hợp có một máy tính khác muốn sử dụng container, thì máy bắt buộc phải thực hiện Pull Container về máy và máy đã cài sẵn docker engine Sau đó, để sử dụng container phải thực hiện run container này [13]
Dễ ứng dụng: bất cứ ai cũng có thể sử dụng từ lập trình viên cho đến sysadmin,… chúng tận dụng tất cả lợi thế của containers để build và kiểm tra một cách nhanh chóng Chúng có thể đóng gói ứng dụng ở trên laptop và chạy ở trên public cloud và cả private cloud,…
Tốc độ: docker containers tương đối nhẹ và có tốc độ rất nhanh, hoàn toàn có thể tạo và khởi chạy chỉ trong vài giây ngắn ngủi
Môi trường chạy và khả năng mở rộng: có thể chia nhỏ những chức năng của ứng dụng thành các container riêng lẻ Với docker, rất dễ để liên kết các container với nhau để tạo thành một ứng dụng, làm cho nó dễ dàng mở rộng, cập nhật các thành phần độc lập với nhau
Tiết kiệm chi phí: container docker giúp cho việc chạy nhiều mã hơn trên từng máy chủ trở nên dễ dàng hơn, cải thiện khả năng tận dụng và tiết kiệm nhiều chi phí
Hiện tại, nhược điểm duy nhất của docker là không thể chạy trực tiếp trên Windows và MAC OS Chính vì thế, khi sử dụng Docker trên Windows hay MAC OS thì Docker sẽ phải chạy một máy ảo linux rồi mới có thể thực thi được.
CƠ SỞ DỮ LIỆU APACHE CASSANDRA
Lớp serving sẽ lưu trữ các view của lớp batch và lớp speed nên Apache Cassandra sẽ hỗ trợ cho lớp serving lưu trữ kết quả và thực hiện các truy vấn tiếp theo
Apache Cassandra là cơ sở dữ liệu phân tán mã nguồn mở có khả năng mở rộng và chịu lỗi cao Cassandra có một kiến trúc masterless có nghĩa là nó có không có một điểm lỗi nào vì tất cả các nút đều được sao chép Mỗi nút trong cụm là giống hệt nhau và có vai trò tương tự cho phép khả năng khả dụng cao và khả năng mở rộng vì bất kỳ nút nào cũng có thể phục vụ yêu cầu Cassandra cung cấp phân phối dữ liệu tự động trên các nút trong cụm cơ sở dữ liệu [14]
Dữ liệu được lưu trữ trong cơ sở dữ liệu của Cassandra thuộc dạng key value store (KVS)
Có thể tạo được nhiều bảng trong cơ sở dữ liệu nhưng mà giữa các bảng sẽ không có mỗi quan hệ nào Nhiều bảng được tổng hợp lại thành keyspace
Thông thường cơ sở dữ liệu trong NoSQL thì không cần thiết phải tạo lượt đồ (schema) ngay lúc đầu Thế nhưng Cassandra thì lại khác Trước khi thêm dữ liệu thì cần phải tạo keyspace và schema của bảng
Có thể thực hiện được một số câu query như select, update, insert, delete, drop [14]
Apache Cassandra là một NoSQL database, lưu trữ dữ liệu dưới dạng wide-column bằng cách kết hợp cả dạng key-value và dạng table Thành phần chính của Cassandra là keyspace với 3 thuộc tính sau:
Replication factor: quy định số lượng nút (nodes) trong cụm (cluster) sẽ nhận bản sao chép của cùng một dữ liệu
Replica placement strategy: quy định cách lưu trữ các bản sao, ví dụ như simple strategy, old network topology strategy, network topology strategy,
Column families: dùng để mô tả cấu trúc của dữ liệu Mỗi một họ cột (column family) có nhiều dòng (rows) và mỗi dòng lại có nhiều cột theo thứ tự nhất định (khác với cơ sở dữ liệu quan hệ, người dùng có thể tự do thêm cột vào bất kỳ lúc nào và các dòng không nhất thiết phải có cùng các cột) Thông thường mỗi keyspace thường có ít nhất một hoặc nhiều họ cột [14]
Thích hợp để sử dụng thực tế
Khả năng chịu lỗi cao
Mức độ tự do kiểm soát nhất quán
Mô hình dữ liệu phong phú
Có thể tăng cường cải thiện thông lượng cho tuyến tính
Hỗ trợ các ngôn ngữ khác nhau dưới dạng client code
Dễ dàng nắm bắt trạng thái bên trong của máy chủ bằng JMX/Dễ giám sát
Cassandra không hỗ trợ nhiều cho việc tính toán trên bộ nhớ, nó không hỗ trợ các hàm sum, group, join, max, min và bất kì hàm nào khác mà người sử dụng muốn sử dụng để tính toán dữ liệu khi thực hiện các câu truy vấn
Vì là dữ liệu phân tán, dữ liệu được lan truyền trên nhiều máy, nên khi có một lỗi trong cơ sở dữ liệu thì lỗi này sẽ lan truyền ra toàn bộ các máy trên hệ thống
XÂY DỰNG ỨNG DỤNG
TẬP DỮ LIỆU
3.1.1 Tổng quan tập dữ liệu
Tập dữ liệu được sử dụng để phân tích dữ liệu lịch sử và huấn luyện mô hình phân loại giao dịch được thu thập từ trang Kaggle: fraud-detection https://www.kaggle.com/datasets/kartik2112/fraud-detection
Tập dữ liệu có hơn 120K giao dịch của khách hàng chứa thông tin khách hàng và thông tin giao dịch với 22 cột trans_date_trans_time cc_num merchant category amt first last gender street city state zip lat long city_pop job dob trans_num unix_time merch_lat merch_long is_fraud
3.1.2 Xử lý tập dữ liệu
3.1.2.1 Xử lý tập dữ liệu trong lớp batch
Trong lớp batch, nhóm sử dụng tập dữ liệu fraudTrain.csv để làm tập dữ liệu chính để phân tích cho hệ thống Qua quá trình xử lý batch, từ tập dữ liệu ban đầu, thực thi để lưu trữ những thông tin có ích về khách hàng và giao dịch đã được thực hiện trước đó Trong đó:
Thông tin khách hàng gồm: cc_num: số thẻ tín dụng, xác định duy nhất cho mỗi khách hàng first: tên của khách hàng last: họ của khách hàng gender: giới tính của khách hàng street: địa chỉ đường phố city: địa chị thành phố zip: mã zip
32 lat: vĩ độ của địa chỉ khách hàng long: kinh độ của địa chỉ khách hàng min_amt: số tiền giao dịch ít nhất max_amt: số tiền giao dịch cao nhất mean_amt: số tiền giao dịch trung bình
Thông tin giao dịch của mỗi khách hàng gồm: cc_num: số thẻ tín dụng, xác định duy nhất cho mỗi khách hàng trans_time: thời gian xảy ra giao dịch trans_num: mã giao dịch, định nghĩa duy nhất cho mỗi giao dịch category: danh mục cho loại mặt hàng đã mua amt: số tiền giao dịch merchant: địa chỉ xảy ra giao dịch merch_lat: vĩ độ của địa chỉ xảy ra giao dịch distance: khoảng cách giữa địa chỉ khách hàng và nới xảy ra giao dịch, tính theo khoảng cách euclidean dựa theo kinh độ và vĩ độ age: tuổi của khách hàng is_fraud: giá trị cho biết đó có phải giao dịch bất thường hay không, 1: cho biết đó là giao dịch giả mạo, 0: cho biết đó không phải giao dịch giả mạo
Cơ sở dữ liệu về khách hàng và giao dịch đã xảy ra trong lịch sử được lưu trữ Casandra được định nghĩa trong file cassandra-init.cql như sau:
Hình 14.Tạo keyspace để lưu trữ dữ liệu
Hình 14 tạo keyspace có tên là creditcard để lưu trữ dữ liệu của các bảng
Hình 15 Tạo bảng fraud_transaction
Hình 15 tạo bảng fraud_transaction gồm các thuộc tính như cc_num (mã thẻ tín dụng), trans_time (thời gian thực hiện giao dịch), trans_num (mã giao dịch), category (danh mục giao dịch), merchant (địa chỉ xảy ra giao dịch), amt (số tiền giao dịch), merch_lat (vĩ độ), merch_long (kinh độ), distance (khoảng cách giữa địa chỉ khách hàng và nới xảy ra giao dịch), age (tuổi khách hàng), is_fraud (giao dịch bất thường hay không) với khóa chính của bảng là cc_num và trans_time và sắp xếp dữ liệu tăng dần theo thời gian giao dịch.
Hình 16 Tạo bảng non_fraud_transaction
Hình 16 tạo bảng non_fraud_transaction cũng có các thuộc tính tương tự như bảng fraud_transaction
Hình 17 tạo bảng customer chứa các thuộc tính là thông tin khách hàng bao gồm: cc_num (mã thẻ khách hàng), first (họ của khách hàng), last (tên khách hàng), gender (giới tính), street (tên đường), city (thành phố), state (tiểu bang), zip (mã zip), lat (vĩ độ của địa chỉ khách hàng), long (kinh độ của địa chỉ khách hàng), job (công việc), dob (ngày sinh khách hàng), min_amt (số tiền giao dịch ít nhất), max_amt (số tiền giao dịch nhiều nhất), mean_amt (số tiền trung bình) với khóa chính là mã thẻ khách hàng
3.1.2.2 Xử lý tập dữ liệu trong lớp speed
Trong lớp speed, đòi hỏi việc thực thi xử lý các giao dịch xảy ra theo thời gian thực của khách hàng vào thời điểm hiện tại Do những hạn chế trong việc tìm kiếm dữ liệu API để thực thi đường ống xử lý trong lớp Speed Nhóm đã sử dụng tập dữ liệu event.csv, được trích từ tập fraudTest để mô phỏng sự kiện giao dịch của khách hàng Tập dữ liệu event.csv có chứa thông tin như sau: cc_num: số thẻ tín dụng, xác định duy nhất cho mỗi khách hàng trans_time: thời gian xảy ra giao dịch trans_num: mã giao dịch, định nghĩa duy nhất cho mỗi giao dịch category: danh mục cho loại mặt hàng đã mua amt: số tiền giao dịch merchant: địa chỉ xảy ra giao dịch merch_lat: vĩ độ của địa chỉ xảy ra giao dịch
Lưu ý: trans_time được mặc định là thời gian khi giao dịch được xử lý bởi hệ thống
Cơ sở dữ liệu về sự kiện giao dịch đang xảy ra lưu trữ trong Casandra được định nghĩa trong file cassandra-init.cql như sau:
Hình 18 tạo bảng eventtransaction để lưu trữ các thông tin giao dịch của khách hàng bao gồm các thuộc tính cc_num (mã thẻ), trans_time (thời gian thực hiện giao dịch), trans_num (mã giao dịch), category (danh mục giao dịch), merchant (địa chỉ xảy ra giao dịch), amt (số tiền giao dịch), merch_lat (vĩ độ), merch_long (kinh độ), distance (khoảng cách giữa địa chỉ khách hàng và nới xảy ra giao dịch) với khóa chính của bảng là cc_num và trans_time và sắp xếp dữ liệu tăng dần theo thời gian giao dịch.
TRIỂN KHAI CÁC ỨNG DỤNG TRONG HỆ THỐNG
3.2.1 Triển khai ứng dụng trong Docker compose
Docker compose là là một công cụ giúp định nghĩa và chạy nhiều container (multi- container) trong những ứng dụng sử dụng docker Với docker compose, chúng ta có thể config các dịch vụ (services) để phục vụ cho ứng dụng Và tiện hơn khi chỉ với một câu lệnh, chúng ta có thể tạo và start tất cả các docker containers services Để thực hiện triển khai ta định nghĩa các container services trong file docker- compose.yml để triển khai Spark, Cassandra, Hadoop, Kafka, Zookeeper
Hình 19 cấu hình Spark gồm spark-master chứa các thông tin như các image sử dụng, các cổng (port) thực thi, tên, mạng và spark-master bào gồm các thông tin giống spark- master nhưng có thêm thuộc tính depends_on nghĩa là chạy phụ thuộc vào spark-master
Hình 20 cấu hình các thuộc tính cho Cassandra như image sử dụng, tên container, cổng
3.2.3 Cấu hình Kafka và Zookeeper
Hình 21.Cấu hình Kafka và Zookeeper Hình 21 cấu hình Kafka và zookeeper image sử dụng, tên container, cổng (port), mạng, môi trường
Hình 22 cấu hình namenode của Hadoop bao gồm các thuộc tính image sử dụng, tên container, cổng (port), mạng, môi trường và datanode vẫn có thuộc tính như namenode nhưng chạy phụ thuộc vào namenode
Hình 23 Cấu hình biến môi trường của Hadoop
3.2.5 Khởi tạo và chạy các ứng dụng
Thực hiện lệnh docker-compose up -d
Hình 24.Thực thi lệnh docker-compose up
Hình 24 thực thi lệnh docker-compose up để chạy các ứng dụng như Spark, Hadoop,
Cassandra cấu hình trước đó trong hệ thống Để thực hiện dừng các ứng dụng:
Hình 25 Dừng các ứng dụng
Hình 25 thực thi lệnh docker-compose down để dừng các ứng dụng. Để thực hiện kiểm tra các containers services đang chạy:
Thực hiện lệnh docker ps
Hình 26 Kiểm tra các container
Hình 26 kiểm tra các container hiện có trong hệ thống
XÂY DỰNG LỚP BATCH
Lớp batch thực thi quá trình xử lý dữ liệu từ nguồn tệp được lưu trữ trong HDFS Quá trình xử lý tính toán trên toàn bộ tập dữ liệu và ghi vào Cassandra Quá trình này nhóm sử dụng công cụ SparkSQL với thư việc PySpark để thực thi Thư viện này cung cấp các hàm khác nhau như: pyspark.sql.window, pyspark.sql.functions.sum, pyspark.sql.f unctions.avg,… để có thể dễ dàng xây dựng cơ sở dữ liệu
Thực hiện khai báo một SparkSession như Hình 27
Hình 27 Sử dụng PySpark để xử lý dữ liệu
Hình 27 sử dụng PySpark để tạo SparkSession để xử lý dữ liệu
Spark đọc dữ liệu từ HDFS như Hình 28:
Hình 28 Spark đọc dữ liệu từ HDFS
Lấy dữ liệu khách hàng lưu vào Cassandra được thực hiện như Hình 29:
Hình 29 Lưu dữ liệu khách hàng vào Cassandra
Lấy dữ liệu giao dịch lịch sử lưu vào Cassandra được thực hiện như Hình 30:
Hình 30 Lưu dữ liệu lịch sử vào Cassandra
Việc thực hiện lấy dữ liệu khách hàng và giao dịch lịch sử còn phục vụ cho việc huấn luyện mô hình dự đoán giao dịch bất thường của khách hàng Với các thuộc tính (feature) được lấy từ dữ liệu được tính toán và lưu trữ trong Cassandra được thực thi bởi lớp batch Đồng thời, lớp batch thực hiện tính toán các batch view để thực hiện thống kế phân tích trên tập dữ liệu để phục vụ cho lớp serving như sau:
View nhóm tuổi trên tập dữ liệu: view_age_count_customner
Hình 31 Tạo batch view nhóm tuổi khách hàng
Hình 31 sử dụng thuộc tính age và dob để thực hiện tạo batch view view_age_count_c ustomner nhóm tuổi khách hàng
View số lượng khách hàng theo giới tính: view_gender_count_customer
Hình 32 Tạo batch view số lượng khách hàng theo giới tính
Hình 32 sử dụng thuộc tính gender để thực hiện tạo batch view view_gender_count_c ustomer số lượng khách hàng theo giới tính
View tổng số lượng giao dịch trên từng danh mục được mua: view_transaction_by_cat egory
Hình 33.Tạo batch view tổng số lượng giao dịch trên từng danh mục được mua
Hình 33 sử dụng thuộc tính category để thực hiện tạo batch view view_transaction_by
_category tổng số lượng giao dịch trên từng danh mục của khách hàng
View giao dịch giả mạo trên từng năm, danh mục được mua: view_fraud_transaction_by_category
Hình 34 Tạo batch view giao dịch giả mạo trên từng năm, danh mục được mua
Hình 34 sử dụng thuộc tính is_fraud và year để thực hiện tạo batch view view_fraud_t ransaction_by_category_year giao dịch giả mạo trên từng năm, danh mục được mua bởi khách hàng (is_fraud mang giá trị 1 là giao dịch giả mạo)
View giao dịch giả mạo thống kê theo mỗi tháng: view_fraud_transaction_by_month
Hình 35.Tạo batch view giao dịch giả mạo thống kê theo mỗi tháng
Hình 35 sử dụng thuộc tính is_fraud và month để tạo batch view view_fraud_transacti on_by_month giao dịch giả mạo trên từng tháng
View 10 giao dịch gần nhất của khách hàng: view_top10_lastest
Hình 36 Tạo batch view 10 giao dịch gần nhất
Hình 36 tạo batch view 10 giao dịch gần nhất của khách hàng
3.3.4 Thực thi batch trên docker
Quá trình thực thi xử lý batch trong docker container: spark-master
Trong container spark-master cần chứa file xử lý batch.py đã được định nghĩa:
Hình 37 Thực thi file batch
Thực thi câu lệnh: dockek exec spark-master /spark/bin/spark-submit packages
"com.datastax.spark:spark-cassandra- connector_2.12:3.0.1,com.datastax.cassandra:cassandra-driver-core:4.0.0"
Hình 38 Thực thi thành công
Hình 38 thực thi thành công file batch.py
XÂY DỰNG LỚP SPEED
Xây dựng mô hình
Lớp speed thực thi quá trình thu thập dữ liệu thời gian thực, đảm bảo việc theo dõi sự kiện xảy một cách liên tục Trong quá trình đó, dữ liệu cũng cần phải được tính toán và ghi kết quả sau khi được xử lý Trong lớp này, nhóm đã sử dụng Kafka và Spark Streaming đóng vai trò như một message system với giao thức publish/subscribe Kafka producer – nơi cấp phát ra sự kiện giao dịch đang xảy ra, gửi message đến topic Spark Streaming đóng vai trò như một consumer thực hiện đăng kí đến topic chứa message
Thực hiện đăng kí topic với container Kafka: docker exec kafka kafka-topics create topic eventtransaction
partitions 1 replication-factor 1 if-not-exists zookeeper zookeeper:2181
Thực hiện kafka_producer.py để tạo ra dữ liệu sự kiện mô phỏng trong lớp speed:
Hình 39 Tạo dữ liệu event trong lớp speed
Hình 40 Thực thi file kafka_producer.py
Hình 40 thực thi thành công file kafka_producer.py
Spark Streaming thực hiện lấy dữ liệu từ Kafka và lưu trữ vào trong Cassandra như hình
Hình 41 Lưu dữ liệu từ Kafka vào Cassandra
Trong container spark-master cần chứa file xử lý kafka_consumer.py đã được định nghĩa:
Hình 42 File kafka_consumer.py trong spark-master
Thực thi câu lệnh: docker exec spark-master /spark/bin/spark-submit packages "org.apache.spark:spark- sql-kafka-0-10_2.12:3.0.1,com.datastax.spark:spark-cassandra- connector_2.12:3.0.1,com.datastax.cassandra:cassandra-driver-core:4.0.0" stream/kafka_consumer.py
XÂY DỰNG LỚP SERVING
Dữ liệu được xử lý từ lớp batch và speed được lưu trữ trong cơ sở dữ liệu Lớp serving đáp ứng các yêu cầu truy vấn bằng cách sử dụng các batch view được tính toán trước ở lớp batch và các real time view được xử lý và luôn được cập nhật ở lớp serving Bằng cách đó kết quả tính toán trong xây dựng dashboard, report,… mang đến sự chính xác về mặt thời gian và cho ra kết quả nhanh chóng hơn Ở lớp serving, nhóm thực hiện:
Xây dựng dashboard về những phân tích thống kế về dữ liệu lịch sử (chỉ sử dụng batch view) Đồng thời, mỗi khách hàng đều có yêu cầu theo dõi những giao dịch xảy ra gần đây nhất của mình Vậy nên việc cập nhật thông tin trên batch view đã tính toán trước đó
3.5.2 Thực hiện Dashboard cho phân tích thống kê của dữ liệu
Xây dựng dashboard cho dữ liệu lịch sử kết hợp sử dụng công cụ trực quan hóa Bokeh và Flask
Với lớp serving sử dụng các batch view được tính toán từ lớp batch để xây dựng biểu đồ:
• Biểu đồ thống kê theo nhóm tuổi:
Sử dụng batch view: view_age_count_customner chart1.py
Hình 43 Tạo biểu đồ thống kê theo nhóm tuổi
Hình 44 Biểu đồ thống kê theo nhóm tuổi
• Biểu đồ thống kê theo nhóm giới tính:
Sử dụng batch view: view_gender_count_customer chart2.py
Hình 45 Tạo biểu đồ thống kê theo giới tính
Kết quả hiện thị trên web:
Hình 46 Biểu đồ thống kê theo giới tính
• Biểu đồ thể hiện tổng số lượng giao dịch theo mỗi danh mục:
Sử dụng batch view: view_transaction_by_category chart3.py
Hình 47 Tạo biểu đồ thống kê theo danh mục
Kết quả biểu thị trên web:
Hình 48 Biểu đồ thống kê theo danh mục
• Biểu đồ thể hiện tổng số lượng giao dịch giả mạo theo mỗi danh mục của mỗi năm:
Sử dụng batch view: view_fraud_transaction_by_category_year
Hình 49 Tạo biểu đồ số lượng giao dịch giả theo mỗi danh mục của năm
Kết quả hiện thị trên web:
Hình 50 Biểu đồ số lượng giao dịch giả theo mỗi danh mục của năm
• Biểu đồ thể hiện giao dịch giả mạo theo mỗi tháng:
Sử dụng batch view: view_fraud_transaction_by_month chart5.py
Hình 51 Tạo thể hiện giao dịch giả mạo theo mỗi tháng
Kết quả hiện thị trên web:
Hình 52 Biểu đồ giao dịch giả mạo theo mỗi tháng
3.5.3 Thực hiện cập nhật thông tin 10 giao dịch mới nhất của khách hàng
Sử dụng batch view: view_top10_lastest và bảng eventtransaction
Hình 53 Cập nhật thông tin 10 giao dịch khách hàng trên web
Hình 54 Kết quả trả về trước khi thực hiện lớp speed
Hình 54 thể hiện kết quả trả về trước khi thực hiện lớp speed
Hình 55 Kết quả cập nhật dữ liệu realtime
Hình 55 là kết quả sau khi cập nhật dữ liệu realtime biểu đồ sẽ thay đổi so với trước khi thực hiện lớp speed.
SỬ DỤNG MACHINE LEARNING ĐỂ DỰ ĐOÁN
Thực hiện training model từ cơ sở dữ liệu lịch sử Trong đó tập dữ liệu được lấy từ 3 bảng: customer, non_fraud_transaction, fraud_transaction
Hình 56 Tập dữ liệu sử dụng training
Có ba model được nhóm thực hiện để lựa chọn ra model thích hợp nhất để dự đoán giao dịch giả đó là: DecisionTreeClassifier, LogisticRegression, Random Forest
Hình 59 kết quả tính toán của mô hình DicisionTree có RMSE là 0.143, accuracy là
Hình 60 kết quả tính toán của mô hình LogisticRegression có RMSE là 0.159, accuracy là 0.9747 và F1-score là 0.8080094
Hình 61 RMSE của Ramdom Forest
Hình 61 kết quả tính toán của mô hình Ramdom Forest có RMSE là 0.144, accuracy là
Sau khi thực hiện hiện training model và so sánh các độ, model để thực hiện dự đoán được lựa chọn với độ chính xác F1-score cao nhất – model Random Forest
Mô hình machine learning được sử dụng là Random Forest dùng để dự đoán vì có F1- score cao nhất Mô hình Random Forest được huấn luyện dựa trên sự phân phối giữa luật kết hợp (tập hợp) và quá trình lấy mẫu tái lặp (tăng tốc) Kỹ thuật thuật toán này có thể tạo ra nhiều cây quyết định mà mỗi cây quyết định được huấn luyện dựa trên nhiều mẫu đối lập khác nhau và kết quả dự kiến là bầu cử (biểu quyết) từ toàn bộ những cây quyết định đó Vì vậy, một kết quả dự báo được tổng hợp từ nhiều mô hình nên kết quả của chúng sẽ không bị phát hiện Kết quả dự báo đồng thời từ nhiều mô hình sẽ có phương sai nhỏ hơn so với chỉ một mô hình Điều này giúp cho mô hình xử lý đối tượng được hiển thị quá khớp
Hình 63.Các chỉ số của mô hình Random Forest
Từ dữ liệu real time, thực hiện dự đoán các giao dịch có nguy cơ là giả mạo để kip thời thông báo đến khách hàng
Hình 65 Dự đoán các giao dịch có nguy cơ là giả mạo
Hình 66 Các giao dịch có nguy cơ là giả mạo Hình 66 là kết quả dự đoán có khả năng giả mạo từ dữ liệu lớp speed xử lý được