Những côngnghệ đó là Apache Hadoop, Apache Spark, Apache Kafka, v.v … Dưới đây là thông tintổng quan về các công nghệ này. Apache Hadoop Hadoop là một Apache framework mã nguồn mở được
GIỚI THIỆU
Mục tiêu nghiên cứu
Mục tiêu nghiên cứu của đề tài này là áp dụng các phương pháp ID3 và Logistic Regression trong thư viện PySpark để phân loại khách hàng đăng ký tài khoản tiền gửi có kỳ hạn.
Tìm hiểu cách các thuật toán học máy áp dụng như thế nào trong những hệ thống phân tán.
Chúng tôi sẽ thực hiện chạy và thử nghiệm bộ dữ liệu thực tế trên các thuật toán đã chọn, nhằm so sánh và đưa ra kết luận về hiệu suất của các mô hình khi áp dụng với các tham số khác nhau.
Rút ra kết luận về đề tài nghiên cứu, đưa ra định hướng trong tương lai.
Phương pháp nghiên cứu
Áp dụng kiến thức từ môn Big Data, chúng ta có thể khám phá các thuật toán và cách triển khai chúng trên các hệ thống như HDFS và PySpark.
Nghiên cứu từ những nguồn thông tin hữu ích trên nền tảng mạng để triển khai phần code thực nghiệm.
Thực nghiệm và so sánh giữa những khía cạnh khác nhau của các công cụ là phương thức chính trong bài nghiên cứu này. x
CƠ SỞ LÝ THUYẾT
Giới thiệu về HDFS
HDFS (Hadoop Distributed File System) là một hệ thống tập tin phân tán, được thiết kế để lưu trữ và quản lý khối lượng dữ liệu lớn với chi phí thấp Nhiều cụm Hadoop hiện đang hoạt động với HDFS, cung cấp giải pháp hiệu quả cho việc xử lý dữ liệu quy mô lớn.
Các công ty khác nhưng Facebook, Adobe, Amazon cũng đã xây dựng các cluster chạy HDFS với dung lượng hàng trăm, hàng nghìn TB.
Về tổng quan thiết kế của HDFS:
HDFS duy trì một cấu trúc cây phân cấp cho các file và thư mục, trong đó các file hoạt động như các node lá.
Mỗi file trong hệ thống được phân chia thành một hoặc nhiều block, mỗi block được xác định bằng một block ID duy nhất Để đảm bảo an toàn dữ liệu, mỗi block của file được lưu trữ thành nhiều bản sao khác nhau Hệ thống cũng bao gồm một NameNode cho mỗi cluster và một hoặc nhiều DataNode để quản lý và lưu trữ dữ liệu.
NameNode là thành phần chính trong hệ thống file, có nhiệm vụ quản lý và duy trì thông tin về cấu trúc cây phân cấp của các tệp và thư mục, cũng như các metadata khác liên quan đến hệ thống file.
Hình 2.1 Hình ảnh HDFS Architecture
Metadata mà Namenode lưu trữ gồm có:
File System Namespace là cấu trúc cây thư mục của hệ thống file tại một thời điểm nhất định, phản ánh toàn bộ các file và thư mục có trong hệ thống, cùng với mối quan hệ giữa chúng.
Để ánh xạ từ tên file đến danh sách các block, mỗi file sẽ có một danh sách các block được sắp xếp theo thứ tự, với mỗi block được đại diện bởi một block id.
Thông tin nơi lưu trữ các block: Mỗi block ta có một danh sách các Datanode lưu trữ các bản sao của block đó.
Chịu trách nhiệm lưu trữ các block thật sự của từng file của hệ thống file phân tán lên hệ thống file cục bộ của Datanode
Mỗi 1 block được lưu trữ như là 1 file riêng biệt trên hệ thống file cục bộ của Datanode xii
Hình 2.2 Hình ảnh tương tác của client với NameNode và DataNode
Khi client của hệ thống muốn đọc 1 file trên hệ thống HDFS:
The client will send a request to the Namenode to retrieve the metadata of the file to be read, which provides the list of blocks of the file and the locations of the Datanodes that store replicas of each block.
Khách hàng kết nối trực tiếp với các Datanode để thực hiện yêu cầu đọc dữ liệu từ các block định kỳ Mỗi Datanode sẽ báo cáo cho Namenode danh sách tất cả các block mà nó lưu trữ Namenode sử dụng thông tin này để cập nhật Metadata, đảm bảo rằng Metadata trên Namenode đạt trạng thái thống nhất với dữ liệu trên các Datanode Metadata thống nhất này được sử dụng để nhân bản và phục hồi lại Namenode trong trường hợp xảy ra lỗi.
Khả năng chịu lỗi của HDFS:NameNode và Datanode đều được thiết kết để có thể phục hồi nhanh chóng.
NameNode và Datanode liên lạc thông qua HeartBeat
HeartBeat là tín hiệu mà Datanode gửi đến Namenode định kỳ để xác nhận sự tồn tại của nó, cho thấy rằng Datanode vẫn đang hoạt động.
Nếu sau khoảng thời gian nhất định, Namenode không nhận được bất kỳ phản hồi nào từ Datanode thì Datanode đã ngưng hoạt động
Trường hợp Namenode ngừng hoạt động
Chỉ cần phục hồi lại Namenode mà không cần phải restart tất cả các Datanode
Sau khi phục hồi, Namenode sẽ tự động kết nối lại với các Datanode, giúp hệ thống phục hồi Thực chất, Namenode chỉ đứng yên và lắng nghe các tín hiệu HeartBeat từ các Datanode.
Nếu một Datanode bất kỳ bị ngưng hoạt động
Chỉ cần khởi động lại DataNode này
Datanode 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.
Nhân bản metadata trên Namenode với SecondaryNameNode:
SecondaryNameNode là một node duy nhất trên Hadoop cluster Nhiệm vụ của SecondaryNameNode là lưu trữ lại checkpoint mới nhất trên NameNode.
Khi NameNode gặp sự cố, checkpoint mới nhất này được import vào NameNode =>NameNode trở lại hoạt động bình thường như thời điểm SecondaryNameNode tạo checkpoint.
Giới thiệu về Hadoop và MapReduce
MapReduce là một mô hình do Google phát triển, cho phép lập trình xử lý các tập dữ liệu lớn một cách song song và phân tán trên một cụm máy tính Gần đây, MapReduce đã trở thành một thuật ngữ phổ biến trong lĩnh vực xử lý dữ liệu.
Hình 2.3 Hình ảnh kiến trúc MapReduce
MapReduce bao gồm hai thủ tục chính: Map() và Reduce() Thủ tục Map() thực hiện việc lọc và phân loại dữ liệu, trong khi thủ tục Reduce() tập trung vào việc tổng hợp dữ liệu Mô hình này dựa trên các khái niệm đối lập của bản đồ và giảm thiểu, mang lại những chức năng lập trình theo hướng chức năng.
Các hàm chính của MapReduce:
MapReduce bao gồm hai hàm chính là Map() và Reduce(), được định nghĩa bởi người dùng Hai hàm này thực hiện các giai đoạn liên tiếp trong quá trình xử lý dữ liệu Hàm Map() có nhiệm vụ phân tán dữ liệu và tạo ra các cặp khóa-giá trị, trong khi hàm Reduce() tổng hợp và xử lý các cặp khóa-giá trị này để trả về kết quả cuối cùng.
Hàm Map() nhận đầu vào là các cặp giá trị/khóa và xuất ra tập hợp các cặp giá trị/khóa trung gian Sau đó, những dữ liệu này được ghi xuống đĩa cứng và thông báo cho các hàm Reduce() để xử lý trực tiếp.
Hàm Reduce() có chức năng nhận các khóa trung gian cùng với giá trị tương ứng của chúng Sau đó, hàm này sẽ kết hợp các khóa và giá trị để tạo ra một tập hợp khóa mới Các cặp khóa/giá trị thường được truyền qua một con trỏ vị trí để đưa vào các hàm reduce.
Giữa hai bước Map và Reduce trong quy trình xử lý dữ liệu, bước trung gian quan trọng là Shuffle Sau khi hoàn tất nhiệm vụ của mình, Shuffle sẽ thu thập và tổng hợp các khóa và giá trị trung gian được sinh ra từ bước Map, sau đó chuyển giao cho bước Reduce để tiếp tục xử lý.
Hình 2.4 Hình ảnh kiến trúc của MapReduce
Các ưu điểm nổi bật của MapReduce
Mapreduce được ưa chuộng sử dụng như vậy bởi nó sở hữu nhiều ưu điểm vượt trội như sau:
MapReduce có khả năng xử lý dễ dàng mọi bài toán có lượng dữ liệu lớn nhờ khả năng tác vụ phân tích và tính toán phức tạp
Với khả năng hoạt động độc lập kết hợp phân tán, xử lý các lỗi kỹ thuật để mang lại nhiều hiệu quả cho toàn hệ thống.
MapReduce có khả năng thực hiện trên nhiều nguồn ngôn ngữ lập trình khác nhau như: Java , C/ C++ , Python, tương ứng với nó là những thư viện hỗ trợ.
Apache Spark
Hadoop nổi bật với mô hình lập trình song song MapReduce, cho phép xử lý dữ liệu lớn một cách linh hoạt và mở rộng Mô hình này không chỉ đảm bảo khả năng chịu lỗi mà còn giúp giảm chi phí hiệu quả.
Apache Hadoop có một nhược điểm lớn là tất cả các thao tác đều phải thực hiện trên ổ đĩa cứng, dẫn đến việc giảm tốc độ tính toán đáng kể Để khắc phục nhược điểm này, Apache Spark đã được phát triển, cho phép thực hiện các tác vụ nhanh hơn gấp 10 lần so với Hadoop khi sử dụng ổ đĩa cứng và nhanh hơn 100 lần khi chạy trên bộ nhớ RAM.
2.3.1 giới thiệu về Apache Spark
Hình 2.5 Thời gian ra đời của tool Big Data
Tốc độ xử lý của Spark được cải thiện nhờ khả năng thực hiện tính toán song song trên nhiều máy khác nhau, đồng thời xử lý dữ liệu trực tiếp trong bộ nhớ (in-memory) hoặc hoàn toàn trên RAM.
Spark cho phép xử lý dữ liệu theo thời gian thực, giúp nhận và xử lý dữ liệu từ nhiều nguồn khác nhau một cách đồng thời thông qua tính năng Spark Streaming.
Spark không sở hữu hệ thống file riêng mà tích hợp với các hệ thống file khác như HDFS, Cassandra, và S3 Nó hỗ trợ nhiều định dạng file khác nhau, bao gồm text, CSV, và JSON, và hoàn toàn không phụ thuộc vào bất kỳ hệ thống file nào.
2.3.2 Các thành phần của Apache Spark
Hình 2.6 Hình ảnh kiến trúc của Apache Spark
Apache Spark gồm có 5 thành phần chính: Spark Core, Spark Streaming, Spark SQL,
MLlib và GraphX, trong đó:
Spark Core là nền tảng chính cho các thành phần khác trong hệ sinh thái Spark Tất cả các thành phần này đều cần phải thông qua Spark Core để thực hiện các tác vụ tính toán và xử lý dữ liệu trong bộ nhớ (In-memory computing).
Spark SQL introduces a new data abstraction type called SchemaRDD, which facilitates the handling of both structured and semi-structured data Additionally, it supports a domain-specific language (DSL) for performing operations on DataFrames using Scala, Java, or Python.
Spark Streaming cho phép phân tích dữ liệu theo luồng bằng cách xem các luồng dữ liệu như các mini-batches Kỹ thuật RDD transformation được áp dụng cho các mini-batches này nhằm xử lý và phân tích dữ liệu hiệu quả.
MLlib (Thư viện Học Máy) là một nền tảng học máy phân tán được xây dựng trên Spark, sử dụng kiến trúc phân tán dựa trên bộ nhớ Theo các so sánh benchmark, MLlib nhanh hơn 9 lần so với phiên bản chạy trên Hadoop (Apache Mahout).
GrapX là nền tảng xử lý đồ thị được xây dựng trên công nghệ Spark, cung cấp các API mạnh mẽ để thực hiện các phép toán trên đồ thị thông qua Pregel API.
2.3.3 Những điểm nổi bật của Spark
Xử lý dữ liệu: Spark xử lý dữ liệu theo lô và thời gian thực
Tính tương thích: Có thể tích hợp với tất cả các nguồn dữ liệu và định dạng tệp được hỗ trợ bởi cụm Hadoop.
Hỗ trợ ngôn ngữ: hỗ trợ Java, Scala, Python và R.
Apache Spark cho phép phân tích dữ liệu thời gian thực, xử lý hàng triệu sự kiện mỗi giây từ các luồng sự kiện khác nhau.
2.3.4 So sánh giữa Spark và Hadoop MapReduce
Hình 2.7 Hình ảnh hoạt động của Spark Job vs Hadoop Job
Map Reduce thì nhanh hơn những hệ thống truyền thống nhưng nó không tận dụng tối đa bộ nhớ của các hadoop cluster
Spark được chứng minh là có thể thực thi xử lí các công việc nhanh hơn gấp 10 cho đến 100 lần
Map Reduce thực hiện hoàn toàn trên đĩa cứng, có độ trễ cao hơn Không hỗ trợ caching dữ liệu.
Spark có độ trễ tính toán thấp hơn nhờ vào việc lưu trữ các phần kết quả trong bộ nhớ RAM của hệ thống phân tán Việc lưu trữ dữ liệu trong bộ nhớ RAM giúp tăng tốc độ xử lý Mặc dù MapReduce là lựa chọn tiết kiệm chi phí hơn, nhưng Spark lại có giá thành cao hơn.
Viết xử lí cho Map Reduce rất phức tạp và dài bởi lẽ nó thuần Java
Viết code Spark thì luôn dễ hơn và chúng ta có thể viết với 4 ngôn ngữ
Batch processing Batch /Iteractive /Real Time /Interactive
MapReduce không tích hợp cho những thứ khác như SQL, ML, RT
Spark được tích hợp sẵn cho SQL, ML, RT
Nó xử lí dữ liệu đơn giản Hỗ trợ engine phân tích dữ liệu Vì thế mà được lựa chọn rất nhiều trong ngành khoa học dữ liệu.
Bảng 2.1 So sánh giữa Apache Hadoop và Apache Spark
Từ những ưu điểm trên của Spark mà trong bài nghiên cứu này hầu hết các thuật toán sẽ được sử dụng và tính toán trên spark.
Thuật toán ID3
2.4.1 Giới thiệu thuật toán ID3
ID3 (Iterative Dichotomiser 3) là một thuật toán do Ross Quinlan phát triển, được sử dụng để xây dựng cây quyết định từ dữ liệu Là tiền thân của thuật toán C4.5, ID3 thường được áp dụng trong học máy và xử lý ngôn ngữ tự nhiên.
2.4.2 Thuật toán phân lớp ID3
Thuật toán ID3 bắt đầu với tập dữ liệu ban đầu S là nút gốc và thực hiện lặp lại qua các thuộc tính chưa sử dụng để tính toán entropy H(S) hoặc mức tăng thông tin IG(S) Thuật toán chọn thuộc tính có entropy nhỏ nhất hoặc mức tăng thông tin lớn nhất, sau đó phân tách tập S theo thuộc tính đã chọn để tạo ra các tập con dữ liệu Quy trình này tiếp tục trên từng tập con, chỉ xem xét các thuộc tính chưa được chọn trước đó.
Tiếp theo, ta định nghĩa information gain dựa trên thuộc tính
Trong ID3, tại mỗi node, thuộc tính được chọn được xác định dựa trên: tức thuộc tính khiến cho information gain đạt giá trị lớn nhất.
2.4.3 Lưu đồ thuật toán ID3
Hình 2.8 Lưu đồ thuật toán Decision Tree
Thuật toán LR
2.5.1 Giới thiệu thuật toán LR
Hồi quy logistic, hay còn gọi là hồi quy logit, là phương pháp ước lượng các tham số của mô hình logistic, bao gồm các hệ số trong tổ hợp tuyến tính Trong hồi quy logistic nhị phân, biến phụ thuộc duy nhất là nhị phân, được mã hóa bằng một biến chỉ số với hai giá trị "0" và "1" Các biến độc lập có thể là biến nhị phân (hai lớp) hoặc biến liên tục với bất kỳ giá trị thực nào.
2.5.2 Thuật toán phân lớp LR xxii
Logistic Regression là một thuật toán phân loại dùng để gán các đối tượng vào các giá trị rời rạc như 0, 1, 2, v.v Ví dụ điển hình bao gồm phân loại email thành email công việc, email gia đình và email spam Thuật toán này cũng được áp dụng để đánh giá tính an toàn của giao dịch trực tuyến hoặc phân loại khối u lành tính hay ác tính Logistic Regression sử dụng hàm sigmoid logistic để đưa ra các đánh giá xác suất.
2.5.3 Lưu đồ thuật toán LR
Hình 2.9 Lưu đồ thuật toán Logistic Regression
TRIỂN KHAI THỰC NGHIỆM
Về bộ dữ liệu
Dữ liệu thô được lấy từ Kaggle liên quan đến các chiến dịch tiếp thị trực tiếp của một ngân hàng Bồ Đào Nha, chủ yếu thông qua các cuộc gọi điện thoại Các chiến dịch này thường yêu cầu nhiều liên hệ với khách hàng để xác định khả năng đăng ký sản phẩm tiền gửi có kỳ hạn ngân hàng, với kết quả có thể là 'có' hoặc 'không'.
Dữ liệu khách hàng của ngân hàng:
Trong thị trường lao động hiện nay, có nhiều loại công việc khác nhau, bao gồm quản trị viên, công nhân tay nghề (blue-collar), doanh nhân, người giúp việc, quản lý, nhân viên nghỉ hưu, tự kinh doanh, dịch vụ, sinh viên, kỹ thuật viên, và cả những người thất nghiệp hoặc không xác định nghề nghiệp Mỗi loại công việc đều có đặc điểm và yêu cầu riêng, phản ánh sự đa dạng trong nhu cầu tuyển dụng và phát triển nghề nghiệp.
Tình trạng hôn nhân được phân loại thành bốn nhóm chính: 'đã ly hôn', 'đã kết hôn', 'độc thân' và 'không rõ' Trong đó, 'đã ly hôn' bao gồm cả những người đã ly hôn hoặc là góa vợ.
Education (phân loại: 'basic.4y', 'basic.6y', 'basic.9y', 'high.school', 'illiterate', 'professional.course', 'university.degree', 'chưa biết')
default: có tín dụng trong tình trạng vỡ nợ? (phân loại: 'không', 'có', 'không xác định')
house: có cho vay mua nhà không? (phân loại: 'không', 'có', 'không xác định')
loan: có khoản vay cá nhân? (phân loại: 'không', 'có', 'không xác định')
contact: kiểu liên lạc liên lạc (phân loại: 'cellular', 'phone')
month: tháng liên hệ cuối cùng trong năm (phân loại: 'jan', 'feb', 'mar', , 'nov', 'dec')
day_of_week: ngày liên hệ cuối cùng trong tuần (phân loại: 'mon', 'tue', 'wed', 'thu', 'fri')
Biến đầu ra (mục tiêu mong muốn): xxiv
y - khách hàng đã đăng ký tiền gửi có kỳ hạn chưa? (nhị phân: 'yes', 'no')
Tiền xử lý dữ liệu bằng PySpark
Môi trường sử dụng: Google Colab / Anaconda Enviroment sử dụng Visual Studio và Terminal để code
Để bắt đầu với PySpark, trước tiên bạn cần tải PySpark nếu chưa cài đặt Tiếp theo, hãy khởi tạo SparkSession, lớp chính cho tất cả các chức năng trong Spark Để tạo một SparkSession cơ bản, bạn chỉ cần sử dụng SparkSession.builder Để đọc file dữ liệu CSV, bạn có thể sử dụng lệnh spark.read.csv().
!pip install pyspark from pyspark.sql import SparkSession spark = SparkSession.builder.appName('ml-bank').getOrCreate() df = spark.read.csv('bank.csv', header = True, inferSchema = True) df.printSchema()
In ra xem tập dữ liệu và data type của từng field
Hình 3.1: Tập các trường dữ liệu
Utilize Pandas to load the first five rows of the dataset and review the initial five observations The Pandas DataFrame provides a more visually appealing display compared to Spark's DataFrame.show() Use the command pd.DataFrame(df.take(5), columns=columns) for this purpose.
Hình 3.2: Top 5 rows trong tập dữ liệu
Mối tương quan giữa các biến độc lập.
Hình 3.3: Biểu đồ tương quan độc lập giữa các trường xxvi
Chúng tôi nhận thấy rằng không có các biến số nào có tương quan cao, vì vậy sẽ giữ lại tất cả các biến cho mô hình Tuy nhiên, cột ngày và tháng không mang lại giá trị hữu ích, do đó chúng tôi quyết định loại bỏ hai cột này Cuối cùng, chúng tôi chọn các cột cần thiết cho phân tích bao gồm: tuổi, nghề nghiệp, tình trạng hôn nhân, trình độ học vấn, mặc định, số dư, vay mượn, liên hệ, thời gian, chiến dịch, ngày trước, số lần trước đó, kết quả trước đó và tiền gửi.
Quá trình này bao gồm Category Indexing, One-Hot Encodingvà VectorAssembler – Transformer có tính năng hợp nhất nhiều cột thành một cột vectơ.
The process begins by indexing categorical columns using StringIndexer, which then converts the indexed categories into one-hot encoded variables, resulting in binary vectors appended to each row We apply StringIndexer again to encode our labels for indexing purposes Subsequently, VectorAssembler is utilized to merge all object columns into a single vector column The categorical columns include 'job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', and 'poutcome' For each categorical column, a StringIndexer and OneHotEncoder are created, while the label for 'deposit' is also indexed Numeric columns such as 'age', 'balance', 'duration', 'campaign', 'pdays', and 'previous' are combined with the one-hot encoded vectors to form the final feature set.
We utilize a Pipeline to connect multiple Transformers and Estimators, defining our machine learning workflow The stages of the Pipeline are specified as an ordered array, allowing for a structured approach to data processing After fitting the Pipeline to the DataFrame, we transform the data and select the relevant columns, including 'label' and 'features,' ensuring an organized schema for further analysis.
Hình 3.4: Dữ liệu sau khi làm sạch và có trường features và label xxviii
Như bạn có thể thấy, bây giờ chúng ta có cột tính năng và cột nhãn.
Tách ngẫu nhiên dữ liệu thành các tập huấn luyện và thử nghiệm. pd.DataFrame(df.take(5), columnscolumns)
Hình 3.5: Hiển thị dữ liệu 5 hàng đầu dưới dạng bảng
Sử dụng trường features và label để train model train, test = df.randomSplit([0.7, 0.3], seed = 2018) print("Training Dataset Count: " + str(train.count())) print("Test Dataset Count: " + str(test.count()))
Huấn luyện mô hình
Dữ liệu để train model
Hình 3.6: Tập dữ liệu train 20 dòng đầu 3.3.1 ID3
Decision trees are widely used due to their interpretability and ability to handle classification tasks, including multi-class classification They do not require feature scaling and can capture interactions and non-linear relationships effectively In PySpark, a DecisionTreeClassifier can be implemented with the following code: `dt = DecisionTreeClassifier(featuresCol='features', labelCol='label', maxDepth=3)`, followed by fitting the model to the training data using `dtModel = dt.fit(train)` Predictions can then be made on the test dataset with `predictions = dtModel.transform(test)`, allowing users to view selected outputs such as age, job, label, raw predictions, predictions, and probabilities with `predictions.select('age', 'job', 'label', 'rawPrediction', 'prediction', 'probability').show(10)`.
Hình 3.7: Dữ liệu được dự đoán bằng mô hình ID3 3.3.2 LR
To train a logistic regression model, use the LogisticRegression class with specified feature and label columns, followed by fitting the model to the training data After training, generate predictions on the test dataset and display the selected attributes, including age, job, label, raw prediction, and probability, for the first ten entries.
Hình 3.8: Dữ liệu được dự đoán bằng mô hình Logistic Regression
Đánh giá kết quả
Evaluate our Decision Tree model evaluator = BinaryClassificationEvaluator() print("Test Area Under ROC: " + str(evaluator.evaluate(predictions, {evalu ator.metricName: "areaUnderROC"})))
Evaluate our Logistic Regression model. evaluator = BinaryClassificationEvaluator() print('Test Area Under ROC', evaluator.evaluate(predictions))
Test Area Under ROC 0.885643189559481 xxxii