Tất cả tài liệu: https://drive.google.com/drive/folders/1nBWniC3Q5ulu5cJZO2HIEufUtcEUC6k1?usp=sharing
Trang 1BÁO CÁO HỌC PHẦN TỐT NGHIỆP
MÔN HỌC: AN TOÀN PHẦN MỀM
ĐỀ TÀI: PHÂN TÍCH WEB LOG KHỐI LƯỢNG LỚN SỬ DỤNG
APACHE SPARK GVHD: TS ĐỖ XUÂN CHỢ SINH VIÊN:
TRẦN ĐỨC HUY - B14DCAT025
TÔ THỊ HẢI YẾN - B15DCAT199
LÊ NGỌC MINH SƠN – B14DCAT056 NGÔ VĂN CƯỜNG - B15DCAT031
Hà Nội, 11/2019
Trang 2GIỚI THIỆU
Ngày này, trong lĩnh vực công nghệ thông tin, thuật ngữ Big Data không còn xa lạ gì BigData là thuật ngữ dùng để chỉ một tập hợp dữ liệu rất lớn và rất phức tạp đến nỗi nhữngcông cụ, ứng dụng xử lí dữ liệu truyền thống không thể nào đảm đương được Tuy nhiên,Big Data lại chứa trong mình rất nhiều thông tin quý giá mà nếu trích xuất thành công, nó sẽgiúp rất nhiều cho việc kinh doanh, nghiên cứu khoa học, dự đoán các dịch bệnh sắp phátsinh và thậm chí là cả việc xác định điều kiện giao thông theo thời gian thực Chính vì thế,những dữ liệu này phải được thu thập, tổ chức, lưu trữ, tìm kiếm, chia sẻ theo một cách khác
so với bình thường
Để giúp cho việc xử lý lượng dữ liệu khổng lồ một cách nhanh chóng, giúp người dùng
có thể dễ dàng tìm được thông tin cần thiết trong thời gian thực, rất nhiều công cụ xử lý dữliệu lớn được nghiên cứu và phát triển bởi các viện nghiên cứu trên thế giới như: Hadoop,Apache Spark,…
Trong một thời gian gần đây, Apache Spark đã nổi lên như một công cụ xử lý dữ liệu lớnthế hệ mới, và đang được áp dụng trong toàn ngành nhanh hơn bao giờ hết Spark cải thiệnHadoop MapReduce, giúp kích hoạt cuộc cách mạng dữ liệu lớn, trong một số thứ nguyênchính: nhanh hơn, dễ sử dụng hơn nhờ API phong phú và vượt xa các ứng dụng hàng loạt để
hỗ trợ nhiều khối lượng công việc khác nhau, bao gồm tương tác truy vấn, phát trực tuyến,học máy và xử lý biểu đồ.Apache Spark in-memory clusters đang là sự chú ý của nhiềudoanh nghiệp trong việc ứng dụng công nghệ vào phân tích và xử lý dữ liệu nhanh chóng.Báo cáo gồm 3 nội dung chính như sau:
Chương 1: Giới thiệu các vấn đề cơ bản về phân tích web log khối lượng lớn như lợi ích,thách thức cùng với hướng giải quyết Đồng thời, giới thiệu những khái niệm cơ bản vềframework Apache Spark
Chương 2: Trình bày chi tiết, cụ thể về kiến trúc và hoạt động của Apache Spark Bên cạnh đó, trình bày mô hình triển khai hệ thống phân tích web log sử dụng Apache Spark Chương 3: Trình bày quá trình cài đặt Apache Spark và demo giải quyết các bài toán cụ thể
Trang 3MỤC LỤC
DANH MỤC HÌNH ẢNH
CHƯƠNG 1: GIỚI THIỆU VỀ WEB LOG VÀ FRAMEWORK APACHE
SPARK
1.1. WEB LOG, WEB LOG KHỐI LƯỢNG LỚN LÀ GÌ?
Web logs file là tệp logs được tạo và duy trì bởi máy chủ web Mỗi “tác động” vào trang
Web, bao gồm mỗi lần xem một tài liệu HTML, hình ảnh hoặc đối tượng khác đều được ghi
Trang 4lại Định dạng tệp nhật ký web thô thực chất là một dòng văn bản cho mỗi lần truy cập vàotrang web Thông tin này chứa thông tin về người đã truy cập trang web, họ đến từ đâu vàchính xác họ đang làm gì trên trang web.
Các tệp nhật ký chứa thông tin về: Tên người dùng, Địa chỉ IP, Dấu thời gian, Yêu cầutruy cập, số lượng byte được chuyển, Trạng thái kết quả, URL và tác nhân người dùng.Tệp nhật ký là các tệp liệt kê các hành động đã xảy ra Các tệp nhật ký này nằm trongmáy chủ web Máy tính cung cấp các trang web được gọi là máy chủ web Máy chủ Web lưutrữ tất cả các tệp cần thiết để hiển thị các trang Web trên máy tính người dùng
Web log khối lượng lớn là tệp web logs chứa một tập hợp dữ liệu rất lớn và phức tạp và
rất khó thu thập, lưu trữ, quản lý và phân tích với các công cụ thống kê hay ứng dụng xử lý
dữ liệu truyền thống
1.2. CÁC VẤN ĐỀ TRONG PHÂN TÍCH WEB LOG KHỐI LƯỢNG LỚN
1.2.1. Lợi ích của phân tích dữ liệu lớn
Phân tích tập dữ hợp liệu có thể tìm ra tương quan mới tới xu hướng kinh doanh hiệntại,quảng cáo, phòng bệnh tật, chống tội phạm… cho phép các tổ chức giải quyết các bàitoán phức tạp trước kia không thể làm được
Các công ty có thể sử dụng phân tích dữ liệu để xác định thị trường mới hoặc thậm chíchia nhỏ thị trường hiện có thành các thị trường nhỏ hơn để tăng sức cạnh tranh Kết hợpvới những tiến bộ trong tiếp thị truyền thông tự động, chúng ta đang hướng tới thời đại củaquảng cáo đại chúng Như vậy, mục tiêu cuối cùng của các nhà tiếp thị là quảng cáo đạichúng
Tổng hợp và phân tích dữ liệu lớn cung cấp cho các doanh nghiệp có cái nhìn thực tế vềthị yếu của khách hàng Từ đó, giúp giảm bớt các chi phí nghiên cứu thị trường, các sai lầmtrong bán hàng, tiếp thị, chiến lược kinh doanh của công ty
Phân tích hành vi của khách hàng để đưa ra dự đoán, cho phép các nhà tiếp thi phát hiệnlệch lạc trong mô hình kinh doanh
1.2.2. Thách thức và hướng giải quyết
Do dữ liệu lớn, không ngừng tăng nhanh, dữ liệu phức tạp, các ứng dụng dữ liệu truyềnthống không đáp ứng được việc lưu trữ, phân tích và xử lý dữ liệu Vì vậy, yêu cầu cần cómột ứng dụng giải quyết các khó khăn trên
Trang 5một lượng dữ liệu khổng lồ một cách nhanh chóng, giúp người dùng có thể dễ dàng tìmđược thông tin cần thiết trong thời gian thực, nhất là khi kỷ nguyên của exabytes đang đếngần.
Phân tích web log là một trường hợp lý tưởng sử dụng nền tảng Apache Spark
1.3. GIỚI THIỆU VỀ APACHE SPARK
1.3.1. Apache Spark là gì?
Apache Spark là một framework mã nguồn mở tính toán cụm, được phát triển vào năm
2009 bởi AMPLab tại đại học California Sau này, Spark đã được trao cho Apache SoftwareFoundation vào năm 2013 và được phát triển cho đến nay
Tính năng của Apache Spark:
- Tốc độ: Spark có thể chạy trên cụm Hadoop và có thể chạy nhanh hơn 100 lần khi
chạy trên bộ nhớ RAM, và nhanh hơn 10 lần khi chạy trên ổ cứng Bằng việc giảm sốthao tác đọc ghi lên đĩa cứng, lưu trữ trực tiếp dữ liệu xử lý lên bộ nhớ
- Hỗ trợ đa ngôn ngữ: Spark cung cấp các API có sẵn cho các ngôn ngữ Java, Scala,
hoặc Python
- Phân tích nâng cao: Spark không chỉ hỗ trợ “Map” và “Reduce” mà còn hỗ trợ truy
vấn SQL, xử lý theo Stream, học máy, và các thuật toán đồ thị (Graph)
1.3.2. Tại sao sử dụng Apache Spark?
Với các bài toán phân tích dữ liệu lớn nên sử dụng Apache Spark do:
+ Tốc độ xử lý của Spark có được do việc tính toán được thực hiện cùng lúc trên nhiềumáy khác nhau Đồng thời việc tính toán được thực hiện ở bộ nhớ trong (in-memories)hay thực hiện hoàn toàn trên RAM
+ Spark cho phép xử lý dữ liệu theo thời gian thực, vừa nhận dữ liệu từ các nguồn khácnhau đồng thời thực hiện ngay việc xử lý trên dữ liệu vừa nhận được ( SparkStreaming)
+ Spark không có hệ thống file của riêng mình, nó sử dụng hệ thống file khác như:HDFS, Cassandra, S3,… Spark hỗ trợ nhiều kiểu định dạng file khác nhau (text, csv,json…) đồng thời nó hoàn toàn không phụ thuộc vào bất cứ một hệ thống file nào.+ Spark cho phép xây dựng và phân tích nhanh các mô hình dự đoán Hơn nữa, nó còncung cấp khả năng truy xuất toàn bộ dữ liệu cùng lúc, nhờ vậy ta không cần phải lấymẫu dữ liệu – đòi hỏi bởi các ngôn ngữ lập trình như R Thêm vào đó, Spark còn cungcấp tính năng streaming, được dùng để xây dựng các mô hình real-time bằng cách nạptoàn bộ dữ liệu vào bộ nhớ
+ Khi có một tác vụ nào đó quá lớn mà không thể xử lý trên một laptop hay một server,Spark cho phép ta phân chia tác vụ này thành những phần dễ quản lý hơn Sau đó,Spark sẽ chạy các tác vụ này trong bộ nhớ, trên các cluster của nhiều server khác nhau
Trang 6để khai thác tốc độ truy xuất nhanh từ RAM Spark sử dụng API Resilient DistributedDataset (RDD) để xử lý dữ liệu.
1.3.3. Thành phần của Apache Spark
Hình 1 1 Thành phần của Apache Spark
- Spark Core (Thành phần trung gian của Spark): Cung cấp những chức năng cơ bảnnhất của Spark như lập lịch cho các tác vụ, quản lý bộ nhớ, fault recovery, tương tácvới các hệ thống lưu trữ…Đặc biệt, Spark Core cung cấp API để định nghĩa RDD(Resilient Distributed DataSet) là tập hợp của các item được phân tán trên các nodecủa cluster và có thể được xử lý song song
- Spark có thể chạy trên nhiều loại Cluster Managers như Hadoop YARN, ApacheMesos hoặc trên chính cluster manager được cung cấp bởi Spark được gọi làStandalone Scheduler
- Spark SQL: Cho phép truy vấn dữ liệu cấu trúc qua các câu lệnh SQL Spark SQL cóthể thao tác với nhiều nguồn dữ liệu như Hive tables, Parquet, và JSON
- Spark Streaming: Cung cấp API để dễ dàng xử lý dữ liệu stream,
- Mllib: Cung cấp rất nhiều thuật toán của học máy như: classification, regression,clustering, collaborative filtering…
- GraphX: Là thư viện để xử lý đồ thị
1.4. BÀI TOÁN CỤ THỂ
Sử dụng Apache Spark phân tích file web log khối lượng lớn để thống kê , xử lý log theocác yêu cầu như thống kê Website có lượng truy cập nhiều nhất, bài viết nhiều view nhất đểtính doanh thu, đưa quảng cáo, theo yêu cầu của khách hàng
+ Đầu vào: Là log đã được xử lý và chuẩn hoá gồm 24 trường dữ liệu, phân cách bởi ký
Trang 8Worker Executor
Task Task
Worker Executor
2.1. KIẾN TRÚC VÀ HOẠT ĐỘNG CỦA APACHE SPARK
2.1.1. Kiến trúc của Apache Spark
Hình 2 1 Kiến trúc Apache Spark
Apache Spark có kiến trúc gồm một node master và nhiều node worker.
+ Spark Driver sẽ liên hệ với master node để điều phối các worker node nơi có chứa
các executor đang thực thi công việc
+ Master node: Chứa trình quản lý cụm (Spark Standalone /YARN /MESSO) các
worker node Chương trình lập lịch sẽ chịu trách nhiệm lập lịch cho các tác vụ và yêucầu các worker node thực hiện
+ Worker node: Mỗi worker bao gồm một hoặc một số Executor thực hiện việc lưu trữ,
đọc ghi khi xử lý dữ liệu
+ Executor: Chịu trách nhiệm xử lý các task nhỏ riêng biệt bằng các luồng độc lập.
2.1.2. Quản lý bộ nhớ trong Spark
Việc quản lý bộ nhớ của Spark trong bộ nhớ dựa trên 2 khái niệm:
• Resilient Distributed Datasets (RDD) – các tập dữ liệu phân tán
• Directed Acyclic Graph (DAG) – đồ thị tuần hoàn có hướng
Trang 9Hình 2 2 Quản lý bộ nhớ trong Spark
RDD (Resilient Distributed Datasets):
+ Là tập dữ liệu phân tán mà các dữ liệu này được phân tán vào các node của cluster đểthực hiện tính toán song song
+ Lưu trữ trên bộ nhớ phục vụ việc sử dụng lại một cách nhanh chóng
+ Cung cấp cơ chế cache trên bộ nhớ
+ Tự động phục hồi dữ liệu khi xảy ra lỗi
+ RDDs hỗ trợ hai kiểu thao tác thao tác: transformation và action
+ Transformation (map, filter, groupBy, join…): tạo ra dataset từ dữ liệu có sẵn, nghĩa
là biến đổi một hoặc nhiều RDD thành một RDD mới Tất cả các transformation đều
là lazy, có nghĩa là các transformation này sẽ không thực hiện tính toán trong phươngthức ngay mà chúng sẽ được lưu lại thành dữ liệu cơ bản( ví dụ như file) và chúngchỉ thực hiện tính toán khi 1 action được gọi để yêu cầu trả về kết quả cho driverprogram Nhờ thiết kế này mà Spark chạy hiệu quả hơn
đầu vào(nguồn)mà hàm func trả về kết quả true
union(otherDataset) Trả về 1 RDD mới là hợp của tập dữ liệu phần tử đầu
vào(nguồn) vàcác phần tử của đối(otherDataset)
distinct([numTasks])) Trả về 1 RDD mới chứa mỗi phần tử là duy nhất của
tập dữ liệunguồn(đầu vào)
groupByKey([numTasks]) Khi gọi đến 1 tập dữ liệu (K,V) sẽ trả về 1 tập là cặp
(K,Seq(V))( Tức lànhóm tập các phần tử cùng Key)
Chú ý: mặc định chỉ có 8 task song songkhi grouping.
Có thể thay đổi số task song song này bằng việctruyềnvào tham số đầu vào
Trang 10reduceByKey(func, [numTasks]) Khi gọi tập dữ liệu (K,V), trả về 1 tập (K,V) mà giá
trị của key đượctổng hợp sử dụng hàm reduce func
join(otherDataset, [numTasks]) Khi gọi tập dữ liệu có kiểu (K,V) và (K,W), nó sẽ trả
về 1 cặp mới(K,(V,W))( nối 2 phần tử có cùng key)
flatMap(func) Tương tự map nhưng khác map ở chỗ, mỗi phần tử
đầu vào quaflatMap sẽ trả về 0 hoặc nhiều phần tử đầura(có thể hiểu quamap sẽ là 1-1)
mapPartitions(func) Tương tự như map nhưng chạy riêng biệt trên mỗi
vùng RDD Hàm func phải có dạng Iterator[T] =>Iterator[U] khi chạy RDD kiểuT
+ Action (count, collect, save…): trả về giá trị cho chương trình điều khiển (driver
program) sau khi thực hiện tính toán trên dataset
Bảng 2 Một số phương thức Action
reduce(func) Tổng hợp các phần tử của tập dữ liệu sử dụng hàm func(có 2 đối
và trả về 1 kết quả)
collect() Trả về tất cả các phần tử của tập dữ liệu như 1 mảng ở
driverProgram Hàm này hữu ích sau khi lọc hoặc thao tác khác
mà trả về tập dữ liệu con đủ nhỏ
count() Trả về số phần tử của tập dữ liệu
first() Trả về phần tử đầu tiên của tập dữ liệu( tương tự take(1))
saveAsTextFile(path) Ghi các phần tử của tập dữ liệu như 1 file text( hoặc tập file
text) lên 1 thư mục trong hệ thống local, HDFS hoặc hệ thống hỗtrợ Hadoop bất kỳ
countByKey() Chỉ cho RDD có kiểu (K,V) Trả về 1 Map (K,Int) Int là chỉ số
key
foreach(func) Chạy hàm func cho mỗi phần tử của tập dữ liệu Điều này có tác
dụng khi thực hiện cập nhật 1 biến accumulator hoặc tương tácvới hệ thống lưu trữ ngoài
DAG (Directed Acyclic Graph):
+ RDD được hình thành sau mỗi lần chuyển đổi Ở cấp độ cao khi áp dụng action trêncác RDD này, Spark tạo ra một DAG DAG là một chuỗi các tính toán được thực hiệntrên dữ liệu trong đó mỗi nút là một phân vùng RDD
+ Chia các stage thành các tasks và thực hiện các phép biến đổi bên trong mỗi stage.+ Phân chia phân vùng hạn chế tối đa việc xáo trộn dữ liệu giữa các node
Trang 11Hình 2 3 Sơ đồ hoạt động của RDD và DAG
Khi một action được gọi trên RDD, Spark sẽ tạo DAG và chuyển cho DAG scheduler.DAG scheduler chia các thao tác thành các nhóm (stage) khác nhau của các task
Mỗi nhóm (stage) bao gồm các task dựa trên phân vùng của dữ liệu đầu vào có thểpipline với nhau và có thể thực hiện một cách độc lập trên một máy worker DAG schedulersắp xếp các thao tác phù hợp với quá trình thực hiện theo thời gian sao cho tối ưu nhất.Việc chia nhỏ các task giúp đem lại hiệu năng cao hơn, giảm thiểu ảnh hưởng của dữ liệukhông đối xứng (kích thước các file không đồng đều)
Nếu kích thước RAM không đủ chứa dữ liệu thì dữ liệu sẽ được lưu trữ sang Tachyon vàcuối cùng là lưu trữ lên đĩa Khi dữ liệu (RDD) không được lưu trữ trên RAM, khi có nhucầu sử dụng đến, chúng sẽ được recompute lại
2.1.3. Hoạt động của Apache Spark
Trang 12Hình 2 4 Sơ đồ hoạt động của Apache Spa
Khi một client gửi ứng dụng của người dùng spark, driver ngầm chuyển đổi code chứacác phép transformations và actions thành một DAG
Ở giai đoạn này, DAG được chuyển cho DAG scheduler DAG scheduler phân chia đồ thịthành các nhóm (stage) và gửi từng nhóm khi sẵn sàng lên Task Scheduler
Sau khi đã tạo ra một tập các stages , nó tạo ra các đơn vị thực thi nhỏ được gọi là cáctask theo từng stage Sau đó, các task được nhóm lại để được gửi tới cluster manager
Driver program sau đó sẽ giao tiếp với cluster manager và đàm phán các nguồn lực Sau
đó, cluster manager sẽ khởi chạy các executor trên các worker nodes thay cho driver Tạithời điểm này driver gửi tác vụ (tasks) đến cluster manager dựa trên vị trí dữ liệu
Trước khi các executor bắt đầu thực hiện, chúng tự xác nhận với driver program để driver
có nắm được tổng thể về tất cả các executor Bây giờ các executors bắt đầu thực hiện cáctask khác nhau do driver program gán
Tại bất kỳ thời điểm nào khi ứng dụng spark đang chạy, driver program sẽ theo dõi tậphợp các executor chạy Driver Program trong kiến trúc Spark cũng lên lịch các tasks trongtương lai dựa trên vị trí dữ liệu bằng cách theo dõi vị trí của dữ liệu được lưu trong bộ nhớcache Khi phương thức main() của driver program thoát hoặc khi nó gọi phương thức stop()của Spark Context
Trang 13Spark SQL là một mô-đun Spark để xử lý dữ liệu có cấu trúc Không giống như APISpark RDD cơ bản, các giao diện được cung cấp bởi Spark SQL cung cấp Spark với nhiềuthông tin hơn về cấu trúc của cả dữ liệu và tính toán được thực hiện Bên trong Spark SQL
sử dụng thông tin bổ sung này để thực hiện tối ưu hóa thêm Có một số cách để tương tácvới Spark SQL bao gồm SQL và API tập dữ liệu Khi tính toán kết quả, cùng một công cụthực thi được sử dụng, không phụ thuộc vào API /ngôn ngữ nào bạn đang sử dụng để diễn tảtính toán Sự thống nhất này có nghĩa là các nhà phát triển có thể dễ dàng chuyển đổi qua lạigiữa các API khác nhau dựa trên đó cung cấp cách tự nhiên nhất để thể hiện một phép biếnđổi đã cho
Một cách sử dụng Spark SQL là thực thi các truy vấn SQL Spark SQL cũng có thể được
sử dụng để đọc dữ liệu từ một cài đặt Hive hiện có Khi chạy SQL từ bên trong một ngônngữ lập trình khác, kết quả sẽ được trả về dưới dạng một Datasets/DataFrames
Datasets
Datasets là tập hợp dữ liệu được phân phối
Cung cấp các lợi ích của RDD (khả năng sử dụng các hàm lambda mạnh mẽ) với các lợiích của công cụ thực hiện tối ưu hóa của Spark SQL
Một Dataset có thể được xây dựng từ vật JVM và sau đó thao tác sử dụng biến đổi chứcnăng ( map, flatMap, filter,…) API tập dữ liệu có sẵn trong Scala và Java Python không có
hỗ trợ cho API tập dữ liệu Nhưng do tính chất động của Python, nhiều lợi ích của API tập
dữ liệu đã có sẵn (nghĩa là bạn có thể truy cập vào trường của một hàng theo tên một cách tựnhiên row.columnName) Trường hợp cho R là tương tự
(1)Nạp dữ liệu vào một DataFrame sử dụng schema inference
Ví dụ:
import sqlContext.implicits._
case class Person(firstName: String, lastName: String, gender: String, age: Int)
Trang 14val rdd = sc.textFile("people.csv")
val peopleRDD = rdd.map { line => val cols = line.split(",") Person(cols(0), cols(1),cols(2), cols(3).toInt) }
val df = peopleRDD.toDF
// df: DataFrame = [firstName: string, lastName: string, gender: string, age: int]
(1) Làm việc với dataFrame
+ column
Nó cung cấp một chế độ xem theo định hướng cột chung của dữ liệu cơ bản, bất kỳ dữ liệuđược tổ chức thực sự như thế nào Một vị trí cho một giá trị dữ liệu có thể có các trạng thái:trống(null), chứa giá trị (not-null), không có Xác định một columns trong API dataFrames:
+ show() : Có thể xem các phần tử n đầu tiên trong một dataFrame với phương thức
show () Nếu không được chỉ định, n mặc định là 20
Trang 15+ cache(): Spark có thể cache một dataFrame, sử dụng bộ nhớ trong định dạng cột, bằng cách gọi df.cache ()
+ Select(): giống như một SQL SELECT, cho phép giới hạn kết quả cho các cột cụ thể.
+ filter(): cho phép lọc các hàng ra kết quả.
Trang 16+ orderBy(): cho phép sắp xếp các kết quả.
+ limit(n): Giới hạn kết quả thành n hàng.
+ distinct(): Trả về một dataFrame mới chỉ chứa các hàng duy nhất trong dataFrame.
+ drop(column): Trả về một dataFrame mới với một cột giảm.
+ join(dataframe): join một dataFrame với một dataFrame khác như SQL join.
+ groupBy(): Thường được sử dụng với count(), groupBy() nhóm dữ liệu các mục theo
giá trị cột cụ thể
+ as() or alias():cho phép đổi tên một cột Nó đặc biệt hữu ích với các cột được tạo.