You are on page 1of 69

NGUYỄN XUÂN MINH

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

CHƯƠNG 1. GIỚI THIỆU HADOOP


1.1 Giới thiệu Framework Hadoop
1.1.1 Hadoop là gì?
1.1.2 Lịch sử phát triển của Hadoop
1.1.3 Kiến trúc của Hadoop
1.1.4 Ứng dụng của Hadoop trong một số công ty
1.1.5 Tổng quan của một cụm Hadoop
1.2 Hệ thông tệp phân tán
1.2.1 Giới thiệu
1.2.2 Kiến trúc của HDFS
1.2.2.1 Quá trình tương tác giữa máy khách và HDFS
1.2.2.1.1 Quá trình đọc tệp
1.2.2.1.2 Ghi tệp
1.2.2.2 Kích thước khối
1.2.2.3 Metadata
1.2.3 Khả năng chịu và sửa lỗi của HDFS
1.2.3.1 Khả năng tự phục hồi nhanh chóng
1.2.3.2 Nhân bản các khối
1.2.3.3 Nhân bản các Metadata
1.2.3.4 Toàn vẹn dữ liệu trên HDFS
1.2.4 Lập lịch trong Hadoop
1.2.4.1 Lập lịch FIFO
1.2.4.2 Lập lịch công suất
1.2.4.3 Lập lịch cân bằng
1.3 MapReduce
1.3.1 Giới thiệu

Trang 6/69
NGUYỄN XUÂN MINH

1.3.2 Kiến trúc và cơ chế của MapReduce


1.3.3 MapReduce với bài toán Word Count
1.3.4 Ưu điểm của MapReduce
1.3.4.1 Xử lý song song
1.3.4.2 Vị trí dữ liệu
1.3.5 Kết luận chương 1

CHƯƠNG 2. TỔNG QUAN VỀ SPARK STREAMING


2.1 Giới thiệu về Spark
2.2 Các thành phần của Spark
2.2.1 Lõi Apache Spark
2.2.2 Spark SQL
2.2.3 Spark Streaming
2.2.4 Thư viện Machine Learning
2.2.5 GraphX
2.3 Kiến trúc Spark
2.3.1 Trình điều khiển Spark
2.3.2 Spark Executors
2.3.3 Quản lý cụm
2.3.4 Nút công nhân
2.3.5 Phương thức thực hiện
2.4 Các tính năng của Spark
2.5 Ưu điểm của Apache Spark
2.6 Kết luận chương 2

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

3.3.1.1 Cài đặt Hadoop


3.3.1.2 Cài đặt Kafka
3.3.1.3 Cài đặt Spark
3.3.1.4 Cài đặt Superset
3.3.2 Kết quả đạt được
3.4 Kết Luận chương 3

KẾT LUẬN
TÀI LIỆU THAM KHẢO

Trang 8/69
NGUYỄN XUÂN MINH

DANH MỤC HÌNH VẼ

Hình 1-1 Các thành phần của Hadoop


Hình 1-2 Kiến trúc tổng quan của một cụm Hadoop
Hình 1-3 Kiến trúc HDFS
Hình 1-4 Quá trình đọc tệp trên HDFS
Hình 1-5 Quá trình ghi tệp trên HDFS
Hình 1-6 Các khối trong HDFS
Hình 1-7 Lập lịch FIFO
Hình 1-8 Lập lịch công suất
Hình 1-9 Lập lịch cân bằng
Hình 1-10 Kiến trúc của MapReduce
Hình 1-11 MapReduce xử lý bài toán Word Count
Hình 1-12 Xử lý thông thường và MapReduce

Hình 2-1 Các thành phần của Spark


Hình 2-2 Spark RDD - Narrow Transformation
Hình 2-3 Spark RDD - Wide Transformation
Hình 2-4 Hạn chế của Apache Spark RDD
Hình 2-5 Luồng xử lý của Spark Streaming
Hình 2-6 Đồ thị đa hướng
Hình 2-7 Hệ thống phát hiện thảm họa
Hình 2-8 Hệ thống phát hiện gian lận trong tài chính
Hình 2-9 Hệ thống phân tích kinh doanh
Hình 2-10 Hệ thống thông tin địa lý
Hình 2-11 Hệ thống Google Pregel
Hình 2-12 Kiến trúc của Apache Spark
Hình 2-13 Tính năng của Apache Spark

Hình 3-1 Luồng xử lý dữ liệu


Hình 3-2 Thành phần trong hệ thống Kafka
Hình 3-3 Kiến trúc của Kafka
Hình 3-4 Phân vùng của Kafka

Trang 9/69
NGUYỄN XUÂN MINH

Hình 3-5 Thứ tự ghi và đọc tới một chủ đề


Hình 3-6 Hoạt động gửi dữ liệu của nhà sản xuất
Hình 3-7 Hoạt động đọc dữ liệu của khách hàng
Hình 3-8 Hoạt động của nhóm khách hàng
Hình 3-9 Cơ chế giao tiếp giữa chủ đề và khách hàng
Hình 3-10 Giao diện vẽ Dashboard của Superset
Hình 3-11 Trạng thái của Hadoop
Hình 3-12 Thông tin của cụm của Hadoop
Hình 3-13 Khởi tạo Zookeeper thành công
Hình 3-14 Khởi tạo Apache Kafka thành công
Hình 3-15 Khởi tạo Spark thành công
Hình 3-16 Giao diện Superset sau khi khởi tạo
Hình 3-17 Cấu hình Producer trên Kafka
Hình 3-18 Cấu hình tệp SparkStreaming
Hình 3-19 Chọn các trường trong DataFrame
Hình 3-20 Cấu hình đường dẫn lưu dữ liệu trên HDFS
Hình 3-21 Dữ liệu được đẩy vào kafka
Hình 3-22 Dữ liệu lưu trên HDFS
Hình 3-23 Tổng số ca mắc bệnh tim theo từng giai đoạn
Hình 3-24 Số ca mắc bệnh tim theo tuổi
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

Trang 10/69
NGUYỄN XUÂN MINH

THUẬT NGỮ VIẾT TẮT

Thuật ngữ Nghĩa tiếng Anh Nghĩa tiếng Việt


API Application Programming Interface Giao diện lập trình ứng dụng
DAG Directed Acyclic Graph Đồ thị không chu trình có hướng
GFS Google File System Hệ thống tệp của Google
HDFS Hadoop Distributed File System Hệ thống lưu trữ phân tán
HDL High Density Lipoprotein Lipoprotein mật độ cao
IDE Integrated Development Môi trường phát triển tích hợp
Environment
JAR Java ARchive Tệp nén
JDK Java Development Kit Bộ phát triển Java
JVM Java Virtual Machine Máy ảo Java
LDAP Lightweight Directory Access Giao thức truy cập trực tiếp
Protocol Lightweight
LDL Low Density Lipoprotein Lipoprotein tỉ trọng thấp
ODBC Open Database Connectivity Kết nối cơ sở dữ liệu mở
RAM Random Access Memory Bộ nhớ truy cập ngẫu nhiên
RDD Resilient Distributed Dataset Tập dữ liệu phân tán linh hoạt
RPC Remote Procedure Call Các cuộc gọi thủ tục từ xa
SQL Structured Query Language Ngôn ngữ truy vấn cơ sở dữ liệu
TCP Transmission Control Protocol Giao thức điều khiển truyền nhận
YARN Yet-Another-Resource-Negotiator

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

CHƯƠNG 1. GIỚI THIỆU HADOOP

1.1 Giới thiệu Framework Hadoop


1.1.1 Hadoop là gì?
Apache Hadoop là Framework mã nguồn mở, nó cho phép phát triển các ứng dụng
phân tán có cường độ dữ liệu lớn một cách miễn phí. Hadoop được phát triển dựa trên ý
tưởng từ các công bố của Google về mô hình MapReduce và hệ thống tệp phân tán
Google. Hadoop cung cấp một hệ thống tệp phân tán (HDFS) cho phép lưu trữ dữ liệu
dựa lên trên nhiều nút. Cả Map/Reduce và HDFS đều được thiết kế sao cho framework sẽ
tự động quản lý được các lỗi, các hư hỏng về phần cứng của các nút.

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.

1.1.2 Lịch sử phát triển của Hadoop


Hadoop bắt đầu vào năm 2002 với dự án Apache Nutch. Hadoop được tạo ra bởi
Dough Cutting, người tạo ra Apache Lucene, thư viện tìm kiếm văn bản được sử dụng
rộng rãi. Hadoop có nguồn gốc từ Apache Nutch, một công cụ tìm kiếm web mã nguồn
mở, bản thân nó là một phần của dự án Lucene.

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.

1.1.3 Kiến trúc của Hadoop


Trong phần này sẽ trình bày kiến trúc tổng quan của Hadoop. Hadoop bao gồm các
thành phần:
Trang 14/69
NGUYỄN XUÂN MINH

Hình 1-1 Các thành phần của Hadoop


Core: cung cấp các công cụ và giao diện cho hệ thống phân tán. Đây là phần lõi để
xây dựng nên HDFS và MapReduce.
MapReduce: giúp phát triển các ứng dụng phân tán theo mô hình MapReduce một
cách dễ dàng và mạnh mẽ, Framework này có thể chạy trên một cụm lớn với nhiều nút.
HDFS: đây là hệ thống tệp phân tán cung cấp khả năng lưu trữ dữ liệu lớn và truy
cập với hiệu suất cao.
HBase: đây là một cơ sở dữ liệu phân tán, sử dụng HDFS làm hạ tầng cho việc lưu
trữ dữ liệu bên dưới và cung cấp khả năng tính song song dựa trên MapReduce.
Hive: đây là một kho dữ liệu phân tán. Nó quản lý dữ liệu được lưu trữ trên HDFS
và cung cấp một ngôn ngữ truy vấn dựa trên SQL.
Chukwa: một hệ thống tập hợp và phân tích dữ liệu. Chukwa chạy các chương
trình tập hợp dữ liệu, các chương trình này lưu trữ dữ liệu trên HDFS và sử dụng
MapReduce để phát sinh các báo cáo.
Pig: ngôn ngữ luồng dữ liệu cấp cao và thực thi cho việc tính toán song song.

1.1.4 Ứng dụng của Hadoop trong một số công ty


Ngày nay, ngoài Yahoo!, có nhiều công ty sử dụng Hadoop như là một công cụ để
lưu trữ và phân tích dữ liệu trên các khối dữ liệu lớn như:
Expedia: sử dụng các cụm Hadoop bằng Amazon Elastic MapReduce (Amazon
EMR) để phân tích khối lượng lớn dữ liệu đến từ mạng lưới trang web toàn cầu của
Expedia. Chúng bao gồm dòng nhấp chuột, tương tác người dùng và dữ liệu cung cấp. Có
giá trị cao trong việc phân bổ chi tiêu tiếp thị, dữ liệu này được hợp nhất từ các lượt đặt
trước trên web, bộ phận tiếp thị và nhật ký chi tiêu tiếp thị để phân tích xem liệu chi tiêu
có tương đương với việc tăng lượt đặt trước hay không.
Royal Bank of Scotland: Là người thúc đẩy trải nghiệm người dùng được nâng
cao, Ngân hàng Hoàng gia Scotland (RBS) đã quyết định sử dụng Hadoop (Cloudera

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.

1.1.5 Tổng quan của một cụm Hadoop


Cluster là một tập hợp các máy tính được kết nối hoạt động cùng nhau như một hệ
thống duy nhất. Tương tự cụm Hadoop chỉ là một cụm máy tính mà được sử dụng để xử
lý phân tán khối lượng dữ liệu khổng lồ. Về cơ bản với mục đích lưu trữ dữ liệu cũng như
phân tích một lượng lớn dữ liệu phi cấu trúc, một loại cụm tính toán đặc biệt được thiết kế
được gọi là cụm Hadoop.

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

1.2 Hệ thống tệp phân tán Hadoop


Khi tập dữ liệu vượt quá khả năng lưu trữ của một máy, thì bắt buộc phải phân
vùng tập dữ liệu trên một số máy riêng biệt. Hệ thống tệp quản lý dữ liệu trên mạng máy
được gọi là hệ thống tệp phân tán Hadoop (HDFS). Hệ thống này cho phép chúng ta lưu
trữ dữ liệu trên nhiều máy hoặc nhiều nút trong một cụm và cho phép nhiều người dùng
truy cập dữ liệu đồng thời cung cấp khả năng chịu lỗi và tính sẵn sàng cao.

1.2.1 Giới thiệu


Trong thế giới CNTT ngày nay, gần 75% dữ liệu trên thế giới nằm trong Hadoop
HDFS.Đó là do các lý do sau:
HDFS lưu trữ dữ liệu trên toàn bộ phần cứng nên không cần các máy cao cấp để
lưu trữ dữ liệu siêu lớn. Do đó cung cấp dung lượng lưu trữ tiết kiệm cho dữ liệu lớn.
HDFS tuân theo mô hình xử lý dữ liệu hiệu quả nhất ghi một lần và đọc nhiều lần
(Write - Once - Read - Many – Times). Dữ liệu có thể được truy cập nhiều lần mà không
gặp bất kỳ vấn đề gì liên quan đến sự kết hợp dữ liệu. Tập dữ liệu từ nhiều nguồn khác
nhau được sao chép và phân tích khác nhau trên tập dữ liệu đó theo thời gian. Vì vậy, xử
lý hàng loạt là cần thiết và bổ sung dữ liệu vào tệp sẽ trở thành vấn đề để tối ưu hoá hiệu
suất.
HDFS có thể lưu trữ dữ liệu ở bất kỳ kích thước nào được tạo từ bất kỳ từ nguồn
nào ở bất kỳ định dạng nào, có cấu trúc hoặc không có cấu trúc.
Cụ thể có rất nhiều cụm Hadoop chạy HDFS trên thế giới, chẳng hạn như Yahoo
với có cụm lên đến 1100 nút với dung lượng HDFS 12 PB. Các công ty khác như
Facebook, Adode, Amazon cũng đã xây dựng các cụm chạy HDFS với dung lượng hàng
trăm, hàng nghìn TB.

1.2.2 Kiến trúc của HDFS


HDFS được thiết kế dựa trên mô hình master/slave trong đó master là NameNode
và slave là DataNode.
NameNode là nơi lưu trữ thông tin Metadata của cụm, bao gồm các thông tin như
vị trí, số lượng khối của tệp, quyền truy cập vào tệp đó,… NameNode là nơi tiếp nhận các
yêu cầu đọc ghi từ máy khách và điều phối hoạt động của cụm.

Trang 18/69
NGUYỄN XUÂN MINH

Hình 1-3 Kiến trúc HDFS

Metadata trong NameNode được lưu trữ dưới dang 2 file:


 FSImage: Hệ thống tệp ảnh lưu trữ Metadata của NameNode từ khi khởi tạo.
 EditLogs: Chứa thông tin các thay đổi gần đây nhất của cụm chưa có trong
FSImage.

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.

1.2.2.1 Quá trình tương tác giữa máy khách và HDFS


Việc tồn tại duy nhất một NameNode trên một hệ thống HDFS đã làm đơn giản
hoá thiết kế của hệ thống và cho phép NameNode ra những quyết định thông minh trong
việc sắp xếp các khối dữ liệu lên trên các DataNode. Tuy nhiên, cần phải tối thiểu hoá sự
tham gia của NameNode vào các quá trình đọc/ghi dữ liệu lên hệ thống để tránh tình trạ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.

1.2.2.1.1 Quá trình đọc tệp

Hình 1-4 Quá trình đọc tệp trên HDFS

Đầ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.

1.2.2.1.2 Ghi tệp

Hình 1-5 Quá trình ghi tệp trên HDFS

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.

1.2.2.2 Kích thước khối


HDFS cũng chia tệp ra thành các khối, và mỗi khối này sẽ được lưu trữ trên
DataNode thành một tệp riêng biệt trên hệ thống tệp cục bộ của nó. Đây cũng sẽ là đơn vị
trao đổi dữ liệu nhỏ nhất giữa HDFS và máy khách của nó. Kích thước khối là một trong
những điểm quan trọng trong thiết kế HDFS. Kích thước khối mặc định của HDFS là
64MB, nhưng thông thường trên các hệ thống lớn người ta dùng kích thước khối là 128
MB, lớn hơn kích thước khối của các hệ thống tệp truyền thống rất nhiều.

Trang 22/69
NGUYỄN XUÂN MINH

Hình 1-6 Các khối trong HDFS

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.

Trong Hadoop, NameNode gồm có 2 loại Metadata:


 Hệ thống tệp Metadata: Nó có tất cả thông tin về tệp, tức là quyền đối với tệp cụ
thể, kích thước, thời gian, hệ số sao chép và nó tiếp tục phân chia thành hai loại.
Thứ nhất Fsimage: chứa tất cả các thuộc tính hệ thống tệp và thông tin về các khối
dữ liệu được ánh xạ. Thứ hai là Edit-logs: bất kỳ thao tác như viết, xóa, cập nhật,
v,v.. tất cả đều được lưu trữ trong nhật ký của hệ thống tệp cục bộ của NameNode.
 Bitmap: Nó chứa thông tin ánh xạ giữa khối và DataNode, tức là khối nào sẽ trên
DataNode nào. Metadata này sẽ không bao giờ tồn tại trên ổ đĩa.

1.2.3 Khả năng chịu lỗi và sửa lỗi của HDFS


1.2.3.1 Khả năng tự phục hồi nhanh chóng
Các NameNode và DataNode đều được thiết kế để có thể phục hồi nhanh chóng.
Trong trường hợp NameNode bị ngừng hoạt động, chỉ cần phục hồi lại NameNode mà
không cần phải khởi tạo lại tất cả các DataNode. Sau khi NameNode phục hồi nó sẽ tự
động liên lạc lại với các DataNode và hệ thống lại phục hồi. Nếu một DataNode bất kỳ bị
ngừng hoạt động, ta chỉ cần khởi động lại DataNode này và nó sẽ tự động liên lạc với
NameNode thông qua các HeartBeat để cập nhật lại tình trạng của mình trên NameNode.

1.2.3.2 Nhân bản các khối


Như đã trình bày ở các phần trên, mỗi khối dữ liệu trên HDFS được lưu trữ trùng
lặp trên các DataNode khác nhau thuộc các giá đỡ khác nhau. Người dùng (hoặc ứng
dụng) có thể gán các chỉ số mức độ nhân bản (replication level) khác nhau cho các tệp
khác nhau, tuỳ vào mức độ quan trọng của tệp đó, chỉ số mặc định là ba. Nhờ vậy, khi
một hay một số DataNode bị ngừng hoạt động, ta vẫn còn ít nhất một bản sao của khối.

1.2.3.3 Nhân bản các Metadata


Khi NameNode gặp phải sự cố gì đó (cả phần cứng hay phần mềm) thì tất cả các
tệp trên hệ thống HDFS đều sẽ bị mất, vì ta không có cách nào để tái cấu trúc lại các tệp
từ các khối được lưu trên các DataNode. Đó là lý do có sự tồn tại của NameNode phụ.
NameNode phụ là một nút duy nhất trên cụm Hadoop. NameNode phụ không đóng vai trò
Trang 24/69
NGUYỄN XUÂN MINH

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.

1.2.3.4 Toàn vẹn dữ liệu trên HDFS


HDSF đảm bảo tính toàn vẹn của dữ liệu bằng cách thực hiện tạo kiểm tra tổng số
tất cả dữ liệu ghi lên nó và sẽ kiểm tra lại mỗi khi đọc dữ liệu. DataNode chịu trách nhiệm
kiểm tra tính toàn vẹn dữ liệu bằng cách xem lại checksum trước khi lưu trữ dữ liệu và
checksum của nó. Điều này được thực hiện khi DataNode nhận được dữ liệu từ máy
khách hay từ các DataNode khác trong quá trình nhân bản các khối thông qua thuộc tính
của dữ liệu.

1.2.4 Lập lịch trong Hadoop


1.2.4.1 Lập lịch FIFO
FIFO nghĩa là First In First Out, các công việc được yêu cầu trước sẽ thực hiện
trước. Hình 1-7 mô tả bộ lập lịch này:

Trang 25/69
NGUYỄN XUÂN MINH

Hình 1-7 Lập lịch FIFO

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.

1.2.4.2 Lập lịch công suất


Lập lịch công suất chia tài nguyên trong YARN thành các hàng đợi, ứng dụng sẽ
chuyển các công việc vào các hàng đợi này trong YARN, các hàng đợi sẽ được cấu hình
một lượng tài nguyên nhất định và có thể sử dụng nhiều hơn giá trị cấu hình tối đa nếu có
nhiều tài nguyên đang rỗi.

Hình 1-8 Lập lịch công suất

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.

1.2.4.3 Lập lịch cân bằng


Nếu như lập lịch công suất yêu cầu bạn phải dự trữ trước một lượng tài nguyên cho
các hàng đợi thì lập lịch cân bằng không như vậy. Lập lịch cân bằng sẽ tự động cân bằng
tài nguyên giữa các hàng đợi khi chạy. Nếu công việc đầu tiên được gửi, nó sẽ chiếm toàn
bộ tài nguyên trong cụm, đến khi có công việc hai được gửi, tài nguyên sẽ được điều
chỉnh về 50% cho hai hàng đợi.

Trang 27/69
NGUYỄN XUÂN MINH

Hình 1-9 Lập lịch cân bằng

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.

1.3.2 Kiến trúc và cơ chế của MapReduce

Hình 1-10 Kiến trúc của MapReduce

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.

MapReduce chủ yếu gồm 3 lớp sau:


 Lớp Mapper
Giai đoạn đầu tiên trong xử lý dữ liệu bằng MapReduce là lớp ánh xạ. Tại đây,
RecordReader xử lý từng bản ghi đầu vào và tạo cặp khóa-giá trị tương ứng. Mapper của
Hadoop lưu dữ liệu trung gian này vào ổ đĩa cục bộ. Tách đầu vào là biểu diễn xử lý của
dữ liệu, nó đại diện cho một khối công việc chứa một tác vụ duy nhất của Map trong
chương trình MapReduce. RecordReader tương tác với phần tách đầu vào và chuyển đổi
dữ liệu thu được dưới dạng cặp khóa-giá trị.
 Lớp Reducer
Đầu ra trung gian được tạo ra từ trình ánh xạ được đưa lên bộ Reducer và tạo đầu
ra cuối cùng sau đó được lưu trữ trong HDFS.
 Lớp Driver
Thành phần chính trong công việc MapReduce là lớp Driver. Nó chịu trách nhiệm
thiết lập công việc MapReduce để chạy Hadoop. Chúng ta chỉ định tên của các lớp
Mapper và Reducer với các loại dữ liệu và tên công việc tương ứng của chúng.

1.3.3 MapReduce với bài toán Word Count

Hình 1-11 MapReduce xử lý bài toán Word Count

Đầ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.

1.3.4 Ưu điểm của MapReduce


1.3.4.1 Xử lý song song
Trong MapReduce, chúng ta đang phân chia công việc cho nhiều nút và mỗi nút
làm việc đồng thời với một phần của công việc. Vì vậy, MapReduce dựa trên mô hình
chia để trị giúp chúng ta xử lý dữ liệu bằng các máy khác nhau. Vì dữ liệu được xử lý bởi
nhiều máy thay vì một máy song song, thời gian xử lý dữ liệu sẽ giảm đi rất nhiều như
trong hình bên dưới.

Trang 31/69
NGUYỄN XUÂN MINH

Hình 1-12 Xử lý thông thường và MapReduce

1.3.4.2 Vị trí dữ liệu


Thay vì di chuyển dữ liệu đến đơn vị xử lý, chúng ta đang di chuyển đơn vị xử lý
đến dữ liệu trong MapReduce Framework. Trong hệ thống truyền thống, chúng ta thường
mang dữ liệu đến bộ xử lý và xử lý nó. Tuy nhiên, khi dữ liệu tăng lên và trở nên rất lớn,
việc mang lượng dữ liệu khổng lồ này đến bộ xử lý đã đặt ra các vấn đề sau:
 Di chuyển dữ liệu khổng lồ để xử lý rất tốn kém và làm giảm hiệu suất mạng.
 Quá trình xử lý mất thời gian vì dữ liệu được xử lý bởi một đơn vị duy nhất trở
thành nút cổ chai.
 Nút chính có thể bị quá tải và có thể bị lỗi.

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.

1.3.5 Kết luận chương 1


Chương này đã trình bày về kiến trúc, mô hình lập trình MapReduce, chỉ ra được
các ưu nhược điểm, nguyên tắc hoạt động, thực thi MapReduce. Ngoài ra, nội dung
chương này đã giới thiệu về nền tảng Hadoop, trình bày tổng quan thiết kế của HDFS, các
tính năng của NameNode, khả năng chịu lỗi và chẩn đoán lỗi của HDFS, các giao diện
tương tác và quản trị HDFS. Từ đó làm nền tảng để xây dựng mô hình và quy trình thực
hiện phân tích và xử lý dựa trên nền tảng Hadoop.

Trang 32/69
NGUYỄN XUÂN MINH

CHƯƠNG 2. TỔNG QUAN VỀ SPARK STREAMING

2.1 Giới thiệu về Spark


Apache Spark bắt đầu như một dự án nghiên cứu tại UC Berkeley AMPLab vào
năm 2009 và được mã nguồn mở vào đầu năm 2010. Nhiều ý tưởng đằng sau hệ thống
này đã được trình bày trong các tài liệu nghiên cứu khác nhau trong nhiều năm. Sau khi
được phát hành, Spark đã phát triển thành một cộng đồng nhà phát triển rộng lớn và
chuyển sang quỹ phần mềm Apache vào năm 2013. Ngày nay, dự án được cộng tác phát
triển bởi một cộng đồng gồm hàng trăm nhà phát triển từ hàng trăm tổ chức. Apache
Spark đã trở nên phổ biến nhờ có sự tham gia của hơn 500 lập trình viên từ khắp các công
ty lớn nhất thế giới và hơn 225.000 thành viên của cơ sở người dùng Apache Spark.
Alibaba, Tencent và Baidu chỉ là một vài ví dụ nổi tiếng về các công ty thương mại điện
tử sử dụng Apache Spark để điều hành doanh nghiệp của họ nói chung.

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

2.2 Các thành phần của Spark

Hình 2-1 Các thành phần của Spark

2.2.1 Lõi Apache Spark


Lõi Spark là công cụ thực thi chung cơ bản cho nền tảng Spark mà tất cả các chức
năng khác được xây dựng trên đó. Nó cung cấp bộ dữ liệu tham chiếu và tính toán trong
bộ nhớ trong các hệ thống lưu trữ bên ngoài. Là công cụ cơ sở để xử lý dữ liệu phân tán
và song song với quy mô lớn. Nó chịu trách nhiệm về:
 Quản lý bộ nhớ và phục hồi lỗi.
 Lập lịch, phân phối và giám sát công việc trên một cụm.
 Tương tác với hệ thống lưu trữ.

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.

RDD hỗ trợ hai loại hoạt động:


 Chuyển đổi: là các hoạt động (chẳng hạn như Map, Filter, Union, v.v.) được
thực hiện trên một RDD và tạo ra một RDD mới chứa kết quả.

Trang 34/69
NGUYỄN XUÂN MINH

Hình 2-2 Spark RDD – Chuyển Đổi Thu Hẹp

Đó 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

Hình 2-3 Spark RDD – Chuyển Đổi Rộng

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 tính năng của Spark RDD:


 Phân vùng là đơn vị cơ bản của song song trong Spark RDD. Mỗi phân vùng là
một bộ phận hợp lý của dữ liệu có thể thay đổi. Người ta có thể tạo một phân vùng
thông qua một số phép biến đổi trên các phân vùng hiện có.
 Tính bất biến: Dữ liệu an toàn để chia sẻ trên các quy trình. Nó cũng có thể được
tạo hoặc truy xuất bất cứ lúc nào, giúp dễ dàng lưu vào bộ đệm, chia sẻ và sao
chép. Vì vậy, đó là một cách để đạt được sự nhất quán trong tính toán.
 Tính toán trong bộ nhớ: Spark RDD có một cung cấp về tính toán trong bộ nhớ. Nó
lưu trữ các kết quả trung gian trong bộ nhớ phân tán (RAM) thay vì bộ nhớ ổn định
(DISK).
 Khả năng chịu lỗi: Spark RDD có khả năng chịu lỗi vì chúng theo dõi thông tin
dòng dữ liệu để tự động xây dựng lại dữ liệu bị mất khi gặp sự cố. Họ xây dựng lại
dữ liệu bị mất do lỗi bằng cách sử dụng dòng, mỗi RDD nhớ cách nó được tạo từ
Trang 36/69
NGUYỄN XUÂN MINH

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.

Một số hạn chế của Spark RDD:

Hình 2-4 Hạn chế của Apache Spark RDD

 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.

2.2.2 Spark SQL


Spark SQL tập trung vào việc xử lý dữ liệu có cấu trúc, sử dụng phương pháp tiếp
cận khung dữ liệu được mượn từ các ngôn ngữ R và Python (trong Pandas). Như tên gọ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.

2.2.3 Spark Streaming


Spark Streaming đã được thêm vào Apache Spark vào năm 2013, một phần mở
rộng của API Spark cung cấp khả năng xử lý luồng dữ liệu trực tiếp có thể mở rộng,
thông lượng cao và chịu lỗi. Việc nhập dữ liệu có thể được thực hiện từ nhiều nguồn như
Kafka, Apache Flume, Amazon Kinesis hoặc ổ cắm TCP và quá trình xử lý có thể được
thực hiện bằng các thuật toán phức tạp được thể hiện bằng các hàm cấp cao như Map,
Reduce, Join.

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

Xử lý trực tuyến trong Apache Spark


Để xử lý dữ liệu, hầu hết các hệ thống xử lý luồng truyền thống được thiết kế với
mô hình toán tử liên tục, hoạt động như sau:
- Dữ liệu truyền trực tuyến được nhận từ các nguồn dữ liệu (ví dụ: dữ liệu đo từ xa
của hệ thống, dữ liệu thiết bị IoT, v.v.) vào một số hệ thống nhập dữ liệu như Apache
Kafka, Amazon Kinesis, v.v.
- Dữ liệu sau đó được xử lý song song trên một cụm.
- Kết quả được gửi cho các hệ thống bên dưới như HBase, Cassandra, v.v.

Hình 2-5 Luồng xử lý của Spark Streaming

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.

Hình 2-6 Đồ thị đa hướng

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

Hình 2-7 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

Hình 2-9 Hệ thống phân tích kinh doanh

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ý:

Hình 2-10 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.

Hình 2-11 Hệ thống Google Pregel

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++.

2.3 Kiến trúc Spark

Hình 2-12 Kiến trúc của Apache Spark

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.

2.3.1 Trình điều khiển Spark


Nút Master xử lý trong trình điều khiển điều phối các công nhân và giám sát các
nhiệm vụ. Spark được chia thành các công việc và được lên lịch để thực thi trên các bộ
thực thi theo cụm. SparkContexts được trình điều khiển tạo để giám sát công việc đang
hoạt động trong một cụm cụ thể và để kết nối với cụm Spark. Trong sơ đồ, các chương
trình trình điều khiển gọi ứng dụng chính và tạo SparkContexts (hoạt động như gateway)
cùng giám sát công việc đang hoạt động trong cụm và kết nối với cụm Spark. Mọi thứ
được thực hiện bằng SparkContexts.

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.

2.3.2 Spark Executors


Người thực thi chịu trách nhiệm thực hiện một công việc và lưu trữ dữ liệu trong
bộ đệm ngay từ đầu. Người thi hành đăng ký đầu tiên với chương trình trình điều khiển
ngay từ đầu. Những người thực thi này có một số khe thời gian để chạy ứng dụng đồng
thời. Người thực thi chạy tác vụ khi nó đã tải dữ liệu và chúng được loại bỏ ở chế độ
không tải. Trình thực thi chạy trong quy trình Java khi dữ liệu được tải và xóa trong quá
trình thực thi tác vụ. Nhiệm vụ của người dùng được thực hiện trong quy trình Java.

2.3.3 Quản lý cụm


Một chương trình trình điều khiển kiểm soát việc thực hiện các công việc và lưu
trữ dữ liệu trong bộ đệm. Ngay từ đầu, người thi hành đăng ký với trình điều khiển. Trình
thực thi này có một số khe thời gian để chạy ứng dụng đồng thời. Người thực thi đọc và
ghi dữ liệu bên ngoài ngoài việc phục vụ các yêu cầu của người dùng. Một công việc
được thực hiện khi người thi hành đã tải dữ liệu và chúng đã được gỡ bỏ ở trạng thái nhàn
rỗi. Trình thực thi được phân bổ động và nó liên tục được thêm và xóa tùy thuộc vào thời

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.

2.3.4 Nút công nhân


Các nút slave hoạt động như những người thực thi, xử lý các tác vụ và trả kết quả
trở lại SparkContext. Nút master đưa ra các nhiệm vụ cho SparkContext và các nút công
nhân thực hiện chúng. Chúng làm cho quy trình trở nên đơn giản hơn bằng cách tăng các
nút công nhân (1 đến n) để xử lý song song càng nhiều công việc càng tốt bằng cách chia
công việc thành các công việc phụ trên nhiều máy. Một công nhân Spark giám sát các nút
công nhân để đảm bảo rằng việc tính toán được thực hiện một cách đơn giản. Mỗi nút
công nhân xử lý một tác vụ Spark. Trong Spark, một phân vùng là một đơn vị công việc
và được chỉ định cho một người thực thi cho mỗi người.

2.3.5 Phương thức thực hiện


Chúng ta có ba chế độ thực thi khác nhau: cục bộ, chia sẻ và lưu trữ. Những điều
này xác định vị trí thực tế của tài nguyên ứng dụng của bạn khi bạn chạy ứng dụng của
mình. Chúng ta có thể quyết định nơi lưu trữ nguồn cục bộ, ở vị trí được chia sẻ hoặc ở vị
trí dedicated.
Chế độ cụm: là cách chạy ứng dụng Spark thường xuyên nhất. Ở chế độ chế độ
cụm, người dùng cung cấp tập lệnh JAR, tập lệnh Python hoặc tập lệnh R được biên dịch
sẵn cho người quản lý cụm. Sau khi trình quản lý cụm nhận được tập lệnh JAR, Python
hoặc R được biên dịch trước, quy trình trình điều khiển sẽ được khởi chạy trên một nút
worker bên trong cụm, ngoài các quy trình của trình thực thi. Điều này có nghĩa là trình
quản lý cụm phụ trách tất cả các quy trình liên quan đến ứng dụng Spark.
Chế độ người dùng: Trái ngược với chế độ chế độ cụm, trong đó trình điều khiển
Spark vẫn còn trên máy khách đã gửi ứng dụng, trình điều khiển Spark bị xóa ở chế độ
máy khách và do đó chịu trách nhiệm duy trì quy trình trình điều khiển Spark trên máy
khách.
Chế độ cục bộ: Chế độ cục bộ chạy toàn bộ Spark Application trên một máy, trái
ngược với hai chế độ trước đó, chế độ này song song hóa ứng dụng Spark thông qua các
luồng trên máy đó. Do đó, chế độ cục bộ sử dụng các luồng thay vì các luồng song song.
Đây là một cách phổ biến để thử nghiệm với Spark.

Trang 45/69
NGUYỄN XUÂN MINH

2.4 Các tính năng của Spark


Apache Spark, một khung tính toán cụm phổ biến, được tạo ra để tăng tốc các ứng
dụng xử lý dữ liệu. Spark, cho phép các ứng dụng chạy nhanh hơn bằng cách sử dụng
điện toán cụm trong bộ nhớ, là một khung mã nguồn mở phổ biến. Cụm là tập hợp các nút
giao tiếp với nhau và chia sẻ dữ liệu. Do tính song song dữ liệu ẩn và khả năng chịu lỗi,
Spark có thể được áp dụng cho nhiều nhu cầu xử lý tuần tự và tương tác

Hình 2-13 Tính năng của Apache Spark

 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

2.5 Ưu điểm của Apache Spark


- Tốc độ cao: Được thiết kế với công nghệ hiện đại nhằm tăng hiệu suất, Spark có
thể nhanh hơn gấp 100 lần so với apache Hadoop khi xử lý dữ liệu có quy mô lớn
bằng cách khai thác tính toán và các tối ưu hóa khác. Bên cạnh đó, apache Spark
cũng thực hiện nhanh khi dữ liệu được lưu trữ trên đĩa và hiện đang đứng đầu thế
giới về phân loại trên đĩa quy mô lớn.
- Sử dụng dễ dàng: Spark có các API thuận tiện cho sử dụng để làm việc trên các tập
tin dữ liệu lớn. Với hơn 100 toán tử để chuyển đổi dữ liệu và các API data frame
quen thuộc để xử lý các dữ liệu dạng bán cấu trúc.
- Thư viện hỗ trợ rộng: Không chỉ có vậy, Spark còn được đóng gói với các thư viện
cấp cao, bao gồm hỗ trợ truy vấn SQL, học máy, xử lý đồ thị và truyền dữ liệu trực
tuyến. Các thư viện tiêu chuẩn này giúp là tăng năng suất của nhà phát triển và có
thể được kết hợp liền mạch với nhau để tạo ra các quy trình làm việc phức tạp.

2.6 Kết luận chương 2


Chương này đã trình bày về kiến trúc, các thành phần và các tính năng của Spark,
nguyên tắc hoạt động thực thi Apache Spark đặc biệt là SparkStreaming, nhằm thấy được
những ưu điểm của Spark. Spark ra đời như một sứ mệnh mang đến giải pháp hiệu quả
cho việc phân tích và xử lý dữ liệu. Kể từ khi phát hành, Spark đã được các doanh nghiệp
trong nhiều ngành công nghiệp áp dụng nhanh chóng. Từ đó, tạo tiền đề cho việc xây
dựng luồng dữ liệu Spark streaming trong chương 3.

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

Hình 3-1 Luồng xử lý dữ liệu

Các công nghệ được sử dụng:


 Hàng đợi lưu trữ: Apache Kafka (version 2.13-3.0.0).
 Xử lý dữ liệu: Apache Spark–Spark Streaming (version 3.2.0).
 Cập nhật File: Apache Hadoop-HDFS (version 3.2.1).
 Hình ảnh hóa dữ liệu: Superset (version 2.0.1).
 Các ngôn ngữ lập trình sử dụng: Python, Java.
3.2 Một số công cụ liên quan khác
3.2.1 Apache Kafka
Kafka ban đầu được phát triển tại LinkedIn và đã trở thành một dự án cấp cao nhất
của Apache trong năm 2011. Mục tiêu chính của Apache Kafka là trở thành một nền tảng
thống nhất có khả năng mở rộng để xử lý các luồng dữ liệu thời gian thực.
Kafka là một hệ thống tin nhắn theo cơ chế Pub-Sub. Nó cho phép các nhà sản xuất
(gọi là producer) viết các tin nhắn vào Kafka mà một, hoặc nhiều khách hàng (gọi là
consumer) có thể đọc, xử lý được những tin nhắn đó. Các tin nhắn được gửi tới Kafka
theo chủ đề, các chủ đề giống như là các kênh lưu trữ tin nhắn từ nhà sản xuất gửi đến
Kafka, khách hàng đăng kí một hoặc nhiều chủ đề để được xem những tin nhắn đó.
Kafka thường được sử dụng cho 2 mục đích chính sau:
 Xây dựng các luồng dữ liệu xử lý trực tuyến theo thời gian thực để nhận dữ liệu
giữa các hệ thống hoặc ứng dụng một cách đáng tin cậy.
 Xây dựng các ứng dụng trực tuyến theo thời gian thực để biến đổi hoặc ánh xạ đến
các dòng của dữ liệu.
Các thành phần trong hệ thống Kafka

Trang 49/69
NGUYỄN XUÂN MINH

Hình 3-2 Thành phần trong hệ thống Kafka

 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

Hình 3-3 Kiến trúc của Kafka

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.

Hình 3-4 Phân vùng của Kafka


Trang 52/69
NGUYỄN XUÂN MINH

 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ó.

Hình 3-5 Thứ tự ghi và đọc tới một chủ đề

 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

 Nhà sản xuất


 Nhà sản xuất có nhiệm vụ đẩy dữ liệu vào một hoặc nhiều chủ đề. Khách hàng có
thể quyết định liệu những thông điệp (mỗi dòng của dữ liệu) nào sẽ cùng thuộc vào
một phân vùng thông qua một chuỗi khóa đính kèm với thông điệp. Nếu không nhà
sản xuất sẽ gán một khóa ngẫu nhiên và quyết định đích đến của thông điệp dựa
trên giá trị băm của khóa.
 Trong trường hợp gửi tin nhắn đến chủ đề mà không chỉ định phân vùng, nhà sản
xuất sẽ gửi tin nhắn đến nhà môi giới theo cơ chế Round-robin.
 Cơ chế Round-robin: Tin nhắn đầu tiên đi vào nhà môi giới 101, tin nhắn thứ hai đi
vào nhà môi giới 102, tin nhắn tiếp theo đi vào nhà môi giới 103...cứ như vậy, các
tin nhắn được ghi cân bằng giữa các nhà môi giới.

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

Hình 3-7 Hoạt động đọc dữ liệu của khách hàng


 Nếu số lượng nhà sản xuất tăng lên và đồng thời gửi tin nhắn đến tất cả phân
vùng trong khi chỉ có duy nhất một khách hàng thì khả năng xử lý sẽ rất chậm, có
thể dẫn tới nút thắt cổ chai. Giải pháp là tăng số lượng khách hàng, các khách
hàng có thể xử lý đồng thời tin nhắn từ nhiều phân vùng. Và tất cả các khách
hàng sẽ thuộc cùng một nhóm được gọi là nhóm khách hàng.
 Như vậy, nhóm khách hàng đọc toàn bộ dữ liệu của các phân vùng và chia vào
các khách hàng bên trong để xử lý.

Hình 3-8 Hoạt động của nhóm khách hàng

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.

Hình 3-9 Cơ chế giao tiếp giữa chủ đề và khách hàng

3.2.1.2 Ưu nhược điểm của của Kafka


Ưu điểm:
 Mã nguồn mở.
 Thông lượng cao: Có khả năng xử lý một lượng lớn thông tin một cách liên tục,
gần như không có thời gian chờ.
 Tần số cao: Có thể xử lý cùng lúc nhiều tin nhắn và nhiều thể loại chủ đề.
 Khả năng mở rộng: Dễ dàng mở rộng khi có nhu cầu.
 Tự động lưu trữ tin nhắn, dễ dàng kiểm tra lại.
 Cộng đồng người dùng đông đảo, được hỗ trợ nhanh chóng khi cần.

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.

3.2.1.3 Ứng dụng của Kafka


Nhờ khả năng xử lý hiệu quả và lưu trữ dữ liệu lớn theo thời gian thực, Kafka được
các doanh nghiệp thuộc nhiều lĩnh vực khác nhau tin tưởng để sử dụng cho hệ thống của
họ:
 Đóng vai trò như nhà môi giới thông báo: khách hàng có thể sử dụng Kafka để
thay thế cho các nhà môi giới thông báo, ví dụ như ActiveMQ hoặc RabbitMQ.
 Quản lý hoạt động website: Đây là cách thức truyền thống để sử dụng Kafka, được
dùng để xây dựng website và đăng tải nội dung theo thời gian thực. Các dữ liệu
như lượt xem trang, hoạt động tìm kiếm… đều được tạo thành các chủ đề. Việc
quản lý hoạt động này giúp bạn phân tích hành vi của người dùng trên trang tốt
hơn, từ đó thu hút được nhiều người đọc hơn.
 Đo lường: Kafka cũng có thể được dùng để xây dựng dữ liệu giám sát các hoạt
động. Điều này đồng nghĩa với việc tập hợp số liệu thống kê từ nhiều nguồn phân
tán trên trang để tạo ra một nguồn dữ liệu tổng hợp.
 Tạo log: Kafka hỗ trợ tổng hợp log hoặc nhật ký hoạt động, tóm tắt các chi tiết và
cung cấp bản ghi cụ thể về dữ liệu sự kiện nhằm phục vụ cho việc xử lý trong
tương lai.
 Xử lý trực tuyến: Đây là cách sử dụng phổ biến hiện nay của Kafka, đó là hệ thống
được phát triển để xử lý dữ liệu theo thời gian thực. Mỗi khi dữ liệu mới được
thêm vào chủ đề, thì sẽ được ghi vào hệ thống ngay lập tức và truyền đến bên nhận
dữ liệu. Hơn nữa, thư viện Kafka Streams được tích hợp từ phiên bản 0.10.0.0 có
tính năng xử lý trực tuyến nhẹ nhưng rất mạnh mẽ.
3.2.2 Superset
Apache SuperSet là một công cụ trực quan hóa dữ liệu Nguồn mở có thể được sử
dụng để biểu diễn dữ liệu bằng đồ họa. Superset ban đầu được tạo ra bởi AirBnB và sau
đó được phát hành cho cộng đồng Apache. Apache Superset được phát triển bằng ngôn
ngữ Python và sử dụng Flask Framework cho tất cả các tương tác web. Superset hỗ trợ
phần lớn RDMBS thông qua SQL Alchemy.

Trang 57/69
NGUYỄN XUÂN MINH

Hình 3-10 Giao diện vẽ Dashboard của Superset

Superset cung cấp:


 Giao diện trực quan để khám phá và trực quan hóa bộ dữ liệu và tạo bảng điều
khiển tương tác.
 Một loạt các hình ảnh trực quan đẹp để hiển thị dữ liệu của bạn.
 Dễ dàng, không có mã, người dùng chảy vào để xem chi tiết và cắt xén dữ liệu bên
dưới bảng điều khiển được hiển thị. Bảng điều khiển và biểu đồ hoạt động như một
điểm khởi đầu để phân tích sâu hơn.
 Một trình soạn thảo / IDE hiện đại của SQL trình bày một trình duyệt siêu dữ liệu
phong phú và một quy trình làm việc dễ dàng để tạo trực quan hóa từ bất kỳ tập kết
quả nào.
 Một mô hình bảo mật có độ chi tiết cao, có thể mở rộng cho phép các quy tắc phức
tạp về việc ai có thể truy cập vào các tính năng và bộ dữ liệu của sản phẩm nào.
Tích hợp với các phụ trợ xác thực chính (cơ sở dữ liệu, OpenID, LDAP, OAuth,
REMOTE_USER,...).
 Cho phép kiểm soát cách các nguồn dữ liệu được hiển thị cho người dùng bằng
cách xác định kích thước và số liệu.

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.

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
3.3.1.1 Cài đặt Hadoop
Sử dụng Docker để cài đặt Hadoop:
 Tải và nén tệp zip xuống máy cục bộ:
git clone git@github.com:big-data-europe/docker-hadoop.git
 Sau khi giải nén ta di chuyển đến thư mục docker-hadoop ,sau đó bắt đầu khởi tạo
images bằng câu lệnh:
docker-compose up -d
 Truy cập đến địa chỉ http://localhost:9870/ để xem trạng thái của Hadoop

Hình 3-11 Trạng thái của Hadoop

 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

Hình 3-12 Thông tin của cụm của Hadoop


3.3.1.2 Cài đặt Kafka

Hình 3-13 Khởi tạo Zookeeper thành công


 Đầu tiên ta cài JDK cho máy bằng câu lệnh:
Trang 60/69
NGUYỄN XUÂN MINH

sudo apt install openjdk-8-jdk


 Thứ hai tải và giải nén gói cài đặt Kafka:
wget https://archive.apache.org/dist/kafka/3.0.0/kafka_2.13-3.0.0.tgz
 Kích hoạt Zookeeper: kafka_2.13-3.0.0/bin/zookeeper-server-start.sh
kafka_2.13-3.0.0/config/zookeeper.properties
 Kích hoạt Apache Kafka: kafka_2.13-3.0.0/bin/kafka-server-start.sh
kafka_2.13-3.0.0/config/server.properties

Hình 3-14 Khởi tạo Apache Kafka thành công


3.3.1.3 Cài đặt Spark

Trang 61/69
NGUYỄN XUÂN MINH

Hình 3-15 Khởi tạo Spark thành công


- Đầu tiên ta cần tải gói cài đặt Spark, sử dụng câu lệnh sau: curl -LO
https://raw.githubusercontent.com/bitnami/containers/main/bitnami/spark/
docker-compose.yml
- Tiếp theo khởi tạo các gói vừa cài đặt: docker-compose up
3.3.1.4 Cài đặt Superset
- Đầu tiên chúng ta tải gói cài đặt xuống máy cục bộ, sử dụng câu lệnh:
git clone https://github.com/apache/superset.git
- Tiếp theo khởi tạo vùng chứa bằng câu lệnh:
docker-compose -f docker-compose-non-dev.yml up
- Truy cập địa chỉ http://localhost:8088 và điền thông tin user/pass:
admin/admin.

Hình 3-16 Giao diện Superset sau khi khởi tạo


3.3.2 Kết quả đạt được

Hình 3-17 Cấu hình Producer trên Kafka

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.

Hình 3-18 Cấu hình tệp SparkStreaming


Trước khi đẩy dữ liệu lên HDFS các trường cần thiết cần được chọn và cần được
chuyển về các kiểu dữ liệu đúng định dạng của nó.

Hình 3-19 Chọn các trường trong DataFrame


Tiếp đến thực hiện cấu hình định dạng tệp và đường dẫn lưu tệp trên HDFS:

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.

Hình 3-21 Dữ liệu được đẩy vào kafka


Đồng thời dữ liệu sẽ được đẩy lên HDFS (hình 3-22).
Sau khi có dữ liệu lưu trữ trên HDFS, những câu lệnh dưới đây được sử dụng để
kết nối HIVE với HDFS:
 beeline
 !connect jdbc:hive2://0.0.0.0:10015/
 Câu lệnh tạo hive table từ hdfs để truy vấn với superset:
o CREATE TABLE IF NOT EXISTS minhnx12_test (id INTERGER, age
INTERGER, gender INTERGER, height INTERGER, weight FLOAT,

Trang 64/69
NGUYỄN XUÂN MINH

ap_hi INTERGER, ap_lo INTERGER, cholesterol INTERGER, gluc


INTERGER, smoke INTERGER, alco INTERGER, active INTERGER,
cardio INTERGER, time TIMESTAMP) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' STORiED AS PARQUET LOCATION
"/user/minhnx12/final/checkpoint ";
Tiếp đó, kết nối Superset với Hive được thực hiện để load dữ liệu lên và vẽ biểu
đồ.

Hình 3-22 Dữ liệu lưu trên HDFS

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.

Hình 3-24 Số ca mắc bệnh tim theo tuổi


Hơn nữa, mối quan hệ giữa bệnh tim mạch với các chỉ số khác như huyết áp, thuốc
lá, cân năng cũng được thể hiện ở hình 3-25. Hút thuốc lá làm tăng nồng độ của những
sản phẩm oxy hóa như cholesterol LDL oxy hóa và làm giảm nồng độ cholesterol HDL.
Những yếu tố này kết hợp với sự tác động của CO và độc chất nicotin làm tổn thương nội
mạch. Nicotin là chất gây nghiện, làm kích thích sản sinh adrenaline nên hút thuốc lá làm
tim đập nhanh, nhịp tim trở nên nhanh hơn gây huyết áp cao. Huyết áp sẽ trở lại bình
thường ở khoảng giữa những lần hút thuốc nhưng không bao giờ trở về bình thường nếu
không ngừng hút thuốc. Nếu hút thuốc lá quá nhiều lần trong ngày sẽ làm tăng chỉ số
huyết áp trung bình. Ngoài ra, hút thuốc lá còn làm tăng huyết áp dao động là yếu tố nguy
hiểm hơn cả bệnh tim mạch. Hút thuốc lá làm giảm hiệu quả trong lúc đang điều trị tă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

TÀI LIỆU THAM KHẢO

[1] Casey McTaggart, Hadoop/MapReduce,Object-oriented framework presentation CSCI


5448.
[2] Xiaoyang Yu, Estimating Language Models Using Hadoop and HBase, 2008.
[3] Serge Blazhievsky Nice Systems, Introduction to Hadoop, MapReduce and HDFS for
Big Data Applications.
[4] Klaus Berberich, Srikanta Bedathur, Computing n-Gram Statistics in MapReduce,
2013.
[5] Sewal, Piyush, and Hari Singh. "A Critical Analysis of Apache Hadoop and Spark for
Big Data Processing." 2021 6th International Conference on Signal Processing,
Computing and Control (ISPCC). IEEE, 2021.
[6] Holmes, Alex. Hadoop in practice. Simon and Schuster, 2014.

Trang 69/69

You might also like