Professional Documents
Culture Documents
ĐỒ ÁN TỐT NGHIỆP
HÀ NỘI, 12/2021
ĐỀ TÀI TỐT NGHIỆP
Chặng đường 5 năm học ở Bách khoa chuẩn bị tới hồi kết, cảm xúc lúc này thật
lẫn lộn. Vừa vui vì sắp chinh phục được ngôi trường nổi tiếng “tạch môn là
chuyện thường”, cũng vừa tự hào vì chưa bị “tạch” môn nào ở nơi đây.
Để hoàn thành được đồ án này, sự động viên, đóng góp ý kiến từ gia đình, thầy
cô và bạn bè là không thể thiếu đối với một sinh viên còn non trẻ.
Lời đầu tiên em xin dành lời cảm ơn chân thành nhất đến TS. Trần Việt Trung
cùng anh Nguyễn Hoàng Long đã tận tình chỉ bảo, hướng dẫn và định hướng suốt
quãng thời gian em thực hiện đồ án để đồ án được hoàn thành một cách tốt nhất.
Con cảm ơn mẹ đã tần tảo gánh vác trọng trách của cả bố để nuôi con ăn học 16
năm nay. Cảm ơn mẹ đã đặt niềm tin nơi con, luôn quan tâm và động viên con
suốt những tháng ngày học tập xa nhà. Cảm ơn anh em chí cốt (Bách, Trang,
Lim…) trong mái nhà Hội Sinh viên, những người bạn đầu tiên trong quãng thời
gian sinh viên ngắn ngủi. Tiếp theo là tập thể lớp CNTT11, những đồng chí siêu
lầy nhưng cũng rất tình cảm, đoàn kết làm mình đánh tan được suy nghĩ lên đại
học sẽ không thân với lớp, tuy giờ đây trên danh nghĩa không còn chung lớp
nhưng chắc chắn sẽ còn mãi mãi là anh em. Cảm ơn những người anh em
LamTran Company đã bên cạnh tôi những kì cuối đại học, tuy nhóm toàn người
giỏi làm tôi khá áp lực nhưng tôi vẫn quý anh em lắm.
5 năm học không dài nhưng cũng đủ để cho em những trải nghiệm quý giá,
những mối quan hệ mà suốt quãng đời còn lại có thể không tìm được. Suốt hành
trình, phần tốt có, phần dở có, nhưng quan trọng hơn hết là bài học mang lại. Xin
cảm ơn Bách khoa, cảm ơn những con người nơi đây đã tạo nên một Bách khoa
“chất” đến thế. Hy vọng lần bảo vệ đồ án tốt nghiệp này sẽ diễn ra thuận lợi, để
sau này mỗi khi gặp khó khăn, tôi có thể tự tin rằng "Đến Bách Khoa còn có thể
tốt nghiệp được thì chẳng phải ngán việc gì cả".
Xin cảm ơn vì tất cả!
Tạm biệt và hẹn gặp lại.
Thị trường việc làm ở Việt Nam ngày càng phát triển một cách nhanh chóng và
đa dạng cùng với thời kỳ đổi mới, hội nhập sâu và rộng, mở ra nhiều cơ hội cho
người lao động. Cùng với, thời đại công nghệ 4.0 đã có nhiều ứng dụng thực tiễn,
người dùng đã có thể tìm kiếm trên internet các công việc ứng với bản thân. Tuy
nhiên, trên thực tế, một bộ phận lớn người tìm việc vẫn chưa tìm được công việc
phù hợp với nhu cầu, cùng với việc mất nhiều thời gian, công sức để tìm kiếm.
Để giải quyết các vấn đề này, đồ án hướng tới việc xây dựng một hệ thống cảnh
báo dựa trên luồng tin tuyển dụng thu thập từ internet. Với mục tiêu giảm bớt
công sức, thời gian cho người tìm việc, đồ án đóng vai trò như một nền tảng cho
phép người dùng tùy biến, tìm kiếm một cách tự động các thông tin tuyển dụng.
Để thực hiện điều này, đồ án sử dụng các kiến thức liên quan đến dữ liệu lớn như
Apache Spark, Apache Kafka cùng các công cụ xây dựng website như FastAPI,
Angular.
Tuy mới chỉ được triển khai trên quy mô nhỏ nhưng kết quả đạt được của đồ án
đã phần nào chứng minh được khả năng giải quyết được các vấn đề vừa đặt ra
phía trên.
Hình 1.1: Lực lượng lao động Việt Nam theo quý, năm 2020 và 2021
Hơn nữa khi đại dịch lan rộng đã khiến đất nước phải giãn cách, phong tỏa nhiều
khu vực. Vô hình chung cũng gây khó khăn cho các công ty trong việc tuyển
dụng tìm nhân sự duy trì hoạt động cho bộ máy công ty. Các công ty cũng như
người lao động phải phỏng vấn và duy trì kết nối hoàn toàn trên môi trường
Internet. Từ đó chúng ta cũng nhận thấy nhiều bất cập về lượng thông tin tuyển
dụng, thông tin ứng tuyển tìm việc chưa được khai thác triệt để, người lao động
không thể tìm kiếm chính xác được các thông tin tuyển dụng phù hợp hay nhà
tuyển dụng cũng khó có khả năng tìm ra các ứng viên tiềm năng. Người lao động
Hệ thống
Sinh viên
Quản lý và xử lý dữ liệu Website tương tác người dùng
Kết nối các luồng dữ liệu đầu vào Chức năng kết nối CSDL
Tạo lược đồ luồng dữ liệu Chức năng thêm luồng dữ liệu
Nguyễn
Xử lý truy vấn trên các luồng dữ liệu Chức năng quản lý các luồng dữ
Văn Tiến
trong công việc Spark liệu
20173401
Chuẩn bị dữ liệu kết quả để gửi đến Chức năng quản lý công việc liên
người dùng tục
Quản lý các truy vấn Chức năng thêm truy vấn
Vũ Minh Cấu hình hệ thống Chức năng quản lý truy vấn
Hiếu Cấu trúc dữ liệu đầu vào Chức năng cấu hình hệ thống
20168683 Lập lịch xử lý kết quả truy vấn
Chương 2. Cơ sở lý thuyết và công nghệ: đề cập đến các định nghĩa, giải thích
lý thuyết các nên tảng phân tán cũng như xử lý dữ liệu lớn đồng thời cũng giới
thiệu các công cụ sử dụng trong mã nguồn hệ thống. Chương này sẽ bao gồm 4
phần chính. Phần đầu sẽ trình bày các lý thuyết hệ thống phân tán, phần tiếp theo
sẽ trình bày về nền tảng spark, đặc tả các chức năng, và phần cuối cùng sẽ trình
bày về các yêu cầu phi chức năng của hệ thống.
Chương 4. Xây dựng ứng dụng web tương tác người dùng: trình bày về giao
diện với người dùng, giúp hệ thống tương tác dễ hơn với người dùng. Ngoài ra,
chương này còn đề cập đến kết quả kiểm thử cũng như một vài đánh giá sơ bộ về
hệ thống.
Chương 5. Kết luận: tổng kết các kết quả đạt được cũng như trình bày các hạn
chế còn tồn tại, đồng thời định hướng phát triển trong tương lai.
Stream processing có thể được sử dụng ở bất cứ hệ thống nào cần sự phản hồi
nhanh từ một sự kiện gửi đến. Số lượng các sự kiện này thường rất nhiều, không
giới hạn và liên tục được hệ thống xử lý.
Stream processing ra đời giúp chúng ta giải quyết được bài toán khó khăn trong
việc xử lý dữ liệu. Phương thức này được sử dụng khi
• Cần một phương pháp để gửi dữ liệu đến bộ lưu trữ trung tâm một cách
nhanh chóng
• Bởi vì máy móc thường xuyên gặp lỗi nên cần có cách thức sao chép dữ
liệu nhằm giúp cho khi xảy ra sự cố, không bị downtime hoặc mất dữ liệu.
• Cần có tiềm năng mở rộng quy mô đáp ứng bất kỳ lượng người dùng mà
không cần phải theo dõi các ứng dụng khác nhau. Hoặc cần cung cấp dữ
liệu cho bất kỳ ai trong một tổ chức mà không cần theo dõi xem ai đã và
chưa được xem dữ liệu.
Một vài ví dụ của stream processing là Apache Spark, Apache Storm, Apache
Flink và Apache Kafka.
Apache Spark cung cấp 4 thành phần riêng biệt được sử dụng như thư viện dành
cho các tác vụ cụ thể: Spark SQL, Spark MLlib, Spark Streaming và GraphX. Dù
sử dụng API từ thư viện nào để viết chương trình Spark thì cũng được Spark
chuyển đổi thành các biểu đồ tính toán tương ứng (DAG). Điều đó có nghĩa bất
kể mã nguồn được viết cho chương trình của Spark sử dụng các API được cung
cấp thông qua các ngôn ngữ lập trình được hỗ trợ như Python, Java hay Scala thì
mã nguồn cơ bản cũng sẽ được phân tách thành các mã bytecode rất nhỏ và được
được thực thi tại các worker trên cụm máy chủ. Điều này làm cho nó trở thành
một hệ thống dễ dàng bắt đầu và mở rộng quy mô xử lý dữ liệu lớn trên quy mô
cực lớn.
Sơ lược về các thư viện mà Spark cung cấp như sau:
• Spark SQL: là một thành phần nằm trên Spark Core, giới thiệu một
khái niệm trừu tượng hóa dữ liệu mới gọi là SchemaRDD, cung cấp hỗ
trợ cho dữ liệu có cấu trúc và bán cấu trúc. Hỗ trợ thực hiện tốt các
truy vấn trên dữ liệu có cấu trúc từ nhiều nguồn đa dạng như CSV,
text, JSON, Avro, ORC, Parquet, ...
• Spark MLlib: Hỗ trợ cho các tác vụ về học máy, cung cấp các thuật
toán cơ bản trong học máy tính toán phân tán trên Spark tận dụng khả
năng tính toán tốc độ cao nhờ distributed memory-based của kiến trúc
Spark.
• Spark Streaming: tận dụng khả năng lập lịch memory-base của Spark
Core để thực hiện streaming analytics. Nó lấy dữ liệu theo mini-
Trên hình có thể thấy mỗi bản ghi dữ liệu mới được đưa vào chương trình
structured streaming theo dòng dữ liệu. Mỗi bản ghi này được tính như một hàng
(row) được thêm vào một bảng không giới hạn (unbounded table).
Các dữ liệu này được xử lý, truy vấn (query). Một truy vấn trên đầu vào sẽ tạo ra
"Bảng kết quả" (Result table). Mỗi khoảng thời gian kích hoạt (giả sử, cứ sau 1
giây), các hàng mới sẽ được nối vào Bảng đầu vào, cuối cùng sẽ cập nhật Bảng
kết quả như dưới đây.
Các kết quả đầu ra này (Output) được định nghĩa là những gì được ghi ra bộ nhớ
ngoài. Đầu ra có thể được xác định ở một số chế độ như sau:
• Chế độ Hoàn thành (Complete mode) - Toàn bộ bảng kết quả được cập
nhật sẽ được ghi vào bộ nhớ ngoài. Trình kết nối lưu trữ quyết định cách
xử lý việc ghi toàn bộ bảng.
• Chế độ Nối thêm (Append mode) - Chỉ các hàng mới được thêm vào bảng
kết từ lần xử lý cuối cùng sẽ được ghi vào bộ nhớ ngoài. Điều này chỉ áp
dụng cho các truy vấn mà các hàng hiện có trong bảng kết quả sẽ không
thay đổi.
• Chế độ Cập nhật (Update mode) - Chỉ những hàng đã được cập nhật trong
bảng kết quả kể từ lần kích hoạt cuối cùng sẽ được ghi vào bộ nhớ ngoài
(khả dụng kể từ Spark 2.1.1). Lưu ý rằng điều này khác với Chế độ hoàn
thành ở chỗ chế độ này chỉ xuất ra các hàng đã thay đổi kể từ lần kích hoạt
cuối cùng.
Structured Streaming hỗ trợ đọc dữ liệu từ nhiều nguồn đầu vào như:
• Tệp (File Source)
• Kafka – Một công cụ chuyên dùng để truyền tải thông điệp phân tán (sẽ
được trình bày ở phần sau)
• Socket
• Rate
Điều này giúp cho Structured Streaming linh hoạt với nhiều dạng lưu trữ dữ liệu.
Ưu điểm của Structured Streaming:
• Xử lý thời gian sự kiện (Event Time Processing):
Như 2 ảnh trên, cấu trúc của kafka bao gồm các thành phần chính sau:
• Producer: Một producer có thể là bất kì ứng dụng nào có chức năng xuất
bản tin nhắn vào một topic.
• Messages: Messages đơn thuần là byte array và nhà phát triển có thể sử
dụng chúng để lưu bất kì sự vật với bất kì định dạng nào - thông thường là
String, JSON và Avro
• Topic: Một topic là một danh mục hoặc feed name nơi mà bản ghi được
xuất bản.
• Partitions: Các topic được chia nhỏ vào các đoạn khác nhau, các đoạn
này được gọi là partition
Hình 2.8: Giao diện quản lý các api trong ứng dụng được viết bằng FastAPI
• Là một framework mới (ra mắt vào năm 2018), FastAPI thừa kế những
điểm mạnh và khắc phục các điểm yếu của các framework trước đó với
nhiệm vụ tương tự (Django, flask).
Dưới đây là một số so sánh tổng quan FastAPI với 2 framework trước đó
là Django và flask:
Ta có thể thấy framework FastAPI [4] đạt hiệu năng cao nhất và ít hạn chế hơn
so với 2 sản phẩm trước đó.
Đến nay Angular đã được phát triển đến nhiều phiên bản, mới nhất là Angular
13.
Công thức cấu thành Angular có thể hiểu đơn giản như sau:
Angular Application = Component + Component + Component … + services
Trong đó: Component = Template + Class + Metadữ liệu
Hình 3.1: Biểu đồ use case tổng quan hệ thống web. (Màu xanh là các use case sinh
viên thực hiện, màu tím là các use case thực hiện bởi sinh viên Vũ Minh Hiếu)
Website cung cấp các ca sử dụng về cách thêm luồng dữ liệu, truy vấn và cách để
quản lý thông qua việc hiển thị các tùy chọn và bảng để quản lý. Sau đây sinh
viên sẽ đi làm rõ ca sử dụng phân tích dữ liệu của hệ thống từ đó giúp xác định
được bài toán cụ thể cần giải quyết của mô-đun quản lý và xử lý dữ liệu.
Trên Hình 3.1 là biểu đồ phân tích use case tổng quát của website, dựa vào đó ta
thấy website cung cấp 8 chức năng chính để tạo nên các một luồng dữ liệu hoàn
chỉnh bao gồm: “Kết nối CSDL”, “Thêm luồng dữ liệu”, “Thêm truy vấn”, “Cấu
Hình 3.2 mô tả các chức năng cụ thể trong chức năng “Thêm luồng dữ liệu”. Để
tạo được một luồng dữ liệu, nhất thiết cần tên luồng dữ liệu (chức năng “Đặt tên
luồng dữ liệu”), topic Kafka đầu vào (chức năng “Chọn topic Kafka đầu vào”) và
lược đồ dữ liệu (Chức năng “Tạo lược đồ dữ liệu”).
• Đặt tên luồng dữ liệu: Mỗi luồng dữ liệu đều cần một định danh để ánh
xạ đến một topic kafka dữ liệu đầu vào
• Chọn topic Kafka đầu vào: Topic này lưu trữ những message chứa dữ
liệu của luồng như đã nói ở các phần trước
• Tạo lược đồ dữ liệu: Mỗi tin nhắn chứa dữ liệu đều phải có chung một
lược đồ để hệ thống có thể lấy dữ liệu cần thiết. Lược đồ này được lưu
theo dạng là một bảng trong CSDL MySQL. Từ đó mỗi trường dữ liệu sẽ
có tên và kiểu dữ liệu. Dữ liệu sẽ có cấu trúc và chặt chẽ hơn. Yêu cầu cụ
thể với lược đồ dữ liệu được trình bày ở bảng 3.2.
Dưới đây là đặc tả ca sử dụng “Thêm luồng dữ liệu”
* Bảng dưới đây trình bày các yếu tố mô tả mỗi trường trong lược đồ dữ liệu, từ
đây hệ thống có thể tạo bảng trong CSDL ứng với luồng dữ liệu:
Hình 3.3: Biểu đồ use case quản lý công việc liên tục
Hình 3.3 mô tả các chức năng cụ thể trong chức năng “Quản lý công việc liên
tục”. Chức năng này chủ yếu sẽ cho người dùng quản lý được trạng thái của job
một cách trực quan nhất. Các chức năng con bao gồm:
• Xem trạng thái, nhật ký: Người dùng có thể xem trạng thái của các công
nghệ dùng trong hệ thống. Có 2 trạng thái cơ bản là “Stopped” và
“Running” lần lượt chỉ việc dịch vụ đó đang dừng hay đang chạy bình
thường. Ngoài ra người dùng cũng có thể xem được nhật ký của công việc
liên tục từ đó có thể tìm ra lỗi tại sao job chạy không thành công.
• Khởi động/dừng công việc: Khởi động hoặc dừng việc xử lý dữ liệu
ngay lập tức mà không phải đợi đến lịch đã cấu hình trước.
• Thay đổi lịch khởi động công việc: Do hệ thống đặt sẵn lịch khởi động
lại của job là 0 giờ đêm nên có thể tùy từng hệ thống mà không hợp lý.
Điều này dẫn đến việc người dùng muốn sửa đổi lịch chạy của job. Chức
năng này hỗ trợ yêu cầu đó của người dùng.
Dưới đây là đặc tả ca sử dụng “Quản lý công việc liên tục”
Mã Use case UC002 Tên Use case Quản lý công việc liên tục
Tác nhân Người dùng
Tiền điều kiện Kết nối CSDL thành công
Hình 3.4 mô tả các chức năng cụ thể trong chức năng “Quản lý các luồng dữ
liệu”. Chức năng này người dùng có thể xem được hệ thống đang có những luồng
dữ liệu nào, đến từ đâu và thực hiện một số sửa đổi cho luồng.
Hình 3.14: Mô phỏng giao diện quản lý công việc liên tục
Trong đồ án, sinh viên áp dụng MVC cho việc phát triển ứng dụng web. MVC là
viết tắt của Model – View – Controller là một kiến trúc phần mềm hay mô hình
thiết kế được sử dụng trong kỹ thuật phần mềm. Nó giúp cho nhà phát triển tách
ứng dụng ra thành ba thành phần khác nhau. Mỗi thành phần có một nhiệm vụ
riêng biệt và độc lập. Model là thành phần chưa tất cả các nghiệp vụ logic,
phương thức xử lý, truy xuất cơ sở dữ liệu, đối tượng mô tả dữ liệu như các
Class, hàm xử lý. View đảm nhận việc hiển thị thông tin, tương tác với người
dùng, nơi chứa tất cả các đối tượng GUI (Graphic User Interface). Controller giữ
nhiệm vụ điều hướng các yêu cầu (request) từ người dùng và gọi đúng những
phương thức xử lý chúng. Hình sau minh hoạ cho mô hình MVC.
• Về phía giao diện, hệ thống sử dụng framework AngularJS phiên bản 12.1.0
với các gói. Để cài đặt, cần chuẩn bị dịch vụ npm và typescript phiên bản
4.3.5. Giao diện được xây dựng dựa trên mã nguồn mở của tác giả akveo.
Hình 3.11 hiển thị giao diện màn thêm luồng dữ liệu. Người dùng cần các bước
• Đặt tên luồng dữ liệu, chọn topic Kafka và cấu hình lược đồ dữ liệu. Nếu
chưa có topic tồn tại, có thể chọn nút “Create topic” để tạo topic mới, phù hợp
với mong muốn. Sau khi chọn topic xong, hệ thống sẽ trả về lược đồ dữ liệu
ứng với tin nhắn mới nhất trong topic đó.
• Ô “Message sample” để hiển thị tin nhắn mới nhất trong topic, người dùng có
thể nhìn vào đó và thấy các trường và kiểu dữ liệu đang có. Lược đồ sẽ được
tự động tạo xuống bên dưới, người dùng lúc này có thể chỉnh sửa (thêm, xóa)
thuộc tính các trường.
• Giao diện lược đồ được lấy ý tưởng từ giao diện phpmyadmin với 2 trường
bắt buộc là Name và Type lần lượt là tên và kiểu dữ liệu của trường đó. Tiếp
theo là các thông tin và ràng buộc bổ sung như khóa chính (PK – primary
key), không để trống (NN – not null), duy nhất (UQ – unique) và tự động tăng
(AI – Auto increment). Dưới cùng là chọn công cụ lưu trữ (Storage engine)
và kiểu ký tự lưu (Collation) cũng là tùy chọn cho bảng cần tạo.
Hình 3.12 hiển thị các luồng dữ liệu dưới dạng bảng. Mỗi dòng là một luồng dữ
liệu với các thông tin tên luồng và topic Kafka tương ứng. Khi nhấn vào một
luồng, hệ thống sẽ chuyển hướng qua. Ở bên phải mỗi dòng, 2 nút mũi tên và
thùng rác lần lượt là các chức năng xem dữ liệu trong luồng và xóa luồng.
3.3.2.2. Giao diện xem bản ghi dữ liệu của một luồng
Sau khi nhấn vào nút mũi tên ở màn quản lý luồng dữ liệu, màn hình sẽ được
chuyển hướng tới màn xem dữ liệu như Hình 3.13. Các dữ liệu sẽ được tự động
hiển thị theo trường dữ liệu tồn tại trong tin nhắn Kafka. Nhìn vào các dữ liệu
hiển thị, người dùng có thể xác định được luồng đang hoạt động chính xác và dữ
liệu đang truyền đến là đúng.
Trên Hình 3.14, giao diện chức năng quản lý công việc liên tục được hiển thị.
Đầu tiên, tên của công việc lưu dùng để gửi lên máy chủ Spark được hiển thị ở ô
trên cùng “job name”. Tiếp theo là các trạng thái của các dịch vụ kết nối tới hệ
thống và trạng thái của công việc trên Spark. Có 2 trạng thái là “Stopped” và
“Running” với các màu vàng và xanh tương ứng để thể hiện cho tình trạng đã
dừng hay là đang chạy. Khi ấn vào vòng tròn “Job streaming”, một cửa sổ khác
được bật ra trên trình duyệt, người dùng có thể xem được nhật ký đang hạy của
công việc này, từ đó dễ dàng hơn trong việc kiểm soát lỗi. Tiếp phía bên dưới là
chức năng lập lịch khởi động lại cho công việc liên tục. Có 2 dạng là chọn nhanh
(quick schedule) và chọn thủ công (manual schedule). Người dùng chọn lịch khởi
động lại công việc rồi ấn nút “SAVE” để lưu lại lịch này. Sau đó lịch sẽ được cập
nhật cho công việc.
3.3.4 Các giao diện chức năng khác
Dưới đây là giao diện của các chức năng khác trong hệ thống. Các chức năng cơ
bản bao gồm “Cấu hình hệ thống”, “Thêm câu truy vấn” và “Quản lý truy vấn”.
Các chức năng này do sinh viên Vũ Minh Hiếu thực hiện.
Hình 4.1: Kiến trúc tổng quan hệ thống quản lý, xử lý dữ liệu (Màu tím là các phần
chức năng sinh viên thực hiện, màu vàng là các phần chức năng thực hiện bởi sinh viên
Vũ Minh Hiếu)
Mô tả các thành phần có mặt tại sơ đồ kiến trúc hệ thống quản lý, xử lý dữ liệu
(Hình 4.1):
• Tin tức tuyển dụng, CV ứng tuyển: Các dữ liệu thông tin tuyển dụng,
thông tin ứng viên có được từ hệ thống thông tin việc làm yourway.vn
• Kafka (Công cụ truyền tải dữ liệu phân tán): Là thành phần module
truyền tải dữ liệu phân tán. Đảm nhiệm truyền tải các tin tuyển dụng,
thông tin ứng viên đồng thời cả kết quả của các truy vấn từ người dùng.
Nhận thấy những thế mạnh của Structured Streaming đã đề cập đến ở phần trước
rất phù hợp với yêu cầu bài toán như: truy vấn, xử lý theo cấu trúc, kết hợp nhiều
đầu vào và tùy chỉnh được cả đầu ra. Sinh viên chọn công nghệ này làm phần lõi
để xây dựng mô-đun Công cụ xử lý dữ liệu phân tán.
Giả sử trong thực tế, có một số sinh viên có các nhu cầu:
Nhưng một vấn đề phát sinh với cách làm này là làm sao để câu truy vấn SQL
kia có thể được cập nhật lên mô-đun Spark. Giả sử khi ta thêm một câu truy vấn
trong CSDL, Spark lúc này vẫn đang chạy độc lập, như vậy Spark chưa kịp cập
nhật thêm câu truy vấn mới để thực hiện yêu cầu.
Hình 4.4: Cách hoạt động của Mô-đun Công cụ xử lý dữ liệu phân tán
Giải pháp buộc phải sử dụng là hủy job Spark đang chạy đó và gửi lên một job
Spark mới. Nhưng nếu cứ mỗi lần thêm một câu truy vấn, ta hủy job Spark, thì
dẫn đến tình trạng quá tải nếu liên tục có câu truy vấn mới!
Để xử lý khó khăn này, sinh viên đưa ra phương án khởi động lại job Spark (gửi
lại) vào giữa đêm (00:00) mỗi ngày (như Hình 4.4). Lúc này các luồng dữ liệu
mới, các câu truy vấn sẽ được cập nhật lại, xử lý và xây dựng ra một tệp python
mới, khởi động lại mô-đun Công cụ xử lý dữ liệu phân tán (Spark) (trong thực tế
Trong đó:
• Producer 1, 2, 3, 4 là các thực thể gửi dữ liệu đến cho các luồng dữ liệu.
Một topic có thể có nhiều producer cùng gửi dữ liệu đến. Trên hình
Producer 1 nhận nhiệm vụ gửi dữ liệu công việc đến topic job_yourway,
Producer 2, 3 gửi dữ liệu cv đến topic cv_yourway và Producer 4 gửi dữ
liệu các bài đăng đến cho topic post_yourway.
• Kết nối luồng dữ liệu đầu vào: nhận nhiệm vụ giao tiếp với các luồng dữ
liệu này với các câu truy vấn của người dùng.
{
"id": 23,
"company_name": "Yourway",
"company_address": "Hai Ba Trung",
"salary": 30,
"ages": "25-30",
"education_level": "Đại học",
"position": "IT technician",
"job_attribute": "Toàn thời gian",
"year_experiences": 3,
"application_deadline": "02/02/2022"
}
Đầu tiên để lấy được dữ liệu từ Kafka, Spark sử dụng một cú pháp rất ngắn gọn
và dễ hiểu, thể hiện dưới Hình 4.6 như sau:
Ban đầu, cần khởi tạo một thực thể “spark” là SparkSession để có thể giao tiếp
với máy chủ Spark. Sau đó có thể cấu hình một số đặc tính như LogLevel để giới
hạn mức độ nhật ký của công việc. Spark hỗ trợ một tính năng readStream giúp
cho Job Spark có thể đọc được luồng dữ liệu liên tục từ Kafka. Ngoài ra,
readStream còn có thể đọc từ một số định dạng khác như Socket, Tệp, … Như
trên Hình 4.6 ta chỉ cần khai báo định dạng nguồn và topic Kafka là có thể đọc
được dữ liệu từ đó.
Như Hình 4.4 đã trình bày, mỗi khi có luồng dữ liệu mới thì khi khởi động lại,
Spark tự động cấu hình thêm các luồng đó. Do đó, có thể nhân rộng hơn để đọc
được từ nhiều topic, từ đó việc kết nối dữ liệu từ các luồng dữ liệu đã được giải
quyết.
4.2.2 Tạo lược đồ luồng dữ liệu
Spark Structured Streaming coi mỗi luồng dữ liệu từ Kafka là một bảng dữ liệu
với dữ liệu liên tục được thêm vào. Để có thể coi như là một bảng dữ liệu, mỗi
bản ghi đọc ra từ Kafka được cố định các trường dữ liệu trước. Tuy nhiên, các
trường dữ liệu này chứa thông tin của tin nhắn trong Kafka chứ không phải các
trường chứ trong tin nhắn. Như vậy, để có thể xử lý được dữ liệu công việc mong
muốn, cần phải đọc dữ liệu dưới dạng một lược đồ tương ứng với dữ liệu truyền
tới. Lược đồ này được lưu bằng lược đồ bảng trong CSDL ứng với luồng dữ liệu
việc làm này.
Trên Hình 4.7 biểu diễn việc chuyển đổi dữ liệu đọc được từ Kafka thành dạng
bảng với lược đồ định sẵn.
• Bước 1: định nghĩa lược đồ dựa theo lược đồ của bảng dữ liệu ứng với
luồng lưu trong CSDL.
• Bước 2: Vì được gửi dưới dạng tin nhắn trong Kafka và Structured
Streaming đọc dữ liệu dưới dạng bảng nên lúc này bảng dữ liệu chỉ tồn tại
cột key, value, offset, partition, timestamp, timestampType, topic là các
thông tin của tin nhắn. Do đó, muốn xử lý được dữ liệu ta cần một bước
chuyển dữ liệu sang dạng bảng với hàm from_json. Từ đây, với một cột
data sẽ được tự động tạo thêm các cột như trong schema_job đã định
nghĩa, mỗi cột chứa giá trị của trường tương ứng trong chuỗi json. Vì sau
đó sinh viên không sử dụng các thông tin tin nhắn nên chỉ lựa chọ các
trường có trong lược đồ qua hàm “select” (select("data.*")).
• Bước 3: Tạo bảng tạm thời TempView có tên là “job_yourway” (trùng tên
với topic Kafka) để phục vụ truy vấn.
Để tạo được lược đồ cố định trong tệp công việc Spark như trên Hình 4.7, khi tạo
ra tệp này, cần phải đọc được lược đồ từ bảng lưu lược đồ của luồng dữ liệu này.
Mỗi khi khởi động lại mô-đun Spark, hệ thống kiểm soát việc thêm luồng hoặc
xoá luồng dữ liệu bằng cách kiểm tra các bảng trong CSDL với tên có tiền tố là
“dbstreaming_streaming_”. Mỗi bảng này sẽ ứng với một luồng dữ liệu, các lược
đồ sẽ được lấy dựa trên lược đồ của bảng tương ứng trong CSDL. Đoạn mã dưới
Hình 4.8 dưới đây thể hiện việc này:
Trên đây là các thông tin với trường dữ liệu kiểu VARCHAR.
o “name”: tên trường
o “type”: kiểu dữ liệu trong sqlalchemy
o “default”: dữ liệu mặc định
4.2.3 Xử lý truy vấn trên các luồng dữ liệu trong công việc Spark
Để thao tác với dữ liệu một cách mượt mà, dễ dàng nhất, người ta sử dụng một
ngôn ngữ đặc thù là SQL. Cũng vì thế mà để Spark là một công cụ mạnh khi thao
tác với dữ liệu thì không thể thiếu được mô-đun Spark SQL. Và Structured
Streaming thừa kế từ Spark SQL nên tất nhiên cũng có tính năng thao tác với
SQL. Dựa vào tính năng này, hệ thống cung cấp chức năng tương ứng, cho phép
người dùng tạo câu truy vấn có dạng SQL để truy vấn lên các “bảng” dữ liệu đã
lấy được ở phần trước. Và như vậy cách xử lý dữ liệu đơn giản được đưa về
phương thức truy vấn trên nhiều bảng có sẵn bằng SQL.
Như trình bày ở phần trước, Spark sẽ được khởi động lại theo một lịch cố định.
Khi khởi động lại Spark sẽ tải lại các truy vấn mới hoặc xóa các truy vấn người
dùng xóa đi rồi khởi động lại.
Như trong hình, ta thấy được các bước cơ bản để truy vấn dữ liệu trong job
Spark:
• Bước 1: Thực thi câu truy vấn của người dùng qua phương thức sql – một
tính năng của Spark SQL. Từ đây biến “data” sẽ lưu kết quả mong muốn
của người dùng.
• Bước 2: Để gửi lại được đến Kafka, cần phải chuyển lại dữ liệu theo đúng
định dạng key – value. Ta có hàm ngược lại là to_json thực hiện công việc
nén các cột lại thành một chuỗi json làm giá trị cho cột value mới. Tương
tự với cột key hệ thống sẽ lấy mặc định giá trị cột này là query_x với x là
định danh câu truy vấn trong CSDL
4.2.4 Chuẩn bị dữ liệu kết quả để gửi đến người dùng
Ở phần trên đã đề cập đến việc xử lý dữ liệu bằng SQL, việc còn lại là chuyển dữ
liệu đầu ra đến một topic Kafka đã được định nghĩa.
Trên Hình 4.11, đoạn mã trình bày việc Spark sử dụng phương thức writeStream,
với format Kafka và truyền dữ liệu ra topic tương ứng.
Dữ liệu gửi ra này sẽ được mô-đun “Tiến trình nhận, gửi kết quả truy vấn” do
sinh viên Hiếu thực hiện xử lý tiếp. Cụ thể được trình bày dưới Hình 4.12.
Mỗi câu truy vấn tương ứng với một “lịch” ở trong hệ thống này. Ngay sau khi
thêm câu truy vấn, một tiến trình được lập để đợi đến khi đúng thời điểm thì thực
thi công việc lấy dữ liệu từ topic Kafka. Sau đó trả về cho người dùng qua các
phương tiện tùy theo lựa chọn ban đầu khi tạo câu truy vấn của người dùng.
Sau khi thêm, kết quả được hiển thị như sau:
• Bước 2: Thêm câu truy vấn lọc các công việc có địa chỉ ở khu vực Hai Bà
Trưng và mức lương trên 18 triệu
• Bước 4: Kiểm tra công việc đã được khởi động thành công và không có
lỗi gì
• Bước 5: Sau khi thực hiện được một luồng dữ liệu hệ thống hoàn chỉnh,
kết quả của các câu truy vấn là các bản ghi dữ liệu, các thông tin mong
muốn sẽ được gửi đến người dùng qua các phương thức người dùng chọn
(mail, telegram, ...). Hình dưới đây biểu thị kết quả được gửi dưới dạng
email cho người dùng.
• Do hạn chế về tài chính, hệ thống mới chỉ được triển khai dưới dạng
standalone dưới máy tính của sinh viên. Hệ thống chịu tải được xấp xỉ
1000 câu truy vấn và 20 luồng dữ liệu liên tục, không bị ngắt giữa chừng.
• Đưa hệ thống lên môi trường nền tảng đám mây (như AWS, Google
cloud, Azure …). Xây dựng cụm các máy chủ và kiểm thử hiệu năng hệ
thống.
• Phục vụ thêm nhiều dạng câu truy vấn ngoài select để người dùng có thể
tùy biến nhiều hơn với dữ liệu đã có.