Professional Documents
Culture Documents
123
123
Trước hết, em xin bày tỏ tình cảm và lòng biết ơn của em tới cô giáo TS.Nguyễn
Thị Thu Hiên. Người đã từng bước hướng dẫn, giúp đỡ em trong quá trình thực hiện đồ
án tốt nghiệp của mình.
Em xin chân thành cảm ơn các thầy cô giáo khoa Viễn Thông 1 – Học viện Công
Nghệ Bưu Chính Viễn Thông đã dìu dắt, dạy dỗ em cả về kiến thức chuyên môn và tinh
thần học tập để em có được những kiến thức thực hiện đồ án tốt nghiệp của mình.
Em xin chân thành cảm ơn PGS.TS. Đặng Hoài Bắc – Hiệu trưởng Học viện Công
Nghệ Bưu Chính Viễn Thông, ban giám hiệu nhà trường, các phòng ban đã giúp đỡ tạo
điều kiện tốt nhất cho em trong suốt thời gian học tập tại trường.
Tuy có nhiều cố gắng trong quá trình học tập, cũng như trong quá trình làm đồ án
tốt nghiệp không thể tránh khỏi những thiếu sót, em rất mong được sự góp ý quý báu của
tất cả các thầy cô giáo cũng như tất cả các bạn để kết quả của em được hoàn thiện hơn.
Sinh viên
MỤC LỤC
DANH MỤC HÌNH
THUẬT NGỮ VIẾT TẮT
LỜI MỞ ĐẦU
Big Data là công nghệ được giới thiệu từ năm 2005, vốn được sử dụng để mô tả
việc khai thác các thông tin trọng yếu từ nhiều hệ thống khác nhau, sau đó tập hợp các
thông tin này lại để phân tích. Sự thật là có rất nhiều doanh nghiệp đã bỏ quên tầm quan
trọng của Big Data. Trước hết, ta cần lưu ý rằng, dữ liệu – đặc biệt là dữ liệu “đúng” và
đủ chính là nguồn sống của doanh nghiệp. Dữ liệu là thứ giúp đo lường đa phần các tham
số chủ chốt cho doanh nghiệp.Ngoài ra, ở thế giới “siêu kết nối” hiện tại, dữ liệu đại diện
cho khách hàng – không phải dữ liệu khách hàng nào cũng đến từ các hệ thống ERP, mà
đôi khi doanh nghiệp phải cân nhắc cả những phản hồi và khảo sát khách hàng, cũng như
các bình luận trên mạng xã hội của họ. Chính vì vậy, việc vận dụng được các nguồn dữ
liệu, dù là dữ liệu cấu trúc hay phi cấu trúc cũng sẽ phần nào giúp giải tỏa áp lực cho
doanh nghiệp.
Hãy nghĩ về 15 năm trước, khi các doanh nghiệp liên tục bỏ qua Big Data, để xem
xét lại vị thế của công nghệ này ở hiện tại.Cụ thể, trong vòng 15 năm, dữ liệu đã dần
chuyển dịch sang Cloud, theo sau đó là hàng loạt các chiến thuật phần mềm mới, cũng
như các hệ thống chuyên biệt dần trở nên mở hơn, liên tục trao đổi các dữ liệu “có cấu
trúc”.Tuy nhiên, các hệ thống này vẫn chưa hoàn thiện khả năng tổng hợp dữ liệu cho
việc phân tích và ra quyết định, nhưng điều này hoàn toàn có thể xảy ra trong tương lai.
Cùng với sự hỗ trợ của các công nghệ như AI và Machine Learning, các doanh nghiệp sẽ
đạt được thứ mà chúng ta thường gọi là “lợi thế cạnh tranh.”
Được sự đồng ý của Học viện Công Nghệ Bưu Chính Viễn Thông khoa Viễn
Thông 1, cùng sự ủng hộ nhiệt tình và sự động viên giúp đỡ rất tận tình của cô Nguyễn
Thị Thu Hiên, em đã chọn đề tài:“ Nghiên cứu xây dựng Spark Streaming lưu trữ trên
HDFS ”.
Ngoài phần mở đầu và kết luận , nội dung báo cáo của em được chia làm 3
chương:
Chương 3: Xây dựng luồng Spark Streaming lưu trữ trên HDFS.
Em rất mong nhận được các ý kiến đóng góp phê bình của các thầy cô trong
trường và của các bạn để chương trình được ngày càng hoàn thiện hơn.
Hình 1-2: Kiến trúc tổng quan của một Hadoop Cluster
Hadoop cluster có kiến trúc master-slave, có một namnode và một node 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 cluster thật sự với hàng trăm, hàng nghìn node 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 node slave,
mỗi node 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 file phân tán HDFS với
vai trò cụ thể được phân chia như sau:
● Namenode đóng vai trò là master, 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, điều hướng
quá trình đọc ghi dữ liệu từ client 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ừ client , tạo
xóa các block 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ó Secondary NameNode, 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 checkpoints của hệ thống file
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ì bộ máy MapReduce, nhận và
thực thi các MapReduce Job :
● JobTracker: tiếp nhận các yêu cầu thực thi các MapReduce job, phân chia job này
thành các task 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 task 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 node TaskTracker và tình trạng của từng node thông qua
hearbeat.
● TaskTracker: nhận các task từ JobTracker và thực hiện task.
Bước 1: Client sẽ gửi yêu cầu đến NameNode tạo một file entry lên File System
Namespace. File mới được tạo sẽ rỗng, tức chưa có một block nào. Sau đó,
Namenode sẽ quyết định danh sách các DataNode sẽ chứa các bản sao của file cần gì
và gửi lại cho client.
Bước 2: Client sẽ chia file cần gì ra thành các block, và với mỗi block client sẽ đóng
gói thành một packet. Lưu ý, mỗi block sẽ được lưu ra thành nhiều bản sao trên các
DataNode khác nhau (tuy vào chỉ số độ nhân bản của file).
Bước 3: Client 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 block. 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 block, 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, client
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 block và thực
hiện hành vi ghi lại block bị lỗi trên DataNode.
Bước 5: Sau khi tất cả các block của file đều được ghi lên các Datanode, client 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 block
của file vừa tạo. Thông tin Mapping từ Block Id sang danh sách các Data Node 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 block mà nó quản lý.
Nhận xét: cũng giống như trong quá trình đọc, client 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
client ghi một block với chỉ số replication là n, tức nó cần ghi block lên n DataNode,
nhờ cơ chế luân chuyển block dữ liệu qua ống dẫn (pipe) nên lưu lượng dữ liệu cần
write từ client sẽ giảm đi n lần, phân đều ra các DataNode trên cluster.
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, logic đượ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 disk-based, thường được 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
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.
Hình 1-8 Cách xử lý Traditional và MapReduce
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.
Giờ đây, 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.
CHƯƠNG 2
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.
Spark Core 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ề:
- Lập lịch , phân phối và giám sát công việc trên một cụm.
Spark giới thiệu một khái niệm về RDD(Resilient Distributed Datasets) có khả năng chịu
lỗi không thay đổ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 và 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:
- Transformations: 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ả.
Đó 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ả.
Hình 2-3 Spark RDD - Wide Transformation
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 shuffle vì chúng có thể hoặc
không phụ thuộc vào phép shuffle.
- Actions: 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 Lineage graph để 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.
- 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ừ
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 Catalyst 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 disk 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.
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,
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 Packages. Cung cấp một kiểu data abstraction 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 (Domain-specific language) để 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 stream bằng việc coi
stream là các mini-batches và thực hiệc kỹ thuật RDD transformation đối với các dữ liệu
mini-batches này. Qua đó cho phép các đoạn code được viết cho xử lý batch có thể được
tận dụng lại vào trong việc xử lý stream, làm cho việc phát triển lambda architecture
đượ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 mini-batch duration) và do đó nhiều chuyên gia cho rằng Spark Streaming không
thực sự là công cụ xử lý streaming 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 (Hệ thống tệp phân tán Hadoop). 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.
Để 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 worker.
- 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 worker 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.
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 micro-batches 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 workers, trong đó một số workers sẽ xử lý một số nhiệm vụ dài hơn trong
khi những workers 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 MLlib (Machine Learning Library)
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 ML Pipelines. 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 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.
Graph 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.
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.
Đồ 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.
- 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
- 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 (Extract, Transform & Load), 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.
- 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
Khi Driver Program 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.
Spark Driver bao gồm một số thành phần khác, bao gồm DAG Scheduler, Task
Scheduler, Backend Scheduler, and Block Manager, 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.
Cluster Manager quản lý thực hiện các công việc khác nhau trong cụm. Spark Driver hoạt
động cùng với Cluster Manager để kiểm soát việc thực hiện nhiều công việc khác. Cluster
Manager 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 worker, Spark Driver sẽ
kiểm soát quá trình thực thi.Nhiều workers node 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.
SparkContext nhận thông tin tác vụ từ Cluster Manager và đưa nó vào hàng đợi trên các
workers node.Chúng ta có thể tăng số lượng worker 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.
Master Node xử lý trong trình điều khiển điều phối các workers 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. Spark contexts đượ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 spark contexts(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 Spark cluster. Mọi thứ được thực
hiện bằng spark contexts.
Mỗi Spark session có một mục trong Spark contexts. Spark drives bao gồm nhiều thành
phần hơn để thực hiện các công việc trong clusters, cũng như cluster managers. Khi một
quy trình được thực thi trong clusters, 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 Cluster Manager
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 khách hà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 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 Worker Nodes
Các slave nodes 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 spark context. Master node đưa ra các nhiệm vụ cho Spark context và các worker
nodes 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
worker nodes (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 Spark worker giám sát các
worker nodes để đả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
worker node 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: local, shares và dedicated. 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ữ resources locally, ở vị trí được shared hoặc ở vị trí
dedicated.
Cluster mode: là cách chạy ứng dụng Spark thường xuyên nhất. Ở chế độ cluster mode,
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.
Client mode: Trái ngược với chế độ cluster mode, trong đó Spark driver vẫn còn trên
máy khách đã gửi ứng dụng, Spark driver bị xóa ở chế độ client mode và do đó chịu trách
nhiệm duy trì quy trình Spark driver trên máy khách. Các máy này, thường được gọi là
edge nodes hoặc maintained , được duy trì trên máy khách.
Local mode: Chế độ local mode 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 Spark Application thông qua
các luồng trên máy đó. Do đó, chế độ local mode 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.
● Speed: 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.
● Powerful Caching: 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.
● Deployment: 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ó.
● Real-Time: 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.
● Polyglot: 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.
Chương 3
Việc có một mô hình phân tích dữ liệu cũng đang là vấn đề được nhiều nhà thống
kê học quan tâm và thiết kế đặc biệt xây dựng mô hình phân tích cho một đối tượng cụ
thể. Chính vì vậy thông qua sử dụng các công cụ trong bigdata, từ đó sẽ xây dựng luồng
lưu trữ dữ liệu trên HDFS và phân tích dữ liệu về bệnh tim mạch dựa trên bộ dữ liệu có
trên Kaggle. Sau khi xử lý dữ liệu bằng python và lưu trữ trên HDFS, chúng ta sẽ dùng
Hive connect tới HDFS, dùng Superset để vẽ Dashboard phân tích về bệnh tim mạch qua
từng năm theo từng chỉ số.
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ẽ connect tới HDFS để lấy dữ liệu đổ vào Superset để vẽ
Dashboard, từ đó sẽ được phân tích đánh giá thông qua các biểu đồ.
Hình 3-1 Luồng xử lý dữ liệu Piperline
3.1.2.1 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 message theo cơ chế Pub-Sub. Nó cho phép các nhà sản xuất (gọi
là producer) viết các message vào Kafka mà một, hoặc nhiều người tiêu dùng (gọi là
consumer) có thể đọc, xử lý được những message đó. Các message được gửi tới Kafka
theo Topic, các Topic giống như là các kênh lưu trữ message từ Producer gửi đến Kafka,
người tiêu dùng (Consumer) đăng kí một hoặc nhiều Topic để tiêu thụ những message đó.
Xây dựng các pipeline stream dữ liệu 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 stream theo thời gian thực để biến đổi hoặc ánh xạ đến
các stream của dữ liệu.
Producer : producer sẽ gửi hoặc ghi data/messages đến topic trong cluster. Sau
đó, khi dữ liệu được gửi đến partition của topic được lưu trữ tại Broker. Để lưu trữ
một lượng dữ liệu khổng lồ, các producer khác nhau trong một ứng dụng sẽ gửi dữ
liệu đến cụm Kafka.
Messages: Messages đơn thuần là byte array và developer có thể sử dụng chúng
để lưu bất kì object với bất kì format nào - thông thường là String, JSON và Avro.
Topic: Một topic là một category hoặc feed name nơi mà record được publish.
Trong Apache Kafka, có thể có nhiều topics trong một cluster Mỗi topic sẽ quy
định các loại thông điệp khác nhau.
Partitions: Data hoặc message được chia thành các phần nhỏ, được gọi là
partitions. Mỗi partition chứa dữ liệu bên trong nó có giá trị offset. Dữ liệu luôn
được ghi một cách tuần tự. Chúng ta có thể có vô số partition với giá trị offset vô
hạn. Tuy nhiên, không đảm bảo rằng thông báo sẽ được ghi vào partition nào.
Consumers : Consumer là người đọc hoặc sử dụng message từ Kafka cluster. Một
consumer có thể là bất kì ứng dụng nào có chức năng subscribe vào một topic và
sử dụng các message. Cái hay của Kafka là mỗi consumer sẽ biết nơi chúng cần sử
dụng dữ liệu.
Broker: Kafka cluster là một set các server mỗi một set này được gọi là 1 broker.
Broker là cầu nối giữa consumer và producer. Nếu một producer muốn ghi dữ liệu
vào cụm, nó sẽ được gửi đến máy chủ Kafka. Tất cả các broker nằm trong một
cụm Kafka. Ngoài ra, có thể có nhiều nhà broker.
Zookeeper: ZooKeeper được sử dụng để lưu trữ thông tin về cụm Kafka và thông
tin chi tiết về consumer. Nó quản lý các broker bằng cách duy trì một danh sách
của họ. Ngoài ra, ZooKeeper chịu trách nhiệm chọn người dẫn đầu cho các
partition. Nếu xảy ra bất kỳ thay đổi nào như nhà broker chết, topic mới, v.v.,
ZooKeeper sẽ gửi thông báo tới Apache Kafka. ZooKeeper được thiết kế để hoạt
động với số lượng máy chủ Kafka lẻ. Zookeeper có một máy chủ dẫn đầu xử lý tất
cả các lần ghi và các máy chủ còn lại là những người theo dõi xử lý tất cả các lần
đọc. Tuy nhiên, người dùng không tương tác trực tiếp với Zookeeper mà thông
qua broker. Không có máy chủ Kafka nào có thể chạy mà không có máy chủ
ZooKeeper. Bắt buộc phải chạy máy chủ ZooKeeper.
Ưu điểm:
Open-source.
High-throughput: 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ờ.
High-frequency: Có thể xử lý cùng lúc nhiều message và nhiều thể loại topic.
Scalability: Dễ dàng mở rộng khi có nhu cầu.
Tự động lưu trữ message, 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ý topic và consumer, Lense - hỗ trợ query message,
Akhq - toolbox quản lý Kafka và view data bên trong Kafka.
Không chọn được topic theo wildcard: Người dùng sẽ cần phải sử dụng chính xác
tên topic để xử lý message.
Giảm hiệu suất: Kích thước message tăng khiến cho consumer và producer phải
compress và decompress message, từ đó làm bộ nhớ bị chậm đi, ảnh hưởng đến
throughput và hiệu suất.
Xử lý chậm: Đôi khi số lượng queues trong Kafka cluster tăng đột biến khiến
Kafka xử lý chậm hơn.
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ư message broker: Người dùng có thể sử dụng Kafka để thay thế
cho các Message broker, 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 topic. 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.
Stream processing: Đâ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 topic, 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ý stream nhẹ nhưng rất mạnh mẽ.
3.1.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.
* 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.
* 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.2 Mô tả phần mềm cài đặt hệ thống và kết quả đạt được.