Apache Spark là một framework xử lý dữ liệu có thể thực hiện các tác vụ xử lý trên các tập dữ liệu rất lớn, được thiết kế để tính toán nhanh chóng.. Spark được thiết kế để bao gồm một lo
Trang 1KHOA CÔNG NGHỆ THÔNG TIN MÔN: HỆ PHÂN BỐ
ĐỀ TÀI: RECOMMEND SYSTEM
GVHD: TS Nguyễn Thiên Bảo
SVTH:
Trần nguyên Thái Bảo 1913310
Hồng Tiến Hào 19133022
Lê Tuấn Hiệp 19133023
Đinh Quốc Hùng 19133025
TP Hồ Chí Minh, ngày 05 tháng 05 năm 2022
Trang 2MỤC LỤC
Trang 4PHẦN 1: CƠ SỞ LÝ THUYẾT APACHE SPARK
1 Apache Spark Là Gì?
Apache Spark là một framework xử lý dữ liệu có thể thực hiện các tác vụ xử
lý trên các tập dữ liệu rất lớn, được thiết kế để tính toán nhanh chóng Nó dựa trên Hadoop MapReduce và nó mở rộng mô hình MapReduce để sử dụng hiệu quả nó cho nhiều loại tính toán hơn, bao gồm các truy vấn tương tác và xử lý luồng Tính năng chính của Spark là tính toán cụm trong bộ nhớ giúp tăng tốc
độ xử lý của ứng dụng
Spark được thiết kế để bao gồm một loạt các khối lượng công việc như ứng dụng hàng loạt, thuật toán lặp lại, truy vấn tương tác và phát trực tuyến Ngoàiviệc hỗ trợ tất cả khối lượng công việc này trong một hệ thống tương ứng, nó làm giảm gánh nặng quản lý trong việc duy trì các công cụ riêng biệt
2 Sự phát triển của Apache Spark
Spark là một trong những dự án con của Hadoop được phát triển vào năm
2009 trong AMPLab của UC Berkeley bởi Matei Zaharia Nó được Open
Sourced vào năm 2010 theo giấy phép BSD Nó đã được quyên góp cho nền tảng phần mềm Apache vào năm 2013 và bây giờ Apache Spark đã trở thành một dự án Apache cấp cao nhất từ tháng 2 năm 2014
3 Các tính năng của Apache Spark
Tốc độ: Spark giúp chạy ứng dụng trong cụm Hadoop, nhanh hơn tới 100
lần trong bộ nhớ và nhanh hơn 10 lần khi chạy trên đĩa Điều này có thể thực
Trang 5hiện được bằng cách giảm số lượng các thao tác đọc / ghi vào đĩa Nó lưu trữ
dữ liệu xử lý trung gian trong bộ nhớ
In-memory Computing: Dữ liệu trong bộ nhớ sẽ cải thiện hiệu suất theo thứ
tự cường độ Phần trừu tượng chính của Spark là các RDD của nó Và các RDD được lưu vào bộ đệm bằng cách sử dụng phương thức cache() hoặc persist() Khi chúng ta sử dụng phương thức cache(), tất cả RDD sẽ lưu trữ trong bộ nhớ.Khi RDD lưu trữ giá trị trong bộ nhớ, dữ liệu không phù hợp với bộ nhớ sẽ được tính toán lại hoặc dữ liệu thừa được gửi đến đĩa Bất cứ khi nào chúng ta muốn RDD, nó có thể được giải nén mà không cần đến đĩa Điều này làm giảm
sự phức tạp về không gian-thời gian và chi phí lưu trữ trên đĩa Khả năng trong
bộ nhớ của Spark rất tốt cho việc học máy và xử lý hàng loạt vi mô Nó cung cấp khả năng thực thi nhanh hơn cho các công việc lặp đi lặp lại
Hỗ trợ nhiều ngôn ngữ: Spark cung cấp các API tích hợp sẵn bằng Java, Scala hoặc Python Do đó, bạn có thể viết ứng dụng bằng các ngôn ngữ khác nhau Spark đưa ra 80 toán tử cấp cao để truy vấn tương tác
Khả năng chịu lỗi: Vì Apache Spark RDD là một tập dữ liệu bất biến, mỗi
Spark RDD nhớ dòng dõi của hoạt động xác định đã được sử dụng trên tập dữliệu đầu vào có khả năng chịu lỗi để tạo ra nó Nếu do lỗi worker node mà bất
kỳ phân vùng nào của RDD bị mất, thì phân vùng đó có thể được tính toán lại
từ tập dữ liệu chịu lỗi ban đầu bằng cách sử dụng dòng hoạt động
Phân tích nâng cao - Spark không chỉ hỗ trợ 'Map' và 'reduce' Nó cũng hỗ trợ các truy vấn SQL, Dữ liệu truyền trực tuyến, Máy học (ML) và các thuật toán Đồ thị
Trang 64 Spark được xây dựng trên hadoop
Sơ đồ sau đây cho thấy ba cách về cách Spark có thể được tạo bằng các thành phần Hadoop
- Standalone : Spark Triển khai độc lập có nghĩa là Spark chiếm vị trí trên đầu HDFS (Hệ thống tệp phân tán Hadoop) và không gian được phân bổ cho HDFS một cách rõ ràng Ở đây, Spark và MapReduce sẽ chạy song song với nhau để bao gồm tất cả các công việc spark trên cụm
- Hadoop Yarn : Việc triển khai Hadoop Yarn có nghĩa là đơn giản, spark chạy trên Yarn mà không cần cài đặt trước hoặc truy cập root Nó giúp tích hợp Spark vào hệ sinh thái Hadoop hoặc ngăn xếp Hadoop Nó cho phép các thành phần khác chạy trên đầu ngăn xếp
- Spark in MapReduce (SIMR): Spark trong MapReduce được sử dụng để khởi chạy công việc spark ngoài việc triển khai độc lập Với SIMR, người dùng có thểkhởi động Spark và sử dụng trình bao của nó mà không cần bất kỳ quyền truy cập quản trị nào
Trang 75 Thành phần của Spark
Hình minh họa sau đây mô tả các thành phần khác nhau của Spark
- Apache Spark gồm có 5 thành phần chính: Spark Core, Spark Streaming, Spark
SQL, MLlib và GraphX, trong đó:
o Spark Core là nền tảng cho các thành phần còn lại và các thành phần nàymuốn khởi chạy được thì đều phải thông qua Spark Core do Spark Core đảm nhận vai trò thực hiện công việc tính toán và xử lý trong bộ nhớ (In-memory computing) đồng thời nó cũng tham chiếu các dữ liệu được lưu trữ tại các hệ thống lưu trữ bên ngoài
o Spark SQL 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
o Spark Streaming được sử dụng để thực hiện việc phân tích stream bằng
Trang 8việc coi stream là các mini-batches và thực hiện 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
o MLlib (Machine Learning Library): MLlib là một nền tảng học máy phân tán bên trên Spark do kiến trúc phân tán dựa trên bộ nhớ 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ênHadoop (Apache Mahout)
o GrapX: Grapx 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
6 RDD
6.1 Resilient Distributed Datasets
Resilient Distributed Datasets Là dữ liệu phân tán có khả năng phục hồi
Là một cấu trúc dữ liệu cơ bản của Spark, là một tập hợp phân tán bất biến củacác đối tượng Mỗi tập dữ liệu trong RDD được chia thành các phân vùng logic,
có thể được tính toán trên các nodes khác nhau của cụm RDD có thể chứa bất
kỳ loại đối tượng Python, Java hoặc Scala nào, bao gồm cả các lớp do người dùng định nghĩa
Về mặt hình thức, RDD là một tập hợp các bản ghi được phân vùng, chỉ
Trang 9đọc RDD có thể được tạo thông qua các hoạt động xác định trên dữ liệu trên
bộ lưu trữ ổn định hoặc các RDD khác RDD là một tập hợp các phần tử chịu được lỗi có thể hoạt động song song Spark sử dụng khái niệm RDD để đạt được các hoạt động MapReduce nhanh hơn và hiệu quả hơn
6.2 Chia Sẻ Dữ Liệu Chậm Trong Mapreduce
o Khi sử dụng lại dữ liệu giữa các lần tính toán (Ví dụ: giữa 2 công việc MapReduce) thì phải bắt buộc ghi dữ liệu vào đĩa
o Chia sẻ dữ liệu chậm trong MapReduce do replication, serialization và disk IO
o Hầu hết các ứng dụng Hadoop dành 90% thời gian để đọc và ghi dữ liệu
6.3 Các Hoạt Động Lặp Lại Trên Mapreduce
Sử dụng lại kết quả của các lần tính toán trung gian à phát sinh chi phí đáng kể do sao chép, I/O disk và tuần tự hóa, khiến hệ thống chậm
Trang 106.4 Hoạt Động Tương Tác Trên Mapreduce
Mỗi truy vấn khi được thực thi sẽ I/O disk à điều này chi phối thời gian thực thi của ứng dụng
6.5 Chia sẻ dữ liệu bằng Spak RDD
● Hầu hết các ứng dụng Hadoop, chúng dành hơn 90% thời gian để thực hiện các thao tác đọc-ghi HDFS
● Nhận thức được vấn đề này thì các nhà nguyên cứu đã phát triển một
framework chuyên biệt có tên là Apache Spark
● Ý tưởng chính của Spark là Resilient Distributed Datasets (RDD), nó hỗ trợ
tính toán xử lý trong bộ nhớ
● Điều này có nghĩa là, nó lưu trữ trạng thái bộ nhớ như một đối tượng trên các công việc và đối tượng có thể chia sẻ giữa các công việc đó Chia sẻ dữ liệu trong bộ nhớ nhanh hơn mạng và đĩa từ 10 đến 100 lần
6.6 Hoạt Động Lặp Lại Trên Spark RDD
Hình minh họa dưới đây cho thấy các hoạt động lặp lại trên Spark RDD
Nó sẽ lưu trữ các kết quả trung gian trong một bộ nhớ phân tán thay vì Ổ lưu trữ ổn định (Đĩa) và làm cho hệ thống nhanh hơn Nếu bộ nhớ phân tán
Trang 11(RAM) không đủ để lưu trữ các kết quả trung gian (Trạng thái công việc), thì nó
sẽ lưu các kết quả đó trên đĩa
6.7 Hoạt Động Tương Tác Trên Spark RDD
Nếu các truy vấn khác nhau được chạy lặp lại trên cùng một tập dữ liệu, thì dữ liệu cụ thể này có thể được lưu trong bộ nhớ để có thời gian thực thi tốthơn
Theo mặc định, mỗi RDD đã chuyển đổi có thể được tính toán lại mỗi khibạn chạy một hành động trên nó Tuy nhiên, bạn cũng có thể duy trì một RDD trong bộ nhớ, trong trường hợp đó Spark sẽ giữ các phần tử xung quanh trên cụm để truy cập nhanh hơn nhiều, vào lần tiếp theo bạn truy vấn nó Ngoài ra còn có hỗ trợ cho các RDD lâu dài trên đĩa hoặc được sao chép qua nhiều nút
Trang 127. Kiến Trúc Apache Spark
7.1 Kiến trúc Apache Spark
Driver program trong kiến trúc Apache Spark gọi chương trình chính của một ứng dụng và tạo SparkContext Một SparkContext bao gồm tất cả các chức năng cơ bản Spark Driver chứa nhiều thành phần khác như DAG Scheduler, Task Scheduler, Backend Scheduler và Block Manager, 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.d Datasets
Spark Driver và SparkContext cùng giám sát việc thực hiện công việc trong cụm Spark Driver làm việc với Trình quản lý cụm để quản lý nhiều công việc khác Người quản lý cụm thực hiện công việc phân bổ tài nguyên Và sau đó, công việc được chia thành nhiều nhiệm vụ nhỏ hơn được phân phối tiếp đến các nút
Trang 13đưa nó trở lại Bối cảnh Spark.
Người thi hành có trách nhiệm thực hiện các nhiệm vụ này Thời gian tồn tại của các trình thực thi giống như thời gian tồn tại của Ứng dụng Spark Nếu chúng ta muốn tăng hiệu suất của hệ thống, chúng ta có thể tăng số lượng các nútworker để các công việc có thể được chia thành nhiều phần hợp lý hơn
7.2 Quy Trình Làm Việc Của Spark
Bước 1 Client gửi spark user application code Khi application code được gửi,driver sẽ chuyển đổi hoàn toàn user code có chứa các transformations và actions thành DAG (directed acyclic graph) Ở giai đoạn này, nó cũng thực hiện các tối ưu hóa như biến đổi pipelining
Bước 2 Sau đó, nó chuyển đổi đồ thị logic được gọi là DAG thành kế hoạch thực thi vật lý với nhiều giai đoạn Sau khi chuyển đổi thành một kế hoạch thực thi vật lý, nó tạo ra các đơn vị thực thi vật lý được gọi là các nhiệm vụ theo từng giai đoạn Sau đó, các nhiệm vụ được nhóm lại và gửi đến cụm
Trang 14Bước 3 Bây giờ driver nói chuyện với cluster manager và thương lượng các tài nguyên Driver khởi chạy các trình thực thi trong các worker node thay mặt cho driver Tại thời điểm này, driver sẽ gửi các nhiệm vụ cho những người thực thi dựa trên vị trí dữ liệu Khi người thực thi bắt (executors) đầu,
họ tự đăng ký với driver Vì vậy, driver sẽ có một cái nhìn đầy đủ về những người thực thi đang thực thi tác vụ
Bước 4 Trong quá trình thực thi các tasks, driver program sẽ giám sát tập hợp các trình thực thi đang chạy driver node cũng lên lịch các tasks trong tương lai dựa trên vị trí dữ liệu
Trang 15PHẦN 2: XÂY DỰNG MỘT HỆ THỐNG ĐỀ XUẤT
1 Mục Đích Ứng Dụng
Trong khi làm việc trong các nhóm tìm kiếm của các công ty sản phẩm khác nhau, luôn có nhu cầu liên tục xây dựng một hệ thống khuyến nghị cho người dùng
Nhóm đã tìm hiểu xây dựng với các công cụ tìm kiếm phổ biến như
Elaticsearch, SOLR và đã thử hoàn thiện mức độ liên quan tìm kiếm Nhưng luôn có một giới hạn khi thực hiện liên quan đến tìm kiếm và tạo hệ thống đề xuất chỉ với các công cụ tìm kiếm Chúng ta luôn ngạc nhiên bởi các công ty như Amazon và Netflix cung cấp các khuyến nghị dựa trên sự quan tâm của mình Vì vậy, bằng cách sử dụng các khả năng học tập của Apache Spark cùng với Elaticsearch, nhóm sẽ xây dựng một hệ thống khuyến nghị
2 Ý Tưởng
Như trong hình trên, nếu người dùng 1 thích Mục A, Mục B và Mục C và Người dùng 2 Thích Mục B và Mục C, có khả năng cao là Người dùng 2 cũng thích Mục A và có thể giới thiệu Mục A cho Người dùng 2
Trong lĩnh vực hệ thống khuyến nghị, chủ yếu có ba kỹ thuật được sử dụng
để cung cấp các khuyến nghị
o Collaborative filtering
Trang 16Tính toán sự tương tự giữa n item và n item ta có độ phức tạp O(N
rất nhanh đến các hoạt động xáo trộn quá tốn kém chi phí và thời gian máy tính không khả thi Để tính toán độ tương tự mục của item – item, chúng ta xây dựng một mô hình item bằng cách sử dụng sự giống nhau của các yếu tố vật phẩm từ
mô hình ALS bằng Spark và Elaticsearch
Thuật toán ALS về cơ bản là yếu tố hai ma trận - một là userFeatures và cái còn lại là ma trận itemFeatures Chúng tôi đang thực hiện sự tương đồng cosine trên Ma trận xếp hạng ItemFeatures để tìm sự tương đồng của mục vật phẩm
3 Thuật Toán
3.1 Collaborative Filtering
Ở phương pháp này ta sẽ cần xây dựng ma trận hệ số tương quan của véc tơ rating của các users để tìm ra nhóm users có cùng sở thích Hệ số tương quan giữa các users càng lớn thì sở thích của họ càng giống nhau và trái lại thì
họ càng có sở thích khác biệt Thuật toán sẽ dự đoán giá trị rating tại một cặp (user, item) chưa được rate bằng cách tính tổng có trọng số các giá trị rating của users tương quan nhất với user đó mà đã rate item trên Trọng số thông thường sẽ bẳng chính hệ số tương quan
Để xây dựng một thuật toán Neighborhood-based collaborative Filteringchúng ta cần trải qua các bước cơ bản bên dưới
Trang 17a) Lấy trung bình các cột
b) Chuẩn hóa ma trận bằng cách trừ đi trung bình
c) Tính hệ số tương quan của ma trận chuẩn hóa
d) Dự đoán trên ma trận chuẩn hóa các vị trí chưa được rate
e) Diễn giải công thức dự báo rating
f) Chuyển đổi sang giá trị rating thực tế
Chuẩn hóa dữ liệu ở ma trận tiện ích bằng cách trừ đi ở mỗi cột (là các rating của cùng 1 user) trung bình giá trị rating của cột Việc này là để loại bỏ sự khác biệt về mức độ cho điểm của các user Vì ví dụ: Có một số user khó tính có thể cho điểm cao nhất là 3 nhưng user dễ tính thì điểm thấp nhất là 3 Khi đó nếu nhận định user khó tính không thích item (nếu ta coi 3 là điểm thấp) hoặc user dễ tính yêu thích item (nếu ta coi 3 là điểm cao) là không chuẩn xác Chuẩn hóa giá trịrating nhằm mục đích đưa trung bình rating của các user sau khi chuẩn hóa về 0 Gía trị rating dương thể hiện user ưa thích item và trái lại âm sẽ là không thích, bằng 0 là trung lập
Tính ma trận hệ số tương quan giữa các véc tơ cột Ma trận tương quan thểhiện sự tương đồng trong hành vi mua sắm giữa các user Từ ma trận tương quan
ta có thể xác định ra các users có sở thích tương đồng nhất với một user xác định
Trang 18Hệ số tương quan dương và càng gần 1 chứng tỏ 2 users có sở thích giống nhau
Hệ số tương quan âm là 2 users có hành vi trái ngược
Dự báo rating của một user cho một item bằng cách xác định trên ma trận
hệ số tương quan một tập gồm users có giá trị tương quan lớn nhất đối với user
mà đã rate item Gía trị dự báo rating của user sẽ được tính bằng tổng có trọng sốcủa các rating trong tập users tương quan nêu trên theo công thức bên dưới:
Chuyển giá trị dự báo ở ma trận chuẩn hóa sang giá trị dự báo rating bằng cách cộng các giá trị ở ma trận chuẩn hóa với giá trị trung bình của mỗi cột
Một số hạn chês của User-user CF:
o Trên thực tế, số lượng users luôn lớn hơn số lượng items rất nhiều Kéo theo đó là Similarity matrix là rất lớn với số phần tử phải lưu giữ là hơn 1nửa của bình phương số lượng users (chú ý rằng ma trận này là đối
xứng) Việc này, như đã đề cập ở trên, khiến cho việc lưu trữ ma trận nàytrong nhiều trường hợp là không khả thi
o Ma trận Utility Y thường là rất sparse Với số lượng users rất lớn so với
số lượng items, rất nhiều cột của ma trận này sẽ rất sparse, tức chỉ có mộtvài phần tử khác 0 Lý do là users thường lười rating Cũng chính vì việc này, một khi user đó thay đổi rating hoặc rate thêm items, trung bình cộng các ratings cũng như vector chuẩn hoá tương ứng với user này thay đổi nhiều Kéo theo đó, việc tính toán ma trận Similarity, vốn tốn nhiều
bộ nhớ và thời gian, cũng cần được thực hiện lại
🡺 Vì vậy về mặt tính toán, Item-item CF có thể nhận được từ User-user CF
bằng cách chuyển vị (transpose) ma trận utility, và coi như items đang rate users Sau khi tính ra kết quả cuối cùng, ta lại chuyển vị một lần nữa để thu được kết quả.
3.2 Cosine Similarity
Đây là hàm được sử dụng nhiều nhất công thức tính cos của góc giữa hai
vector (u1, u2)