Professional Documents
Culture Documents
Trang 1/69
NGUYỄN XUÂN MINH
Trang 2/69
NGUYỄN XUÂN MINH
Trang 3/69
NGUYỄN XUÂN MINH
Trang 4/69
NGUYỄN XUÂN MINH
Trang 5/69
NGUYỄN XUÂN MINH
MỤC LỤC
MỤC LỤC
DANH MỤC HÌNH
THUẬT NGỮ VIẾT TẮT
LỜI MỞ ĐẦU
Trang 6/69
NGUYỄN XUÂN MINH
CHƯƠNG 3. XÂY DỰNG LUỒNG SPARK STREAMING LƯU TRỮ TRÊN HDFS
3.1 Bài toán xây dựng luồng Spark streaming lưu trữ trên HDFS
3.2 Một số công cụ liên quan
3.2.1 Apache Kafka
3.2.1.1 Kiến trúc Kafka
3.2.1.2 Ưu nhược điểm của của Kafka
3.2.1.3 Ứng dụng của Kafka
3.2.2 Superset
3.3 Triển khai bài toán và kết quả đạt được
3.3.1 Triển khai bài toán
Trang 7/69
NGUYỄN XUÂN MINH
KẾT LUẬN
TÀI LIỆU THAM KHẢO
Trang 8/69
NGUYỄN XUÂN MINH
Trang 9/69
NGUYỄN XUÂN MINH
Trang 10/69
NGUYỄN XUÂN MINH
Trang 11/69
NGUYỄN XUÂN MINH
LỜI MỞ ĐẦU
Hệ thống quản lý dữ liệu đã tồn tại hàng thập kỷ nay và tạo thành một nền công
nghiệp mạnh mẽ mà chúng ta đều biết đến. Các nhà cung cấp đáng chú ý trong thị trường
này là những công ty tên tuổi như Oracle, Microsoft, Teradata, IBM; đây là những công
ty có giá trị nhất thế giới trong lĩnh vực phát triển hệ thống quản lý dữ liệu. Dữ liệu là
thành phần cốt lõi của rất nhiều vấn đề liên quan đến mô hình kinh doanh của tổ chức,
doanh nghiệp; họ có thể phải tốn đến hàng triệu đô la Mỹ để xây dựng một hệ thống dữ
liệu có thể thu thập, lưu trữ, phân tích, và sử dụng những dữ liệu liên quan để phục vụ
ngược lại cho các khách hàng của doanh nghiệp, các kênh kinh doanh, và các thị trường
kinh doanh khác nhau. Mặc dù đã có sự trưởng thành so với thời gian ban đầu, ngành
công nghiệp quản lý dữ liệu lại đang trải qua một sự gián đoạn tại thời điểm hiện tại.
Nguyên nhân là do sự bùng nổ nhanh chóng của dữ liệu lớn (Big data) được tạo ra bởi con
người và máy móc, khả năng kết nối ngày càng nhiều hơn. Do vậy, nó đã tạo nên nhu cầu
xử lý dữ liệu lớn trong các hệ thống quản lý dữ liệu nhằm phục vụ nhu cầu xử lý dễ dàng,
linh động và giá thành ngày càng thấp hơn.
Chính vì vậy, để có những hiểu biết sâu hơn về các hệ thống phân tích luồng dữ
liệu, đề tài, em đã chọn đề tài: “Nghiên cứu xây dựng Spark Streaming lưu trữ trên
HDFS” làm nội dung nghiên cứu đồ án tốt nghiệp. Nội dung của đồ án được chia làm 3
chương, bao gồm:
Chương 1: Giới thiệu chung về Hadoop.
Chương 2: Tổng quan về Spark Streaming.
Chương 3: Xây dựng luồng Spark Streaming lưu trữ trên HDFS.
Vì những hạn chế về thời gian, nội dung trình bày của đồ án không tránh khỏi thiếu
sót. Em rất mong nhận được các ý kiến đóng góp phê bình của các thầy cô và các bạn.
Em xin chân thành cảm ơn.
Trang 12/69
NGUYỄN XUÂN MINH
Hadoop được viết bằng Java tuy nhiên nhờ cơ chế streaming, Hadoop cho phép
phát triển các ứng dụng phân tán bằng cả Java lẫn một số ngôn ngữ lập trình khác như
Python, Scala. Hadoop chỉ có thể chạy trên môi trường Linux-based.
Nutch được khởi xướng từ năm 2002, và một hệ thống search engine (gồm crawler
và tìm kiếm) nhanh chóng ra đời. Tuy nhiên, các nhà kiến trúc sư của Nutch nhanh chóng
nhận ra rằng Nutch sẽ không thể mở rộng ra để có thể thực hiện vai trò searcher engine
của mình trên tập dữ liệu hàng tỷ trang web (lúc khả năng của Nutch chỉ có thể crawl tối
đa 100 triệu trang). Nguyên nhân chính của giới hạn này là do Nutch lúc này chỉ chạy trên
một máy đơn (stand alone) nên gặp phải các khuyết điểm như tốc độ truy xuất chậm, khả
năng lưu trữ bị giới hạn.
Năm 2003, Google công bố kiến trúc của hệ thống tệp phân tán GFS của họ. Các
nhà kiến trúc sư của Nutch thấy rằng GFS sẽ giải quyết được nhu cầu lưu trữ các tệp rất
lớn từ quá trình crawl và index. Năm 2004, họ bắt tay vào việc ứng dụng kiến trúc của
GFS vào cài đặt một hệ thống tệp phân tán nguồn mở có tên HDFS.
Trang 13/69
NGUYỄN XUÂN MINH
Năm 2004, Google lại công bố bài báo giới thiệu MapReduce. Vào đầu năm 2005,
các nhà phát triển Nutch đã xây dựng được phiên bản MapReduce trên Nutch, và vào giữa
năm 2005, tất cả các thuật toán chính của Nutch đều được cải tiến lại để chạy trên nền
HDFS và MapReduce. HDFS và MapRecude trong Nutch đã nhanh chóng tìm được các
ứng dụng của mình bên ngoài lĩnh vực search engine, và vào tháng hai 2006 Dough
Cutting đã tách riêng HDFS và MapReduce ra để hình thành một dự án độc lập có tên
Hadoop. Cùng thời gian này, Dough Cutting gia nhập vào Yahoo!. Tại đây ông được tạo
một môi trường tuyệt vời để phát triển Hadoop và vào tháng 2 năm 2008 Yahoo đã công
bố sản phẩm search engine của họ được xây dựng trên một Hadoop cluster có kích thước
10.000 nhân vi xử lý.
Năm 2008, Apache đã đưa Hadoop lên thành dự án ở top-level Apache Software
Foundation, nhằm xác nhận sự thành công và các áp dụng rộng rãi của Hadoop. Vào 12
thời gian này, Hadoop được sử dụng bởi rất nhiều công ty ngoài Yahoo! như Last.fm,
Facebook, New York Times.
Năm 2008, Hadoop đã phá kỷ lục thế giới về sắp xếp một terabyte dữ liệu. Chạy
trên một cụm gồm 910 nút, Hadoop đã sắp xếp một terabyte dữ liệu trong vòng 209 giây,
phá kỷ lục cũ là 297 giây. Sau đó ít lâu, Google công bố ứng dụng chạy trên MapReduce
của họ đã sắp xếp được một terabyte dữ liệu trong 68 giây. Vào tháng 5 năm 2009, một
đội các nhà phát triển của Yahoo! đã dùng Hadoop để sắp xếp một terabyte dữ liệu trong
vòng 62 giây.
Năm 2009, Hadoop đã được thử nghiệm thành công để sắp xếp PB (PetaByte) dữ
liệu trong vòng chưa đầy 17 giờ để xử lý hàng tỷ tìm kiếm và lập chỉ mục hàng triệu trang
web. Và Doug Cutting rời Yahoo và gia nhập Cloudera để thực hiện thách thức đưa
Hadoop sang các ngành công nghiệp khác. Vào tháng 12 năm 2011, Apache Software
Foundation đã phát hành Apache Hadoop phiên bản 1.0. Sau đó vào tháng 8 năm 2013,
Phiên bản 2.0.6 đã có sẵn.Và hiện tại, Apache Hadoop phiên bản 3.3.4 được phát hành
vào tháng 8 năm 2022.
Trang 15/69
NGUYỄN XUÂN MINH
Enterprise) để thu thập thông tin từ các cuộc trò chuyện người dùng trực tuyến của
mình.RBS xử lý khoảng 250.000 nhật ký trò chuyện và siêu dữ liệu liên quan mỗi tháng,
lưu trữ dữ liệu phi cấu trúc này trong Hadoop. Bằng cách sử dụng trung tâm phân tích và
quản lý dữ liệu lớn được xây dựng trên Hadoop, doanh nghiệp sử dụng công nghệ máy
học cũng như xử lý dữ liệu để lập bản đồ và hiểu hành trình của người dùng. Ngân hàng
cao cấp cũng đang sử dụng phân tích dữ liệu lớn để đi sâu vào dữ liệu giao dịch nhằm
phân tích và xác định nơi người dùng đang trả gấp đôi cho các sản phẩm tài chính và
mang lại trải nghiệm người dùng nâng cao.
Và còn rất nhiều công ty hiện đang sử dụng Hadoop vào việc lưu trữ và xử lý dữ
liệu, đặc biệt cho các nguồn dữ liệu lớn với kích thước lên tới hàng petabyte.
Hình 1-2 Kiến trúc tổng quan của một cụm Hadoop
Trang 16/69
NGUYỄN XUÂN MINH
Cụm Hadoop có kiến trúc master/slave, có một NameNode và một nút chạy
JobTracker (NameNode và JobTracker có thể nằm trên cùng một máy vật lý, tuy nhiên
trên các cụm thật sự với hàng trăm, hàng nghìn nút thì thường phải tách riêng NameNode
và JobTracker ra các máy vật lý khác nhau). Có nhiều nút slave, mỗi nút slave thường
đóng 2 vai trò: một là DataNode, hai là TaskTracker.
NameNode và DataNode chịu trách nhiệm vận hành hệ thống tệp phân tán HDFS
với vai trò cụ thể được phân chia như sau:
NameNode đóng vai trò là chủ, chịu trách nhiệm duy trì thông tin về cấu trúc cây
phân cấp các tệp, thư mục của hệ thống tệp, các Metadata khác của hệ thống tệp và
tình trạng hoạt động của các DataNode thông qua các hearbeat. Heartbeat: một loại
thông điệp mà mỗi DataNode sẽ định kỳ gởi đến NameNode để xác nhận tình trạng
hoạt động của DataNode. Trên MapReduce Engine, các TaskTracker cũng dùng
HeartBeat để xác nhận tình trạng hoạt động của mình với JobTracker, điều khiển
quá trình đọc ghi dữ liệu từ máy khách lên các DataNode.
DataNode nơi trực tiếp lưu trữ dữ liệu, mỗi DataNode chịu trách nhiệm lưu trữ một
phần dữ liệu của hệ thống, đáp ứng các yêu cầu đọc ghi dữ liệu từ máy khách, tạo
xóa các khối dữ liệu từ NameNode. Nó luôn cập nhật gửi trạng thái của nó đến
NameNode sau mỗi 3 giây.
Ngoài ra còn có NameNode phụ, là một nút chuyên dụng đặc biệt trong cụm
Hadoop có chức năng chính là nhận các điểm kiểm tra của hệ thống tệp Metadata
có trên NameNode, liên tục kiểm tra tính chính xác của các tệp tin lưu trữ trên các
DataNode và không thể thay thế nút chính.
JobTracker và TaskTracker chịu trách nhiệm duy trì MapReduce, nhận và thực thi
các nhiệm vụ của MapReduce:
JobTracker: tiếp nhận các yêu cầu thực thi, nhiệm vụ của MapReduce, phân chia
công việc này thành các tác vụ và phân công cho các TaskTracker thực hiện, quản
lý tình trạng thực hiện các tác vụ của TaskTracker và phân công lại nếu cần.
JobTracker cũng quản lý danh sách các nút TaskTracker và tình trạng của từng nút
thông qua hearbeat.
TaskTracker: nhận các tác vụ từ JobTracker và thực hiện theo từng yêu cầu.
Trang 17/69
NGUYỄN XUÂN MINH
Trang 18/69
NGUYỄN XUÂN MINH
DataNode là nơi lưu trữ dữ liệu vật lý, các khối của tệp. Các DataNode có nhiệm
vụ báo cáo tình trạng đến NameNode, thông báo về danh sách các khối mà nó quản lý.
Nếu một DataNode bị sử cố, NameNode sẽ thực hiện sao chép các khối của DataNode
này đến các DataNode khác để đảm bảo dữ liệu luôn sẵn sàng. Dựa theo sự điều phối của
NameNode mà DataNode là nơi thực hiện các yêu cầu đọc, ghi tệp của người dùng.
Trang 19/69
NGUYỄN XUÂN MINH
nút thắt cổ chai (bottle neck). Máy khách sẽ không bao giờ đọc hay ghi dữ liệu lên hệ
thống thông qua NameNode. Thay vào đó, máy khách sẽ giao tiếp với NameNode xem
nên liên lạc với DataNode nào để truy xuất dữ liệu. Sau đó, máy khách sẽ để bộ nhớ đệm
thông tin này lại và kết nối trực tiếp với các DataNode để thực hiện các thao tác truy xuất
dữ liệu.
Đầu tiên máy khách sẽ mở tệp cần đọc bằng cách gửi yêu cầu đọc tệp đến
NameNode. Sau đó NameNode sẽ thực hiện kiểm tra xem tệp yêu cầu đọc có tồn tại hay
không hoặc xem tình trạng tệp là như thế nào. Nếu mọi thứ bình thường thì NameNode sẽ
gửi danh sách các khối của tệp với cùng địa chỉ các DataNode chứa các bản sao của khối
này.
Tiếp theo máy khách sẽ mở các kết nối tới DataNode, thực hiện một RPC để yêu
cầu nhận khối cần đọc và đóng kết nối với DataNode. Lưu ý: với mỗi khối ta có thể có
nhiều DataNode lưu trữ các bản sao của khối đó. Máy khách sẽ chỉ đọc bản sao của khối
từ DataNode gần nhất. Việc tính khoảng cách giữa hai nút trên cụm sẽ được trình bày sau.
Trang 20/69
NGUYỄN XUÂN MINH
Cuối cùng máy khách sẽ thực hiện việc đọc các khối lặp đi lặp lại cho đến khi khối
cuối cùng của tệp được đọc xong. Quá trình máy khách đọc dữ liệu từ HDFS sẽ trong suốt
với người dùng hoặc chương trình ứng dụng của máy khách, người dùng sẽ dùng một tập
API của Hadoop để tương tác với HDFS, các API này che giấu đi quá trình liên lạc với
NameNode và kết nối các DataNode để nhận dữ liệu.
Chú ý: trong quá trình một máy khách đọc một tệp trên HDFS, máy khách sẽ trực
tiếp kết nối với DataNode để lấy dữ liệu chứ không cần thực hiện gián tiếp qua
NameNode. Điều này sẽ làm giảm đi rất nhiều việc trao đổi dữ liệu giữa máy khách
NameNode, khối lượng luân chuyển dữ liệu sẽ được trải đều khắp các cụm, tình trạng
nghẽn cổ chai sẽ không xảy ra. Do đó, cụm chạy HDFS có thể đáp ứng đồng thời nhiều
máy khách cùng thao tác tại một thời điểm.
Trang 21/69
NGUYỄN XUÂN MINH
Bước 1: Máy khách sẽ gửi yêu cầu đến NameNode tạo một tệp entry lên không
gian hệ thống tệp. Tệp mới được tạo sẽ rỗng, tức chưa có một khối nào. Sau đó,
NameNode sẽ quyết định danh sách các DataNode sẽ chứa các bản sao của tệp cần đến và
gửi lại cho máy khách.
Bước 2: Máy khách sẽ chia tệp đó ra thành các khối, và mỗi khối sẽ đóng gói thành
các gói. Lưu ý, mỗi khối sẽ được lưu ra thành nhiều bản sao trên các DataNode khác nhau
(tùy thuộc vào chỉ số độ nhân bản của tệp).
Bước 3: Máy khách gửi gói tin cho DataNode thứ nhất, DataNode thứ nhất sau khi
nhận được gói tin sẽ tiến hành lưu lại bản sao thứ nhất của khối. Tiếp theo DataNode thứ
nhất sẽ gửi gói tin này cho DataNode thứ 2 để lưu ra bản sao thứ 2 của khối, cứ như vậy
cho đến DataNode cuối cùng.
Bước 4: DataNode cuối cùng sẽ gửi lại cho các DataNode trước đó xác nhận tình
trạng thành công. Nếu có bất ký một DataNode nào bị lỗi trong quá trình ghi dữ liệu, máy
khách sẽ tiến hành xác nhận lại các DataNode đã lưu thành công bản sao của khối và thực
hiện ghi lại khối bị lỗi trên DataNode.
Bước 5: Sau khi tất cả các khối của tệp đều được ghi lên các DataNode, máy khách
sẽ thực hiện một thông điệp báo cho NameNode nhằm cập nhật lại danh sách các khối của
tệp vừa tạo. Thông tin ánh xạ từ chỉ số khối sang danh sách các DataNode lưu trữ sẽ được
NameNode tự động cập nhật bằng các định kỳ các DataNode sẽ gửi báo cáo cho
NameNode danh sách các khối mà nó quản lý.
Nhận xét: cũng giống như trong quá trình đọc, máy khách sẽ trực tiếp ghi dữ liệu
lên các DataNode mà không cần phải thông qua NameNode. Một đặc điểm nổi trội nữa là
khi máy khách ghi một khối với chỉ số sao chép là n, tức nó cần ghi khối lên n DataNode,
nhờ cơ chế luân chuyển khối dữ liệu qua ống (pipe) nên lưu lượng dữ liệu cần ghi từ máy
khách sẽ giảm đi n lần, phân đều ra các DataNode trên cụm.
Trang 22/69
NGUYỄN XUÂN MINH
Việc sử dụng kích thước khối lớn, tức sẽ giảm số lượng khối của một tệp, mang lại
một số thuận lợi. Đầu tiên, nó sẽ làm giảm số lần tương tác với NameNode của máy
khách vì việc đọc/ghi trên một khối chỉ cần một lần tương tác với NameNode để lấy chỉ
số khối và nơi lưu khối đó.
Thứ hai là việc cung cấp bản sao cho các khối dữ liệu rất đơn giản, do đó có thể đạt
được khả năng chịu lỗi và tính sẵn sàng cao trong cụm Hadoop. Theo mặc định, mỗi khối
dữ liệu được sao chép ba lần trên các máy vật lý có sẵn trong cụm. Trong trường hợp nếu
khối dữ liệu không có sẵn bằng cách nào đó, bản sao của cùng một khối dữ liệu cũng có
thể được cung cấp từ một số nút khác có sẵn trong cụm của nơi tạo bản sao. Một khối bị
hỏng được sao chép sang một số máy trực tiếp khác chỉ để duy trì hệ số sao chép ở trạng
thái bình thường. Một số ứng dụng quan trọng có thể yêu cầu sao chép cao để cung cấp
tính khả dụng cao hơn và phân bổ tải đọc trên cụm.
Thứ ba, việc giảm số lượng khối của một tệp sẽ làm giảm khối lượng Metadata
trên NameNode. Điều này giúp chúng ta có thể đưa toàn bộ Metadata vào bộ nhớ chính.
Trang 23/69
NGUYỄN XUÂN MINH
1.2.2.3 Metadata
Metadata hay còn gọi là siêu dữ liệu, được hiểu là dạng dữ liệu mô tả chi tiết thông
tin về dữ liệu. Siêu dữ liệu tóm tắt thông tin cơ bản về dữ liệu, điều này có thể giúp việc
tìm kiếm, sử dụng và tái sử dụng các phiên bản dữ liệu cụ thể dễ dàng hơn.
như một NameNode, nhiệm vụ của NameNode phụ là lưu trữ lại điểm kiểm tra mới nhất
trên NameNode. Khi NameNode gặp sự cố, thì điểm kiểm tra mới nhất này sẽ được đưa
vào NameNode và NameNode sẽ trở lại hoạt động như thời điểm NameNode phụ tạo
điểm kiểm tra. NameNode phụ thực hiện nhiệm vụ của nó thông qua một daemon
(deamon là các trình nền). NameNode phụ không cập nhật điểm kiểm tra bằng cách tải
toàn bộ Metadata trên NameNode về. Thực chất, NameNode phụ chỉ tải phần EditLog từ
NameNode về và thực hiện ghép EditLog này vào trong phiên bản Metadata trước đó.
Cấu trúc của Metadata trên NameNode phụ cũng giống như cấu trúc Metadata trên
NameNode.
Trang 25/69
NGUYỄN XUÂN MINH
Công việc một được yêu cầu trước và thực thi trước, ngay lập tức chạy luôn, đồng
thời chiếm toàn bộ tài nguyên của cụm, công việc thứ hai gửi yêu cầu ngay sau đó nhưng
nó phải chờ đến khi công việc một xong thì mới có tài nguyên. Chính vì vậy có thể áp
dụng trong thực tế, đối với các cụm dữ liệu lớn chia sẻ tài nguyên, lập lịch công suất hoặc
lập lịch cân bằng thường được dùng hơn. Cả hai phương thức trên cho phép người dùng
thực hiện nhiều công việc có thời gian thực thi dài cũng như thực hiện các yêu cầu khác
đồng thời.
Hình 1-8 cho thấy cụm được chia làm hai hàng đợi A và B, có 2 công việc tương
ứng hai hàng đợi này, và thực thi ngay, điều này khắc phục nhược điểm của lập lịch
FIFO, các công việc có thể chạy song song đồng thời, cả công việc lớn lẫn công việc nhỏ.
Trang 26/69
NGUYỄN XUÂN MINH
Tuy nhiên, chúng ta sẽ phải cân đối tài nguyên giữa các hàng đợi, phân chia hợp lý để
đảm bảo các hàng đợi đủ tài nguyên thực hiện các công việc của mình, vì tài nguyên là
hữu hạn nên khi tăng hàng đợi này đồng nghĩa với việc phải giảm tài nguyên của hàng đợi
khác.
Vì thực tế có thể tại một thời điểm một hàng đợi dùng nhiều hơn lượng tài nguyên
được cấp phát (có nhiều công việc lớn, dữ liệu về nhiều,…) nên lập lịch công suất có cấu
hình lung lượng bé và lớn cho một hàng đợi, dung lượng nhỏ nhất là lượng tài nguyên tối
thiểu được cấp cho hàng đợi, dung lượng tối đa là lượng tài nguyên tối đa được cấp cho
hàng đợi, hàng đợi có thể có trong trường hợp các hàng đợi khác không sử dụng đến.
Tổng dung lượng cấu hình nhỏ nhất của các hàng đợi là 100% tài nguyên cụm.
Trang 27/69
NGUYỄN XUÂN MINH
Hình 1-9 cho thấy cụm của có hai hàng đợi là hàng đợi A và hàng đợi B cấu hình
50% tài nguyên cụm, sử dụng lập lịch cân bằng. Công việc đầu tiên được gửi vào hàng
đợi A và sử dụng toàn bộ tài nguyên trong cụm, sau đó công việc hai gửi vào hàng đợi B,
lúc này công việc một đang chạy chiếm toàn bộ tài nguyên cụm, YARN sẽ phải chờ đến
khi một số vùng chứa nhỏ của công việc một hoàn thành rồi cấp vùng chứa rỗi đó cho
công việc hai chạy. Sau một khoảng thời gian thì công việc một và công việc hai đều
chiếm 50% tài nguyên cụm, tương ứng toàn bộ tài nguyên của hàng đợi A và B. Tiếp đó
công việc ba được gửi lên hàng đợi B, lúc này công việc ba cũng chờ công việc hai rỗi tài
nguyên để sử dụng, sau đó công việc hai và công việc ba chia nhau 50% tài nguyên của
hàng đợi B.
Cơ chế lập lịch công bằng cho phép các hàng đợi đều được chia sẻ tài nguyên một
cách công bằng, các hàng đợi khi chạy luôn được cấp tài nguyên đảm bảo theo như cấu
hình nhỏ nhất. Các hàng đợi đều có thuộc tính weights, ví dụ hàng đợi A và hàng đợi B ở
trên có tỉ lệ là 50:50 nếu như weights không được xác định từ đầu, weight chỉ ra tương
quan tỷ lệ tài nguyên giữa các hàng đợi chứa không phải là tỷ lệ phần trăm, nếu hàng đợi
A có weight là 2 và hàng đợi B có weight 3 thì tỷ lệ tài nguyên sử dụng đồng thời giữa 2
hàng đợi là 2:3.
1.3 MapReduce
1.3.1 Giới thiệu
MapReduce là một mô hình hoặc mẫu lập trình trong khuôn khổ Hadoop được sử
dụng để truy cập dữ liệu lớn được lưu trữ trong hệ thống tệp Hadoop (HDFS). Nó là một
thành phần cốt lõi, không thể thiếu đối với hoạt động của khung Hadoop.
MapReduce hỗ trợ xử lý đồng thời bằng cách chia petabyte dữ liệu thành các phần
nhỏ hơn và xử lý chúng song song trên các máy chủ Hadoop. Cuối cùng, nó tổng hợp tất
cả dữ liệu từ nhiều máy chủ để trả lại đầu ra hợp nhất cho ứng dụng.
Ví dụ: một cụm Hadoop với 20.000 máy chủ hàng hóa rẻ tiền và khối dữ liệu 256
MB trong mỗi máy chủ, có thể xử lý khoảng 5 TB dữ liệu cùng một lúc. Điều này làm
giảm thời gian xử lý so với xử lý tuần tự một tập dữ liệu lớn như vậy.Với MapReduce,
thay vì gửi dữ liệu đến nơi ứng dụng, xử lý được thực thi trên máy chủ nơi dữ liệu đã lưu
trữ, để đẩy nhanh quá trình xử lý. Truy cập và lưu trữ dữ liệu dựa trên ổ đĩa, thường được
Trang 28/69
NGUYỄN XUÂN MINH
lưu trữ dưới dạng tệp chứa dữ liệu có cấu trúc, bán cấu trúc hoặc phi cấu trúc và đầu ra
cũng được lưu trữ trong tệp.
MapReduce đã từng là phương pháp duy nhất mà qua đó dữ liệu được lưu trữ trong
HDFS có thể được truy xuất, nhưng điều đó không còn đúng nữa. Ngày nay, có các hệ
thống dựa trên truy vấn khác như Hive và Pig được sử dụng để truy xuất dữ liệu từ HDFS
bằng cách sử dụng các câu lệnh giống như SQL. Tuy nhiên, chúng thường chạy cùng với
các công việc được viết bằng mô hình MapReduce. Đó là bởi vì MapReduce có những lợi
thế độc đáo.
MapReduce là một khung lập trình cho phép chúng ta thực hiện xử lý song song và
phân tán trên các tập dữ liệu lớn trong môi trường phân tán.
MapReduce gồm hai nhiệm vụ chính và riêng biệt: Map và Reduce
Như cái tên MapReduce gợi ý, giai đoạn Reduce diễn ra sau khi giai đoạn ánh xạ
đã hoàn thành.
Vì vậy, đầu tiên là công việc Map, trong đó một khối dữ liệu được đọc và xử lý để
tạo ra các cặp khóa-giá trị làm đầu ra trung gian.
Đầu ra của Mapper hoặc công việc ánh xạ (cặp khóa-giá trị) là đầu vào cho
Reducer.
Reducer nhận cặp khóa-giá trị từ nhiều công việc của Map.
Trang 29/69
NGUYỄN XUÂN MINH
Sau đó, bộ Reducer tổng hợp các bộ dữ liệu trung gian đó (cặp khóa-giá trị trung
gian) thành một tập hợp các bộ dữ liệu hoặc cặp khóa-giá trị nhỏ hơn, đây là đầu ra
cuối cùng.
Đầu tiên, chúng ta chia đầu vào thành ba phần như trong hình. Điều này sẽ phân
phối công việc giữa tất cả các nút Map.
Trang 30/69
NGUYỄN XUÂN MINH
Sau đó, chúng ta mã hóa các từ trong mỗi trình ánh xạ và cung cấp giá trị mã hóa
cứng (1) cho từng mã thông báo hoặc từ, đưa ra giá trị mã hóa cứng bằng 1 là mỗi từ tự
nó sẽ xuất hiện một lần.
Bây giờ, một danh sách cặp khóa-giá trị sẽ được tạo. Vì vậy, đối với dòng đầu tiên
(Dear Bear River), chúng ta có 3 cặp khóa-giá trị – Dear, 1; Gấu, 1; River, 1. Quá trình xử
lý ánh xạ vẫn giống nhau trên tất cả các nút.
Sau giai đoạn ánh xạ, một quá trình phân vùng diễn ra trong đó sắp xếp và xáo trộn
xảy ra để tất cả các bộ dữ liệu có cùng khóa được gửi đến bộ Reducer tương ứng.
Vì vậy, sau giai đoạn sắp xếp và xáo trộn, mỗi bộ Reducer sẽ có một khóa duy nhất
và danh sách các giá trị tương ứng với chính khóa đó. Ví dụ: Gấu, [1,1]; Ô tô, [1,1,1]..,
v.v.
Bây giờ, mỗi Reducer đếm các giá trị có trong danh sách giá trị đó. Như thể hiện
trong hình, bộ Reducer nhận danh sách các giá trị [1,1] cho khóa Bear. Sau đó, nó đếm số
cái trong chính danh sách và đưa ra kết quả cuối cùng là – Bear, 2.
Cuối cùng, tất cả các cặp khóa-giá trị đầu ra sẽ được thu thập và ghi vào tệp đầu ra.
Trang 31/69
NGUYỄN XUÂN MINH
Khi đó, MapReduce cho phép chúng ta khắc phục các vấn đề trên bằng cách đưa
đơn vị xử lý dữ liệu vào. Vì vậy, như bạn có thể thấy trong hình trên, dữ liệu được phân
phối giữa nhiều nút trong đó mỗi nút xử lý một phần dữ liệu nằm trên đó. Điều này cho
phép chúng ta có những lợi thế sau:
Việc chuyển đơn vị xử lý sang dữ liệu rất hiệu quả về chi phí.
Thời gian xử lý giảm xuống do tất cả các nút đang làm việc song song với phần dữ
liệu của chúng.
Mỗi nút nhận một phần dữ liệu để xử lý và do đó, không có khả năng nút bị quá
tải.
Trang 32/69
NGUYỄN XUÂN MINH
Apache Spark là một hệ thống xử lý phân tán, nguồn mở được sử dụng cho khối
lượng công việc dữ liệu lớn. Nó sử dụng bộ nhớ đệm trong bộ nhớ đệm và thực thi truy
vấn được tối ưu hóa để truy vấn nhanh đối với dữ liệu có kích thước bất kỳ. Nói một cách
đơn giản, Spark là một công cụ nhanh và chung để xử lý dữ liệu quy mô lớn. Phần nhanh
có nghĩa là nó nhanh hơn các phương pháp trước đây để làm việc với dữ liệu lớn như
MapReduce cổ điển. Bí quyết để nhanh hơn là Spark chạy trên bộ nhớ (RAM) và điều đó
làm cho quá trình xử lý nhanh hơn nhiều so với trên ổ đĩa. Phần chung có nghĩa là nó có
thể được sử dụng cho nhiều thứ như chạy SQL phân tán, tạo đường dẫn dữ liệu, nhập dữ
liệu vào cơ sở dữ liệu, chạy thuật toán Machine Learning, làm việc với biểu đồ hoặc
luồng dữ liệu, v.v.
Trang 33/69
NGUYỄN XUÂN MINH
Spark giới thiệu khái niệm tập dữ liệu phân tán linh hoạt (RDD) có khả năng chịu
lỗi và vận hành song song. RDD có thể chứa bất kỳ loại đối tượng nào và được tạo bằng
cách tải tập dữ liệu bên ngoài hoặc phân phối bộ dữ liệu từ chương trình điều khiển. Mỗi
tập dữ liệu trong Spark RDD được phân vùng hợp lý trên nhiều máy chủ để chúng có thể
được tính toán trên các nút khác nhau của cụm.
Trang 34/69
NGUYỄN XUÂN MINH
Đó là kết quả của Map, Filter và sao cho dữ liệu chỉ từ một phân vùng duy nhất.
Một RDD đầu ra có các phân vùng với các bản ghi bắt nguồn từ một phân vùng duy nhất
trong RDD chính. Chỉ một tập hợp con giới hạn của các phân vùng được sử dụng để tính
toán kết quả.
Trang 35/69
NGUYỄN XUÂN MINH
Nó là kết quả của các hàm giống như GroupByKey() và ReduceByKey(). Dữ liệu
cần thiết để tính toán các bản ghi trong một phân vùng có thể nằm trong nhiều phân vùng
của RDD gốc. Phép biến đổi này còn được gọi là phép biến đổi trộn vì chúng có thể hoặc
không phụ thuộc vào phép trộn.
Hành động: là các hoạt động (chẳng hạn như reduce, count, v.v.) trả về một giá trị
sau khi chạy tính toán trên RDD. Nó thực thi bằng đồ thị tuyến tính để tải dữ liệu
vào RDD gốc, thực hiện tất cả các phép biến đổi trung gian và trả về kết quả cuối
cùng cho chương trình. Trình điều khiển hoặc ghi dữ liệu đó ra hệ thống tệp.
Các phép biến đổi trong Spark rất trễ nghĩa là chúng không tính toán kết quả ngay
lập tức. Thay vào đó họ chỉ nhớ thao tác sẽ được thực hiện và tập dữ liệu mà thao tác
được thực hiện. Các phép biến đổi chỉ được thực sự được tính toán khi một hành động
được gọi và kết quả được trả về chương trình điều khiển. Thiết kế này cho phép Spark
chạy hiệu quả hơn.Spark RDD cũng có thể được lưu trữ và phân vùng thủ công. Bộ nhớ
đệm có lợi khi chúng ta sử dụng RDD nhiều lần. Và phân vùng thủ công là rất quan trọng
để cân bằng chính xác các phân vùng. Nói chung, các phân vùng nhỏ hơn cho phép phân
phối dữ liệu RDD đồng đều hơn, giữa nhiều người thực thi hơn. Do đó, ít phân vùng hơn
giúp công việc trở nên dễ dàng.
các bộ dữ liệu khác (bằng các phép biến đổi như Map, Join hoặc GroupBy) để tự
tạo lại.
Khi làm việc với dữ liệu có cấu trúc, RDD không thể tận dụng lợi thế của trình tối
ưu hóa nâng cao của Spark bao gồm trình tối ưu hóa xúc tác và công cụ thực thi
Tungsten. Các nhà phát triển cần tối ưu hóa từng RDD dựa trên các thuộc tính của
nó.
Giới hạn về hiệu suất: Là các đối tượng JVM trong bộ nhớ, RDD liên quan đến chi
phí chung của Garbage Collection và Java Serialization rất tốn kém khi dữ liệu
tăng lên.
Giới hạn về lưu trữ: RDD xuống cấp khi không có đủ bộ nhớ để lưu trữ chúng.
Người ta cũng có thể lưu trữ phân vùng RDD đó trên ổ đĩa khi hết dung lượng trên
RAM. Kết quả là, nó sẽ cung cấp hiệu suất tương tự như các hệ thống song song
dữ liệu hiện tại.
Trang 37/69
NGUYỄN XUÂN MINH
Spark SQL cũng cung cấp giao diện với cú pháp SQL để truy vấn dữ liệu, mang sức mạnh
của Apache Spark đến các nhà phân tích dữ liệu cũng như các nhà phát triển.
Bên cạnh khả năng hỗ trợ SQL, Spark SQL cung cấp một giao diện tiêu chuẩn để
đọc và ghi vào các kho dữ liệu khác bao gồm JSON, HDFS, Apache Hive, JDBC, Apache
ORC và Apache Parquet, tất cả đều được hỗ trợ trực tiếp. Các cơ sở dữ liệu phổ biến khác
như Apache Cassandra, MongoDB, Apache Hbase,… cũng được hỗ trợ thông qua các
trình kết nối riêng biệt từ hệ sinh thái Spark. Cung cấp một kiểu dữ liệu trừu tượng mới
(SchemaRDD) nhằm hỗ trợ cho cả kiểu dữ liệu có cấu trúc (Structured Data) và dữ liệu
nửa cấu trúc (Semi-structured Data – thường là dữ liệu dữ liệu có cấu trúc nhưng không
đồng nhất và cấu trúc của dữ liệu phụ thuộc vào chính nội dung của dữ liệu ấy). Spark
SQL hỗ trợ DSL để thực hiện các thao tác trên DataFrames bằng ngôn ngữ Scala, Java
hoặc Python và nó cũng hỗ trợ cả ngôn ngữ SQL với giao diện Command-line và
ODBC/JDBC server.
Cuối cùng, dữ liệu đã xử lý có thể được đẩy ra hệ thống tệp, cơ sở dữ liệu và bảng
điều khiển trực tiếp Spark Streaming được sử dụng để thực hiện việc phân tích trực tuyến
bằng việc coi trực tuyến là các lô nhỏ và thực hiệc kỹ thuật chuyển đổi RDD đối với các
lô dữ liệu nhỏ này. Qua đó cho phép các đoạn mã được viết xử lý có thể được tận dụng lại
vào trong việc xử lý trực tuyến, làm cho việc phát triển kiến trúc lambda được dễ dàng
hơn.
Tuy nhiên điều này lại tạo ra độ trễ trong xử lý dữ liệu (độ trễ chính bằng khoảng
thời gian giữa các lô nhỏ) và do đó nhiều chuyên gia cho rằng Spark Streaming không
thực sự là công cụ xử lý trực tuyến giống như Storm hoặc Flink.Thành phần này cho phép
Spark xử lý dữ liệu truyền phát theo thời gian thực. Dữ liệu có thể được nhập từ nhiều
nguồn như Kafka, Flume và HDFS. Sau đó, dữ liệu có thể được xử lý bằng các thuật toán
phức tạp và được đẩy ra hệ thống tệp, cơ sở dữ liệu và bảng điều khiển trực tiếp.
Trang 38/69
NGUYỄN XUÂN MINH
Kiến trúc truyền thống này cũng đã gặp phải một số thách thức với xu hướng ngày
nay hướng tới quy mô lớn hơn và phân tích thời gian thực phức tạp hơn:
- Phục hồi chậm trễ và thất bại một cách nhanh chóng: Trong thời gian thực, hệ
thống phải có khả năng phục hồi nhanh chóng và tự động sau các sự cố và sự chậm trễ để
cung cấp kết quả vốn là thách thức trong các hệ thống truyền thống do sự phân bổ tĩnh
của các toán tử liên tục cho các nút làm việc.
- Cân bằng tải: Trong một hệ thống vận hành liên tục, việc phân bổ tải xử lý không
đồng đều giữa các nút có thể gây ra tắc nghẽn. Hệ thống cần có khả năng tự động điều
chỉnh việc phân bổ tài nguyên dựa trên khối lượng công việc.
Trang 39/69
NGUYỄN XUÂN MINH
Tuy nhiên với kiến trúc Spark Streaming đã giải quyết những khó khăn trên:
Việc chia dữ liệu thành các lô nhỏ cho phép phân bổ tính toán chi tiết cho các tài
nguyên. Các nhiệm vụ của công việc sẽ được cân bằng tải một cách tự nhiên giữa
các nút, trong đó một số nút sẽ xử lý một số nhiệm vụ dài hơn trong khi những nút
khác sẽ xử lý nhiều nhiệm vụ ngắn hơn trong Spark Streaming.
Trong Spark, tính toán rời rạc thành các tác vụ nhỏ có thể chạy ở mọi nơi mà
không ảnh hưởng đến tính chính xác. Vì vậy, các tác vụ bị lỗi, chúng ta có thể
phân phối đồng đều trên tất cả các nút khác trong cụm để thực hiện tính toán lại và
phục hồi sau lỗi nhanh hơn so với phương pháp truyền thống.
Khả năng của Spark Streaming để xử lý hàng loạt dữ liệu và tận dụng công cụ
Spark dẫn đến thông lượng gần như cao hơn cho các hệ thống phát trực tuyến
khác. Spark Streaming có thể đạt được độ trễ thấp tới vài trăm milliseconds.
2.2.4 Thư viện Machine Learning
Apache Spark được trang bị một thư viện phong phú được gọi là MLlib. Thư viện
này chứa một loạt các thuật toán học máy - phân loại, hồi quy, phân cụm. Nó cũng bao
gồm các công cụ khác để xây dựng, đánh giá và điều chỉnh đường ông dữ liệu. Tất cả các
chức năng này giúp Spark mở rộng quy mô trên một cụm. Theo các so sánh Benchmark
Spark MLlib nhanh hơn 9 lần so với phiên bản chạy trên Hadoop (Apache Mahout).
2.2.5 GraphX
Graphx là nền tảng xử lý đồ thị dựa trên Spark. Nó cung cấp các API để diễn tả các
tính toán trong đồ thị bằng cách sử dụng Pregel API. Việc sử dụng Graphx có thể được
nhìn thấy trong bạn bè của Facebook, kết nối của LinkedIn, bộ định tuyến Internet. Mặc
dù khái niệm tính toán Graphx có vẻ rất đơn giản, nhưng các ứng dụng của Graphx thực
Trang 40/69
NGUYỄN XUÂN MINH
sự là vô hạn với các trường hợp sử dụng trong phát hiện ngân hàng, thị trường chứng
khoán.
GraphX mở rộng Spark RDD bằng Property Graph phân tán đàn hồi. Property
Graph là một đồ thị đa hướng có thể có nhiều cạnh song song. Mỗi cạnh và đỉnh có các
thuộc tính do người dùng xác định được liên kết với nó. Các cạnh song song cho phép
nhiều quan hệ giữa các đỉnh giống nhau.
Các trường hợp sử dụng đồ thị tính toán:
Hệ thống phát hiện thảm họa
Graphx có thể được sử dụng để phát hiện các thảm họa như bão, động đất, sóng
thần, cháy rừng và núi lửa để đưa ra các cảnh báo cảnh báo cho mọi người.
Phát hiện gian lận tài chính:
Hình 2-8 Hệ thống phát hiện gian lận trong tài chính
Phân tích biểu đồ có thể được sử dụng để giám sát giao dịch tài chính và phát hiện
những người liên quan đến gian lận tài chính và rửa tiền.
Phân tích kinh doanh:
Trang 41/69
NGUYỄN XUÂN MINH
Biểu đồ, khi được sử dụng cùng với Machine Learning, sẽ giúp hiểu được xu
hướng mua hàng của người dùng. Ví dụ: Uber, McDonald's, v.v.
Hệ thống thông tin địa lý:
Đồ thị được sử dụng nhiều để phát triển các chức năng trên hệ thống thông tin địa
lý như phân định lưu vực sông và dự báo thời tiết.
Pregel là nền tảng có khả năng mở rộng và chịu lỗi của Google với API đủ linh
hoạt để thể hiện biểu đồ tùy ý thuật toán
Các tính năng của Spark Graphx:
Tính linh hoat: Spark GraphX hoạt động với cả biểu đồ và tính toán. GraphX hợp
nhất ETL (trích xuất, biến đổi & tải), phân tích thăm dò và tính toán biểu đồ lặp
trong một hệ thống duy nhất. Chúng ta có thể xem cùng một dữ liệu dưới dạng cả
biểu đồ, chuyển đổi và nối các biểu đồ với RDD một cách hiệu quả và viết các
thuật toán biểu đồ lặp tùy chỉnh bằng cách sử dụng API Pregel.
Tốc độ: Spark GraphX cung cấp hiệu suất tương đương với các hệ thống xử lý đồ
thị chuyên dụng nhanh nhất. Nó có thể so sánh với các hệ thống đồ thị nhanh nhất
trong khi vẫn giữ được tính linh hoạt, khả năng chịu lỗi và dễ sử dụng của Spark.
Trang 42/69
NGUYỄN XUÂN MINH
Phát triển thư viện thuật toán: Chúng ta có thể chọn từ thư viện thuật toán đồ thị
đang phát triển mà Spark GraphX cung cấp. Một số thuật toán phổ biến là page
rank, connected components, label propagation, SVD++.
Khi chương trình điều khiển trong kiến trúc Apache Spark thực thi, nó gọi chương
trình thực của một ứng dụng và tạo một SparkContext. SparkContext chứa tất cả các chức
năng cơ bản. Trình điều khiển Spark bao gồm một số thành phần khác, bao gồm lập lịch
DAG, lập lịch yêu cầu, lập lịch Backend, and quản lý khối, tất cả đều chịu trách nhiệm
dịch mã do người dùng viết thành các công việc thực sự được thực thi trên cụm.
Quản lý cụm thực hiện các công việc khác nhau trong cụm.Trình điều khiển Spark
hoạt động cùng với quản lý cụm để kiểm soát việc thực hiện nhiều công việc khác. Quản
lý cụm làm nhiệm vụ phân bổ tài nguyên cho công việc. Khi công việc đã được chia thành
các công việc nhỏ hơn, sau đó được phân phối cho các nút công nhân, trình điều khiển
Spark sẽ kiểm soát quá trình thực thi. Nhiều nút công nhân có thể được sử dụng để xử lý
RDD được tạo trong SparkContext và kết quả cũng có thể được lưu vào bộ đệm.
Trang 43/69
NGUYỄN XUÂN MINH
SparkContext nhận thông tin tác vụ từ cụm quản lý và đưa nó vào hàng đợi trên
các nút công nhân. Chúng ta có thể tăng số lượng công nhân nếu chúng ta muốn cải thiện
hiệu suất của hệ thống. Bằng cách này, chúng ta có thể chia công việc thành các phần
mạch lạc hơn.
Mỗi SparkSession có một mục trong SparkContexts. Trình điều khiển Spark bao
gồm nhiều thành phần hơn để thực hiện các công việc trong cụm, cũng như quản lý cụm.
Khi một quy trình được thực thi trong cụm, công việc được chia thành các giai đoạn với
các giai đoạn đạt được thành các tác vụ theo lịch trình.
Trang 44/69
NGUYỄN XUÂN MINH
gian sử dụng. Chương trình trình điều khiển giám sát người thi hành khi họ thực hiện các
tác vụ của người dùng.
Trang 45/69
NGUYỄN XUÂN MINH
Tốc độ: Spark hoạt động nhanh hơn tới 100 lần so với MapReduce để xử lý lượng
lớn dữ liệu. Nó cũng có thể chia dữ liệu thành các khối theo cách được kiểm soát.
Bộ nhớ đệm mạnh mẽ: Khả năng lưu trữ bộ nhớ đệm và ổ cứng mạnh mẽ được
cung cấp bởi một lớp lập trình đơn giản.
Triển khai: Mesos, Hadoop thông qua YARN hoặc trình quản lý cụm riêng của
Spark đều có thể được sử dụng để triển khai nó.
Thời gian thực: Do xử lý trong bộ nhớ, nó cung cấp khả năng tính toán thời gian
thực và độ trễ thấp.
Đa ngôn ngữ: Ngoài Java, Scala, Python và R, Spark cũng hỗ trợ cả bốn ngôn ngữ
này. Bạn có thể viết mã Spark bằng bất kỳ ngôn ngữ nào trong số này. Spark cũng
cung cấp giao diện dòng lệnh trong Scala và Python.
Khả năng mở rộng: Dễ dàng mở rộng lên hàng nghìn nút.
Trang 46/69
NGUYỄN XUÂN MINH
Trang 47/69
NGUYỄN XUÂN MINH
Chương 3. Xây dựng luồng Spark Streaming lưu trữ trên HDFS
3.1 Bài toán xây dựng luồng Spark streaming lưu trữ trên HDFS
Bài toán phát biểu như sau: Sử dụng các công cụ trong Bigdata, xây dựng luồng dữ
liệu về bệnh tim mạch lưu trữ trên HDFS để phân tích bệnh tim mạch qua từng năm theo
chỉ số.
Để giải quyết bài toán trên, các luồng dữ liệu sau cần được xử lý như sau (hình
3.1):
Dữ liệu sẽ được lấy trên Kaggle và sử dụng python để làm sạch dữ liệu.
Spark streaming sẽ lấy dữ liệu trong Kafka ra, tiến hành trích xuất, biến đổi dữ liệu
bằng Spark SQL thành đúng định dạng và đẩy vào HDFS.
Tiếp đó Hive sẽ kết nối tới HDFS để lấy dữ liệu đổ vào Superset phục vụ cho việc
vẽ biểu đồ, từ đó các phân tích được thực hiện thông qua các biểu đồ.
Trang 48/69
NGUYỄN XUÂN MINH
Trang 49/69
NGUYỄN XUÂN MINH
Apache Zookeeper: Zookeeper đóng vai trò cung cấp các dịch vụ lõi của
hệ thống phân tán như: dịch vụ quản lý cấu hình hệ thống, bầu trưởng
nhóm (leader election), định danh (naming), lưu trữ các thông tin chung
Metadata như thông tin về chủ đề, phân vùng của chủ đề, danh sách nhà
môi giới, vị trí dữ liệu Offset mà khách hàng đã đọc đến… Zookeeper
được Kafka để bầu tự động nhà lãnh đạo cho các phân vùng, quản lý danh
sách nút máy chủ hoạt động và quản lý danh sách các chủ đề.
Apache Kafka: Apache Kafka là hệ thống truyền thông điệp phân tán, độ
tin cậy cao, dễ dàng mở rộng và có thông lượng cao. Kafka cung cấp cơ
chế offset (có thể hiểu như tương tự như chỉ số của một mảng) để lấy
thông điệp một cách linh hoạt, cho phép các ứng dụng xử lý có thể xử lý
lại dữ liệu nếu việc xử lý trước đó bị lỗi. Ngoài ra, cơ chế đăng kí theo dõi
cho phép việc lấy thông điệp ra gần như tức thời ngay khi dữ liệu đi vào
hàng đợi. Kafka được thiết kế hỗ trợ tốt cho việc thu thập dữ liệu thời gian
thực.
3.2.1.1 Kiến trúc Kafka
Trang 50/69
NGUYỄN XUÂN MINH
Trang 51/69
NGUYỄN XUÂN MINH
Chủ đề Kafka:
Chủ đề là một kênh để các nhà sản xuất công bố các tin nhắn và từ đó khách hàng
nhận được tin nhắn.
Mỗi chủ đề sẽ có tên do khách hàng đặt và có thể coi mỗi chủ đề như là một hàng
đợi của thông điệp (mỗi dòng dữ liệu). Các thông điệp mới do một hoặc nhiều nhà
sản xuất đẩy vào, sẽ luôn luôn được thêm vào cuối hàng đợi. Bởi vì mỗi thông
điệp được đẩy vào chủ đề sẽ được gán một Offset tương ứng (ví dụ: thông điệp
đầu tiên có Offset là 1, thông điệp thứ hai là 2 ...) nên khách hàng có thể dùng
Offset này để điều khiển quá trình đọc thông điệp. Nhưng cần lưu ý là bởi vì
Kafka sẽ tự động xóa những thông điệp đã quá cũ (thông điệp đẩy vào đã quá hai
tuần hoặc xóa bởi vì bộ nhớ cho phép để chứa thông điệp đã đầy) vì vậy sẽ gặp lỗi
nếu truy cập vào các chủ đề đã bị xóa.
Phân vùng Kafka
Chủ đề trong Kafka có thể có kích cỡ rất lớn, như vậy không nên lưu trữ tất cả dữ
liệu của một chủ đề trên một nút, dữ liệu cần được phân chia ra thành nhiều phân
vùng sẽ giúp bảo toàn dữ liệu cũng như xử lý dữ liệu dễ dàng hơn.
Phân vùng cho phép chúng ta thực hiện đăng ký song song tới một chủ đề cụ thể
bằng cách phân chia dữ liệu trong một topic cụ thể ra cho nhiều nhà môi giới khác
nhau, mỗi phân vùng có thể được đặt trên một máy riêng biệt – cho phép nhiều
khách hàng đọc dữ liệu từ một chủ đề diễn ra một cách song song.
Với mỗi phân vùng, tùy thuộc vào khách hàng cấu hình sẽ có một số bản sao chép
nhất định để đảm bảo dữ liệu không bị mất khi một nút trong cụm bị hỏng. Tuy
nhiên, số lượng bản sao không được vượt quá số lượng nhà môi giới trong cụm, và
những bản sao đó sẽ được lưu lên các nhà môi giới khác.
Nhà môi giới chứa bản chính của phân vùng gọi là nhà môi giới lãnh đạo. Những
bản sao chép này có tác dụng giúp hệ thống không bị mất dữ liệu nếu có một số
nhà môi giới bị lỗi, với điều kiện số lượng nhà môi giới bị lỗi không lớn hơn hoặc
bằng số lượng bản sao của mỗi phân vùng.
Để tăng tính khả dụng của phân vùng, mỗi phân vùng cũng có giá trị sao chép của
riêng nó.
Tất cả các hành động ghi và đọc tới một chủ đề sẽ đều phải đi qua phân vùng chính
tương ứng và phân vùng sẽ phối hợp để cập nhật dữ liệu mới tới các phân vùng sao
chép khác. Nếu phân vùng chính bị hỏng, một trong các phân vùng sao chép sẽ
đảm nhận vai trò là một phân vùng chính mới.
Để một nhà sản xuất và khách hàng ghi/đọc tin nhắn từ một phân vùng, chắc chắn
chúng cần phải biết phân vùng chính. Kafka lưu trữ những thông tin như vậy là
Metadata trong Zookeeper.
Nhà môi giới
Một host có thể chạy nhiều server Kafka, mỗi server như vậy gọi là một nhà môi
giới. Các nhà môi giới này cùng trỏ tới chung một zookeeper thì chúng là một cụm
nhà môi giới. Nhà môi giới là nơi chứa các phân vùng. Một nhà môi giới có thể
chứa nhiều phân vùng.
Trang 53/69
NGUYỄN XUÂN MINH
Hình 3-6 Hoạt động gửi dữ liệu của nhà sản xuất
Khách hàng
Khách hàng đọc các tin nhắn từ bất kỳ phân vùng nào khi có cùng một chủ đề, cho
phép mở rộng lượng tin nhắn được sử dụng tương tự như cách các nhà sản xuất
cung cấp tin nhắn.
Đồng thời, khách hàng biết nên đọc tin nhắn từ nhà môi giới nào. Trong trường
hợp chưa đọc xong mà nhà môi giới gặp sự cố, khách hàng cũng có cơ chế tự phục
hồi.
Việc đọc tin nhắn trong một phân vùng diễn ra tuần tự để đảm bảo khách hàng
không thể đọc tin nhắn từ Offset = 3 khi chưa đọc xong Offset = 2.
Trang 54/69
NGUYỄN XUÂN MINH
Trang 55/69
NGUYỄN XUÂN MINH
Một khách hàng có thể nhận tin nhắn từ nhiều phân vùng. Nhưng một phân
vùng không thể gửi tin nhắn cho nhiều khách hàng trong cùng nhóm khách
hàng.
Nhược điểm:
Chưa có bộ công cụ giám sát hoàn chỉnh: Có nhiều tool khác nhau nhưng mỗi tool
chỉ đáp ứng một tính năng quản lý nhất định, chẳng hạn như: Kafka tool (Offset
manager) GUI tool (quản lý chủ đề và khách hàng), Lense (hỗ trợ tuy vẫn tin
nhắn), Akhq (toolbox quản lý Kafka và xem dữ liệu bên trong Kafka).
Không chọn được chủ đề theo wildcard: khách hàng sẽ cần phải sử dụng chính xác
tên chủ đề để xử lý tin nhắn.
Trang 56/69
NGUYỄN XUÂN MINH
Giảm hiệu suất: Kích thước tin nhắn tăng khiến cho khách hàng và nhà sản xuất
phải nén và giải nén tin nhắn, từ đó làm bộ nhớ bị chậm đi, ảnh hưởng đến thông
lượng và hiệu suất.
Xử lý chậm: Đôi khi số lượng hàng đợi trong cụm Kafka tăng đột biến khiến
Kafka xử lý chậm hơn.
Trang 57/69
NGUYỄN XUÂN MINH
Trang 58/69
NGUYỄN XUÂN MINH
Tích hợp sâu với Druid cho phép Superset duy trì tốc độ nhanh trong khi cắt và cắt
các bộ dữ liệu lớn, thời gian thực.
Bảng điều khiển tải nhanh với bộ nhớ đệm cấu hình.
Chọn Datanodes để xem thông tin các nút của cụm. Cụm Hadoop có bộ nhớ 96GB
có 14 khối , phiên bản sử dụng: 3.2.1
Trang 59/69
NGUYỄN XUÂN MINH
Trang 61/69
NGUYỄN XUÂN MINH
Trang 62/69
NGUYỄN XUÂN MINH
Hiện tại, việc đọc từng dòng trong tệp dữ liệu csv được giả định với tốc độ
1ms/record. Sau khi chạy xong, dữ liệu sẽ được vào chủ đề minhnx12_demo.
Trang 63/69
NGUYỄN XUÂN MINH
Hình 3-20 Cấu hình đường dẫn lưu dữ liệu trên HDFS
Cuối cùng thực hiện nén tệp code trên thành tệp JAR và sử dụng câu lệnh Spark để
đưa lên Masternode:
spark-submit --deploy-mode client --packages org.apache.spark:spark-sql-kafka-0-
10_2.11:2.4.0 --class com.example.btl.sparkss.SparkSS btl-1.0-SNAPSHOT.jar
Sau khi chạy Spark Streaming Kafka, sử dụng lệnh “bin/kafka-console-
consumer.sh --topic minhnx12_demo --bootstrap-server localhost:9092 --from-beginning”
để đẩy kết quả vào Kafka.
Trang 64/69
NGUYỄN XUÂN MINH
Hình 3-23 Tổng số ca mắc bệnh tim theo từng giai đoạn
Trang 65/69
NGUYỄN XUÂN MINH
Hình 3-23 cho thấy tổng số ca mắc bệnh tim là hơn 18 nghìn người, trong đó giới
tính nữ có số ca mắc bệnh gần gấp đôi giới tính nam. Ngoài ra, biểu đồ thống kê số ca
mắc bệnh tim theo độ tuổi còn được thể hiện ở hình 3-24. Từ đây có thể thấy rằng giới
tính nữ có tỉ lệ mắc cao từ giai đoạn trung niên đến cao tuổi. Ở ngoài độ tuổi 50 lượng
hormon sinh dục bị giảm đáng kể và bắt đầu giai đoạn tiến triển các bệnh tim mạch (tăng
huyết áp, bệnh mạch vành...). Ngoài sự thay đổi nội tiết, nguyên nhân khiến phụ nữ ở độ
tuổi này mắc bệnh tim mạch nhiều hơn so với các độ tuổi khác và nhiều hơn nam giới là
do tỷ lệ mắc bệnh tiểu đường type 2 cao hơn, hay bị các rối loạn tuyến giáp hơn, có nhiều
vấn đề (áp lực) trong gia đình và công việc hơn so với nam. Hệ thống tim mạch ở phụ nữ
cũng dễ bị tổn thương hơn khi có tác động của các tác nhân độc hại. Những phụ nữ lao
động thể lực quá nặng hoặc tinh thần căng thẳng quá độ dễ có khả năng xuất hiện tim đập
thất thường.
Trang 66/69
NGUYỄN XUÂN MINH
huyết áp. Tình trạng này do thuốc lá có những chất làm gan sản xuất enzym đi vào máu
làm hạn chế tác dụng thuốc điều trị tăng huyết áp.
Hình 3-25 Tương quan bệnh tim với các chỉ số Huyết áp, Thuốc lá, Cân nặng
Khi cơ thể bị béo phì sẽ khiến tim của bạn phải hoạt động nhiều hơn và căng thẳng
hơn. Nếu tình trạng này tiếp diễn trong một khoảng thời gian dài có thể dẫn tới suy tim.
Vì vậy, mọi người nên thay đổi lối sống, có chế độ làm việc, ăn uống hợp lý và luyện tập
thể thao đều đặn để tránh dư thừa năng lượng cơ thể, hạn chế béo phì. Đồng thời, đây
cũng là biện pháp quan trọng để giảm nguy cơ gây ra bệnh mạch vành, nhất là ở những
người cao tuổi
3.4 Kết Luận chương 3
Chương này đã trình bày bài toán ứng dụng xây dựng luồng dữ liệu để mô tả quá
trình đọc dữ liệu từ csv, sau đó nhờ việc xử lý của SparkStreaming để lưu trữ dữ liệu trên
HDFS và tạo các biểu đồ phân tích về dữ liệu (bệnh tim mạch). Ngoài ra, quá trình triển
khai bài toán và kết quả đạt được cũng được trình bày cụ thể. Qua đó thấy được ưu thế
của công nghệ mới trong cuộc cách mạng dữ liệu lớn.
Trang 67/69
NGUYỄN XUÂN MINH
KẾT LUẬN
Đồ án được trình bày với ba nội dung chính được thể hiện trong ba chương. Qua
đó cho thấy Hadoop là một Apache framework mã nguồn mở cho phép phát triển các ứng
dụng phân tán để lưu trữ và quản lý các tập dữ liệu lớn. Hadoop hiện thực mô hình
MapReduce, mô hình mà ứng dụng sẽ được chia nhỏ ra thành nhiều phân đoạn khác nhau
được chạy song song trên nhiều node khác nhau.
Đồ án đã xây dựng và triển khai thử nghiệm luồng dữ liệu SparkStreaming lưu trữ
dữ liệu trên HDFS, phân tích dữ liệu thông qua các biểu đồ trên ứng dụng SuperSet. Điều
này chứng minh rằng đường ống dữ liệu này có thể được thực hiện, áp dụng trong nhiều
loại dữ liệu khác nhau tùy theo mục đích yêu cầu của người sử dụng.
Đồ án bước đầu áp dụng cho máy cục bộ, chưa có điều kiện triển khai rộng với
cụm Hadoop (lên tới hàng trăm nút), bộ dữ liệu chưa đủ lớn so với thực tế. Vì vậy, hướng
phát triển tiếp theo của đồ án: (1) mở rộng triển khai với cụm Hadoop; (2) tiếp tục nghiên
cứu mô hình, triển khai thử nghiệm với các kỹ thuật khác như Flink, Cassandra hay theo
xu hướng của hiện tại là trên Cloud.
Trang 68/69
NGUYỄN XUÂN MINH
Trang 69/69