Hiện nay, trên thực tế có nhiểu lớp các bài toán cần phải thực hiện khối lƣợng tính toán lớn trên rất nhiều dữ liệu đầu vào. Các bài toán nhƣ vậy có thể gặp trong nhiều lĩnh vực, từ tìm kiếm, truy hồi thông tin, tới các bài toán tin sinh học. Một ví dụ điển hình là các máy tìm kiếm (search engine) lớn nhƣ Google, trong quá trình phân tích, đánh chỉ mục phải xử lý tới hàng tỷ trang Web và các tài liệu khác, tƣơng đƣơng lƣợng dữ liệu ở mức pentabyte. Hay trong lĩnh vực sinh học phân tử và tin sinh học. Trong bài toán phân tích hệ gen ngƣời hay sinh vật bậc cao đòi hỏi xử lý các bộ dữ liệu có kích thƣớc nhiều terabyte để mã hóa hơn 25.000 gen với số nucleotit lên hàng tỉ. Những vấn đề về xử lý ngôn ngữ tự nhiên, nhận dạng, xử lý ảnh ba chiều, dự báo thời tiết... đều đòi hỏi phải xử lý dữ liệu với tốc độc rất cao, với khối lƣợng dữ liệu rất lớn. Để đáp ứng yêu cầu tính toán và xử lý lớn nhƣ vậy, việc tính toán tuần tự trên các máy tính riêng lẻ là không đáp ứng yêu cầu. Do đó cần phải có những hệ thống máy tính mạnh mẽ hơn để đáp ứng đƣợc những yêu cầu của thực tế. Mặc dù tốc độ xử lý của các Bộ xử lý tăng nhanh trong những năm qua, nhƣng do giới hạn về vật lý nên khả năng tính toán của chúng không thể tăng mãi đƣợc. Điều này dẫn tới là muốn tăng đƣợc khả năng tính toán của các hệ thống máy tính thì phải khai thác đƣợc khả năng xử lý song song của chúng. Ngày càng xuất hiện nhiều bài toán mà những hệ thống đơn một bộ xử lý không đáp ứng đƣợc yêu cầu xử lý về thời gian, do đó đòi hỏi phải sử dụng những hệ thống đa bộ xử lý và đòi hỏi phải xử lý song song. Việc song song hóa để đẩy nhanh tốc độ thực thi của một tiến trình có thể thực hiện ở nhiểu mức, đầu tiên là mức vật lý, với việc xây dựng hệ thống máy tính liên kết với nhau. Mức thứ hai là mức ứng dụng, ngay chính bản thân các ứng dụng cũng phải hỗ trợ khả năng tính toán phân tán, tối ƣu các thuật toán khi làm việc trên môi trƣờng phân tan, mà tại đó rất hay gặp phải cái vấn đề về lỗi, vấn đề bảo mật, tức là hệ thống không đồng đều và tính tin cậy không cao. . Các phƣơng pháp song song hóa đã đƣợc đề cập từ lâu, khi mà J.Von Neumann giới thiệu mô hình tính toán song song có tên Otomat tế bào. Từ đó đến nay, lý thuyết về xử lý song song trở thành lĩnh vực nghiên cứu quan trọng và ngày càng đem lại những dấu hiệu khả quan trong việc xây dựng một mô hình lập trình mới có những tính năng vƣợt trội so với mô hình lập trình tuần tự truyền thống. Năm 2004, Google giới thiệu mô hình toán (ở mức ứng dụng) MapReduce để trợ tính toán phân tán trên một tập dữ liệu lớn và trên các cụm nhiều máy tính. Cho đến nay đã có nhiều giải pháp triển khai nhƣ Apache Hadoop, Qizmt, Skynet và Greenplum, làm cho MapReduce trở lên phổ biến và theo Infoworld, MapReduce là công nghệ doanh nghiệp có ảnh hƣởng lớn nhất 1 (năm 2009). Đồ án tốt nghiệp Đại học Đặt vấn đề SVTH: Vũ Minh Ngọc D07CNPM1 2 MapReduce nền tảng lập trình này đã đƣợc Google, Yahoo, Facebook, MySpace và nhiều hãng khác áp dụng để xử lý bộ dữ liệu khổng lồ hàng giờ. Ở dạng đơn giản nhất, MapReduce chia việc xử lý thành nhiều khối công việc nhỏ, phân tán khắp liên cung (cluster)gồm các nút tính toán (tiêu biểu là các server thông thƣờng) và rồi thu thập các kết quả. Hỗ trợ xử lý song song có khả năng mở rộng cao, MapReduce là giải pháp nhanh, rẻ và an toàn. Mục tiêu của đồ án là tìm hiểu về MapReduce nhƣ một mô hình tính toán mới, có nhiều tiềm năng và ứng dụng. Trong phạm vi đồ án, em sẽ tìm hiểu về mô hình MapReduce, cách hiện thực hóa MapReduce trong phần mềm nguồn mở Hadoop. Trên cơ sở các hiểu biết về MapReduce, em cũng xây dựng phiên bản song song cho một số thuật toán học máy thông dụng, cài đặt trên Hadoop và thử nghiệm làm rõ đặc điểm của phiên bản song song do em xây dựng. Các bạn muốn tìm hiểu về Bigdata và Mapreduce có thể liên hệ với mình qua skype: vungoc.89 (ghi rõ yêu cầu kết bạn)
Trang 1
Quá trình thực hiện đồ án, là một thời gian dài và gây ra nhiều khó khăn với một sinh viên chưa có kinh nghiệm như em Tuy vậy, trong suốt thời gian ấy có sự giúp đỡ tận tình của thầy Từ Minh Phương Vì vậy, ngay những trang đầu này, em muốn dành lời cám ơn sâu sắc nhất tới thầy
Bên cạnh đó, trong thời gian thực tập và làm đồ án, em được sự giúp đỡ nhiệt tình của các anh chị trong công ty Cổ phần truyền thông Việt Nam - VCCorp
Tuy đã cố gắng để hoàn thành tốn đồ án, nhưng không tránh khỏi những sai sót, vì vậy em mong nhận được sự thông cảm, chỉ bảo của Thầy Cô và các bạn
Em xin chân thành cảm ơn!
Hà Nội, ngày 05 tháng 12 năm 2011
Sinh viên:
Vũ Minh Ngọc
Trang 2(Của Người hướng dẫn)
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Điểm: ……….………(bằng chữ: … ……… ….)
Đồng ý/Không đồng ý cho sinh viên bảo vệ trước hội đồng chấm đồ án tốt nghiệp?
…………, ngày tháng năm 20
CÁN BỘ- GIẢNG VIÊN HƯỚNG DẪN
(ký, họ tên)
Trang 3ĐẶT VẤN ĐỀ 1
CHƯƠNG I MƠ HÌNH MAPREDUCE VÀ HADOOP 1
1.1 Mơ hình MapReduce 1
1.1.1 Tổng quan về mơ hình tốn MapReduce 1
1.1.2 Ưu điểm của mơ hình MapReduce 3
1.1.3 Nguyên tắc hoạt động của mơ hình MapReduce 3
1.2 Apache Hadoop 5
1.2.1 Giới thiệu tổng quát về Apache Hadoop 5
1.2.2 Ưu điểm của Apache Hadoop 6
1.2.3 Các thành phần trong dự án Apache Hadoop 6
1.2.4 Nguyên tắc hoạt động của Hadoop MapReduce 6
1.2.5 Các trình nền của Hadoop 7
CHƯƠNG II LẬP TRÌNH CƠ BẢN VỚI MƠ HÌNH TỐN MAPREDUCE VÀ HADOOP 10
2.1 Phương pháp viết một MapReduce job 10
2.1.1 Các kiểu dữ liệu mà Hadoop hỗ trợ 11
2.1.2 Mapper 12
2.1.3 Reducer 13
2.2 Hadoop I/O 14
2.2.1 InputFormat 14
2.2.2 OutputFormat 16
2.3 SequenceFile 17
CHƯƠNG III SỬ DỤNG MƠ HÌNH MAPREDUCE ĐỂ SONG SONG HĨA MỘT SỐ THUẬT TỐN CỤ THỂ 18
3.1 K-Means 18
3.1.1 Giới thiệu thuật tốn K-Means 18
3.1.2 MapReduce hĩa 20
3.2 Nạve Bayes 24
3.2.1 Giới thiệu thuật tốn Nạve Bayes cơ bản 24
3.2.2 MapReduce hĩa 29
3.3 LDA và Gibbs sampling 33
3.3.1 Giới thiệu thuật tốn 33
3.3.2 MapReduce hĩa lấy mẫu Gibbs cho LDA 38
CHƯƠNG IV CÀI ĐẶT VÀ THỰC NGHIỆM 47
Trang 44.1.1 K-Means 47
4.1.2 Nạve Bayes 48
4.1.3 LDA với Gibbs samppling 49
4.2 Thực thi các ứng dụng trên mơi trường thật 51
4.2.1 K-mean 51
4.2.2 Nạve Bayes 55
4.2.3 LDA và lấy mẫu Gibbs 58
4.3 So sánh và đánh giá hiệu năng 60
4.3.1 Đánh giá tính chính xác của thuật tốn khi áp dụng mơ hình MapReduce 60
4.3.2 Đánh giá khả năng cải thiện tốc độ thực thi của các thuật tốn 60
4.3.3 MapReduce khơng phải lúc nào cũng mơ hình tốt nhất 63
DANH MỤC TÀI LIỆU THAM KHẢO 65
PHỤ LỤC 66
Trang 5Hình 1 Mơ hình làm việc của một cơng việc MapReduce 2
Hình 2 Quy trình xử lý của MapReduce 4
Hình 3 Tương tác giữa JobTracker và TaskTracker Sau khi client gọi JobTracker bắt đầu cơng việc xử lý dữ liệu, các phân vùng JobTracker làm việc và giao các nhiệm vụ Map và Recude khác nhau cho mỗi TaskTracker trong cluster 9
Hình 4 Cấu trúc liên kết của một nhĩm Hadoop điển hình Đĩ là một kiến trúc master/slave trong đĩ NameNode và JobTracker là Master và DataNode & TaskTracker là slave 9
Hình 5 Biểu đồ phân cấp quả quá trình MapReduce 10
Hình 6 Mơ hình K-means đơn giản 18
Hình 7 Hình dạng cụm dữ liệu được khám phá bởi k-means 20
Hình 8 Lưu đồ thuật tốn k-means 22
Hình 9 Lưu đồ MapReduce hố K-means 23
Hình 10 Lưu đồ thuật tốn Naive Bayes 30
Hình 11 Lưu đồ MapReduce hố Naive Bayes 31
Hình 12 Quá trình lặp của thuật tốn sinh LDA 34
Hình 13 (Trái) Mơ hình độ hoạ biểu diễn của LDA (Phải) Mơ hình đồ hoạ biểu diễn của phân phối biến đổi được sử dụng để xấp xỉ xác suất hậu nghiệm trong LDA 35
Hình 14 Mơ hình thuật tốn lấy mẫu Gibbs 39
Hình 15 Lưu đồ MapReduce hố thuật tốn lấy mẫu Gibbs - chiến lược 1 41
Hình 16 Lưu đồ MapReduce hố lấy mẫu Gibbs - chiến lược 2 42
Hình 17 Đoạn chương trình của K-Means 51
Hình 18 Quá trình bắt đầu, hiển thị ra tọa độ trọng tâm ban đầu 52
Hình 19 Quá trình thực hiện, kết quả - trọng tâm mới được hiển thị sau mỗi vịng lặp 52
Hình 20 Kết quả cuối cùng, tọa độ của hai trọng tâm mới được hiển thị 53
Hình 21 Trang web để theo dõi quá trình thực hiện job MapReduce 54
Hình 22 Nhật ký của một lần chạy job MapReduce, với số lượng Map và số lượng Reduce cùng chạy 54
Hình 23 Đoạn mã nguồn chương trình Nạve Bayes 55
Hình 24 Chạy đoạn mã trên Hadoop 55
Hình 25 Quá trình thực hiện job 56
Hình 26 Kết thúc job MapReduce để đếm số lần xuất hiện 56
Hình 27 Đoạn mã chương trình tính sác xuất cuối cùng cho Nạve Bayes 57
Hình 28 Giá trị của mỗi biến xác suất cần tính, và chạy một kết quả thử nghiệm 57
Hình 29 Đoạn mã chương trình Gibbs với nhiều biến đếm tồn cục 58
Hình 30 Chạy đoạn chương trình trên Hadoop 58
Hình 31 Kết quả khi chạy với một dữ liệu đơn giản 59
Hình 32 Bảng tổng kết trực quan, so sánh tốc độ thực hiện Nạve Bayes trên từng máy và trên cả 5 máy 61
Hình 33 Biểu đồ cho thấy cải thiện tốc độ của thuật tốn k-mean, khi sử dụng từ 1-16 bộ vi xử lý Dịng đậm là mức độ trung bình, cịn các dịng nét đứt là khoảng từ tốc độ cao nhất đến thấp nhất (phương sai) 62
Hình 34 Biểu đồ cho thấy cải thiện tốc độ của thuật tốn Nạve Bayes, khi sử dụng từ 1-16 bộ vi xử
lý Dịng đậm là mức độ trung bình, cịn các dịng nét đứt là khoảng từ tốc độ cao nhất đến thấp nhất
Trang 6Bảng 1 Danh sách các kiểu dữ liệu cơ bản của Hadoop 11 Bảng 2 Một vài lớp thực hiện Mapper được định nghĩa trước bởi Hadoop 13 Bảng 3 Danh sách một số reducer cơ bản được triển khai cung cấp bởi Hadoop 14
Trang 7Trong bài toán phân tích hệ gen người hay sinh vật bậc cao đòi hỏi xử lý các bộ dữ liệu có kích thước nhiều terabyte để mã hóa hơn 25.000 gen với số nucleotit lên hàng tỉ
Những vấn đề về xử lý ngôn ngữ tự nhiên, nhận dạng, xử lý ảnh ba chiều, dự báo thời tiết đều đòi hỏi phải xử lý dữ liệu với tốc độc rất cao, với khối lượng dữ liệu rất lớn Để đáp ứng yêu cầu tính toán và xử lý lớn như vậy, việc tính toán tuần tự trên các máy tính riêng lẻ là không đáp ứng yêu cầu Do đó cần phải có những hệ thống máy tính mạnh mẽ hơn để đáp ứng được những yêu cầu của thực tế
Mặc dù tốc độ xử lý của các Bộ xử lý tăng nhanh trong những năm qua, nhưng do giới hạn về vật lý nên khả năng tính toán của chúng không thể tăng mãi được Điều này dẫn tới là muốn tăng được khả năng tính toán của các hệ thống máy tính thì phải khai thác được khả năng xử lý song song của chúng Ngày càng xuất hiện nhiều bài toán mà những hệ thống đơn một bộ xử lý không đáp ứng được yêu cầu xử lý về thời gian, do đó đòi hỏi phải sử dụng những hệ thống đa bộ xử lý và đòi hỏi phải xử lý song song
Việc song song hóa để đẩy nhanh tốc độ thực thi của một tiến trình có thể thực hiện ở nhiểu mức, đầu tiên là mức vật lý, với việc xây dựng hệ thống máy tính liên kết với nhau Mức thứ hai là mức ứng dụng, ngay chính bản thân các ứng dụng cũng phải hỗ trợ khả năng tính toán phân tán, tối ưu các thuật toán khi làm việc trên môi trường phân tan, mà tại đó rất hay gặp phải cái vấn đề về lỗi, vấn đề bảo mật, tức là hệ thống không đồng đều và tính tin cậy không cao
Các phương pháp song song hóa đã được đề cập từ lâu, khi mà J.Von Neumann giới thiệu mô hình tính toán song song có tên Otomat tế bào Từ đó đến nay, lý thuyết về xử lý song song trở thành lĩnh vực nghiên cứu quan trọng và ngày càng đem lại những dấu hiệu khả quan trong việc xây dựng một mô hình lập trình mới có những tính năng vượt trội so với mô hình lập trình tuần tự truyền thống
Năm 2004, Google giới thiệu mô hình toán (ở mức ứng dụng) MapReduce để trợ tính toán phân tán trên một tập dữ liệu lớn và trên các cụm nhiều máy tính Cho đến nay đã có nhiều giải pháp triển khai như Apache Hadoop, Qizmt, Skynet và Greenplum, làm cho MapReduce trở lên phổ biến và theo Infoworld, MapReduce là công nghệ doanh nghiệp có ảnh hưởng lớn nhất [1]
(năm 2009)
Trang 8MapReduce - nền tảng lập trình này đã được Google, Yahoo, Facebook, MySpace và nhiều hãng khác áp dụng để xử lý bộ dữ liệu khổng lồ hàng giờ Ở dạng đơn giản nhất, MapReduce chia việc xử lý thành nhiều khối cơng việc nhỏ, phân tán khắp liên cung (cluster)gồm các nút tính tốn (tiêu biểu là các server thơng thường) và rồi thu thập các kết quả Hỗ trợ xử lý song song cĩ khả năng mở rộng cao, MapReduce là giải pháp nhanh, rẻ và
an tồn
Mục tiêu của đồ án là tìm hiểu về MapReduce như một mơ hình tính tốn mới, cĩ nhiều tiềm năng và ứng dụng Trong phạm vi đồ án, em sẽ tìm hiểu về mơ hình MapReduce, cách hiện thực hĩa MapReduce trong phần mềm nguồn mở Hadoop Trên cơ sở các hiểu biết
về MapReduce, em cũng xây dựng phiên bản song song cho một số thuật tốn học máy thơng dụng, cài đặt trên Hadoop và thử nghiệm làm rõ đặc điểm của phiên bản song song do em xây dựng
TĨM TẮT NỘI DUNG CHÍNH CỦA ĐỒ ÁN
Nội dung của đồ án được chia thành 4 chương:
Chương 1 Giới thiệu các khái niệm cơ bản nhất về mơ hình tốn MapReduce, ưu
điểm, cũng như nguyên tắc hoạt động cơ bản Đồng thời, đồ án cũng đề cập đến Apache Hadoop - giải pháp nguồn mở rất phổ biến hiện nay, mơ hình cũng như thành phần của nĩ
Chương 2 Trong phần này sẽ nĩi chi tiết hơn về mơ hình tốn MapReduce, làm thế
nào để lập trình được với nĩ thơng qua các ví dụ đơn giản Bên cạnh đĩ, trong Chương 2 này chúng ta cũng tìm hiểu một số API do Apache Hadoop cung cấp để lập trình với mơ hình tốn MapReduce trên nền Java
Chương 3 Đây là phần chính của đồ án, với việc áp dụng mơ hình tốn cho 3 thuật
tốn là K-Mean, Nạve Bayes và LDA Trong đĩ, sẽ giới thiệu về ba thuật tốn này, cùng với cách áp dụng mơ hình tốn cho mỗi thuật tốn
Chương 4 Là phần cài đặt các mơ hình tốn của 3 thuật tốn ở Chương 3 Việc cài
đặt được thực hiện trên mơi trường của Apache Hadoop Đồng thời cũng đánh giá hiệu năng khi chạy phân tán trong mơi trường thực tế
Trong lúc viết, tuy đã cố gắng hết sức nhưng vẫn khơng tránh khỏi thiếu sĩt mong các thầy gĩp ý giúp hồn thiện hơn bản đồ án, để thơng qua đồ án này làm cho MapReduce được ứng dụng rộng rãi hơn ở Việt Nam
Trang 9CHƯƠNG I MÔ HÌNH MAPREDUCE VÀ HADOOP
1.1.1 Tổng quan về mô hình toán MapReduce
MapReduce là một “mô hình lập trình” (programming model), lần đầu được giới thiệu trong bài báo của Jefferey Dean và Sanjay Ghemawat ở hội nghị OSDI 2004 [thêm trích dẫn vào đây] MapReduce chỉ là một mô hình hay là một khung (framework) để người lập trình xây dựng chương trình Để thực hiện chương trình theo mô hình MapReduce thì cần có một nền tảng hay một hiện thực (implementation)
cụ thể Google có một nền tảng của MapReduce bằng C++ Apache có Hadoop, một implementation mã nguồn mở khác trên Java (người dùng dùng Hadoop qua một Java interface)
MapReduce là quy trình giúp xử lý tập hợp dữ liệu lớn đặt tại các máy tính phân tán, có thể xử lý được dữ liệu không cấu trúc (dữ liệu lưu trữ dạng tệp tin hệ thống) và dữ liệu cấu trúc (dữ liệu quan hệ 2 chiều) Trong MapReduce, các máy tính chứa dữ liệu đơn lẻ được gọi là các nút (node)
Đơn giản thì MapReduce là một cách tiếp cận chia để trị, tức là chia vấn đề lớn thành các vấn đề nhỏ, xử lý song song từng vấn đề nhỏ và tổng hợp kết quả lại Để thực hiện được công việc, mô hình MapReduce chia công việc thành hai phần chính là
map và reduce Trong đó, hàm map thường rút trích thông tin cần thiết các từng phần
tử, qua một bước trung gian để trộn và sắp xếp lại kết quả, sau đó tại reduce thì tổng hợp kết quả trung gian và tính ra kết quả cuối cùng
Ví dụ, trong bài đếm từ, công việc chủ yếu là đếm số lần xuất hiện của các từ trong văn bản Công việc như vậy thì có thể phân chia thành hai phần như sau:
• Đầu vào : Một dòng của văn bản
• Đầu ra : key : từ, value : 1
• Đầu vào : key : từ, values : tập hợp các giá trị đếm được của mỗi từ
• Đầu ra : key : từ, value : tổng
Dữ liệu là văn bản, được chia thành nhiều dòng khác nhau, lưu trữ ở nhiều nơi
khác nhau Hàm map chạy song song tạo ra các giá trị trung gian khác nhau từ tập dữ liệu khác nhau Hàm reduce cũng chạy song song, mỗi reducer xử lý một tập khóa
khác nhau Tất cả các giá trị được xử lý một cách độc lập Và giai đoạn reduce chỉ bắt đầu khi giai đoạn map kết thúc
Trang 10Hình 1 Mô hình làm việc của một công việc MapReduce
MapRedue định nghĩa dữ liệu (cấu trúc và không cấu trúc) dưới dạng cặp
khóa/giá trị (key/value) Ví dụ, key có thể là tên của tập tin (file) và value nội dung
của tập tin, hoặc key là địa chỉ URL và value là nội dung của URL,… Việc định nghĩa
dữ liệu thành cặp key/value này linh hoạt hơn các bảng dữ liệu quan hệ 2 chiều truyền
thống (quan hệ cha – con hay còn gọi là khóa chính – khóa phụ)
Để xử lý khối dữ liệu này, lập trình viên viết hai hàm map và reduce Hàm map có input là một cặp (k1, v1) và output là một danh sách các cặp (k2, v2) Chú ý
rằng các input và output keys và values có thể thuộc về các kiểu dữ liệu khác nhau
Như vập hàm map có thể được viết một cách hình thức như sau:
map (k1, v1) -> list (k2, v2) MapReduce sẽ áp dụng hàm map (mà người dùng viết) vào từng cặp (key, value) trong khối dữ liệu vào, chạy rất nhiều phiên bản của map song song với nhau
trên các máy tính của cluster Sau giai đoạn này thì chúng ta có một tập hợp rất nhiều
cặp (key, value) thuộc kiểu (k2, v2) gọi là các cặp (key, value) trung gian MapReduce
cũng sẽ nhóm các cặp này theo từng key, như vậy các cặp (key, value) trung gian có
cùng k2 sẽ nằm cùng một nhóm trung gian
Phân vùng 1
Phân vùng 2
Phân vùng 3
Dữ liệu đầu vào
Sắp xếp
và xáo trộn
Phân vùng 1
Phân vùng 3
Giai đoạn Reduce
Dữ liệu đầu ra
Trang 11Giai đoạn hai MapReduce sẽ áp dụng hàm reduce (mà người dùng viết) vào
từng nhóm trung gian Một cách hình thức, hàm này có thể mô tả như sau:
reduce (k2, list (v2)) -> list (v3) Trong đó k2 là key chung của nhóm trung gian, list(v2) là tập các values trong nhóm, và list(v3) là một danh sách các giá trị trả về của reduce thuộc kiểu dữ liệu v3
Do reduce được áp dụng vào nhiều nhóm trung gian độc lập nhau, chúng lại một lần
nữa có thể được chạy song song với nhau
1.1.2 Ưu điểm của mô hình MapReduce
MapReduce được xây dựng từ mô hình lập trình hàm và lập trình song song
Nó giúp cải thiện tốc độ tính toán trên tập dữ liệu lớn bằng cách tăng tốc độ đọc ghi và
xử lý dữ liệu
Mô hình MapReduce có thể áp dụng hiệu quả có nhiều bán toán Mô hình này làm ẩn đi các chi tiết cài đặt và quản lý như:
Quản lý tiến trình song song và phân tán
Quản lý, sắp xếp lịch trình truy xuất I/O
Theo dõi trạng thái dữ liệu
Quản lý số lượng lớn dữ liệu có quan hệ phụ thuộc nhau
Xử lý lỗi
Cung cấp mô hình lập trình đơn giản
Các ứng dụng viết bằng MapReduce có tính linh hoạt, khả năng mở rộng tốt
1.1.3 Nguyên tắc hoạt động của mô hình MapReduce
Trang 12Hình 2 Quy trình xử lý của MapReduce
MapReduce đƣợc xây dựng từ mô hình lập trình hàm và lập trình song song Tăng tốc
độ thực thi xử lý dữ liệu là mục đích quan trọng nhất của MAPREDUCE Quy trình này gồm
void map (String name, String line):
// name: document name // document: line contents for each word w in line:
EmitIntermediate (w, "1");
Hàm Reduce:
void reduces (String word, Iterator partialCounts):
// word: a word
Trang 13// partialCounts: a list of aggregated partial counts int result = 0;
for each pc in partialCounts:
result += ParseInt (pc);
Emit (AsString (result));
(1): Thư viện MapReduce mà chương trình người dùng (User Program) sử dụng chia các tập tin đầu vào (dữ liệu cần xử lý) thành các phần nhỏ Dung lượng mỗi phần từ 16 megabytes đến 64 megabytes (MB) Và sau đó sao chép chương trình thành các tiến trình song song chạy trên các máy tính phân tán chứa dữ liệu
(2): Chương trình điều khiển Master sẽ gán mỗi phần dữ liệu cho một hàm Map và một hàm Reduce
(3) – (4): worker là phần được gán một hàm Map và Reduce để xử lý, nó sẽ đọc dữ liệu, phân tích cặp key/value ở đầu vào và phân tích thành các cặp trung gian khác được lưu tại vùng nhớ đệm
(5): Định kỳ, các cặp dữ liệu trung gian sẽ được đẩy đến các worker tương ứng (do master điều khiển) để hàm reduce xử lý Các thuật toán sắp xếp, so sánh, phân vùng dữ liệu sẽ được sử dụng tại giai đoạn này Các tập dữ liệu trung gian có cùng key sẽ được sắp xếp cùng một nhóm
(6): Khi tất cả các tác vụ Map và Reduce đã hoàn tất thì sẽ cho ra kết quả cuối cùng của quy trình MapReduce
1.2 Apache Hadoop
1.2.1 Giới thiệu tổng quát về Apache Hadoop
Sau khi giới thiệu mô hình toàn MapReduce, thì Google cũng nhanh chóng triển khai
mô hình toán và áp dụng nó vào các công việc xử lý của mình Thấy được tiềm năng to lớn của MapReduce, Apache đã phát triển hệ thống mã mở Hadoop cũng với nhân là khung phần mềm MapReduce Nó chạy trên môi trường Unix, và được thiết kế để hỗ trợ các ứng dụng sử dụng được số lượng lớn dữ liệu cấu trúc và phi cấu trúc Hệ thống phần mềm mã mở này được tối ưu cho tính tin cậy, khả năng mở rộng và tính toán phân tán
Không giống như các hệ quản trị cơ sở dữ liệu truyền thống, Hadoop được thiết kế để làm việc với nhiều loại dữ liệu và dữ liệu nguồn Công nghệ HDFS của Hadoop cho phép khối lượng lớn công việc được chia thành các khối dữ liệu nhỏ hơn được nhân rộng và phân phối trên các phần cứng của một cluster để xử lý nhanh hơn Công nghệ này đã được sử dụng rộng rãi bởi một số trang web lớn nhất thế giới, chẳng hạn như Facebook, eBay, Amazon, Baidu, và Yahoo Các nhà quan sát nhấn mạnh rằng Yahoo là một trong những nhà đóng góp lớn nhất đối với Hadoop
Trang 141.2.2 Ưu điểm của Apache Hadoop
Thư viện phần mềm Apache Hadoop là một framework cho phép các xử lý phân tán các tập dữ liệu lớn trên các cụm nhiều máy tính sử dụng sử dụng mô hình lập trình đơn giản
Nó được thiết kế để mở rộng từ một vài máy chủ đơn đến hàng ngìn máy tính, mà mỗi mày đều cung cấp một đơn vị lưu trữ và tính toán Thay vì dựa trên các máy tính có độ tin cậy cao, thì cái thư viện được thiết kế để tự nó phát hiện và xử lý lỗi ở tầng ứng dụng, do đó nó dung cấp một dịch vụ có độ tin cậy cao trên cụm nhiều máy tính mà mỗi máy đều có thể bị lỗi
1.2.3 Các thành phần trong dự án Apache Hadoop
Dự án Apache MapReduce bao gồm các dự án nhỏ sau:
Hadoop Common: là các tiện ích phổ biến hỗ trợ các dự án nhỏ khác của
Hadoop
Hadoop Distributed File System (HDFS™): là một hệ thống file phân tán
cung cấp truy cập thông lượng cao vào dữ liệu ứng dụng
Hadoop MapReduce: Là một mô hình phần mềm cho việc xử lý phân tán các
tập dữ liệu lớn trên ác cụm máy tính
Các dự án khác có liên quan đến Hadoop tại Apache
Avro™: hệ thống dữ liệu tuần tự
Cassandra™: Cơ sở dữ liệu đa master có khả năng mở rộng mà không dính
phải lỗi
Chukwa™: Hệ thống thu thập dữ liệu để quản lý hệ thống phân tán lớn
HBase™: Cơ sở dữ liệu có khả năng mở rộng và phân tán mà hỗ trợ lưu trữ
dữ liệu có cấu trúc cho các bản lớn
Hive™: Hạ tầng kho dữ liệu (data warehouse), cung cấp tổng hợp dữ liệu và
truy vấn tình thế (ad-hoc)
Mahout™: thư viện học máy và khai phá dữ liệu có khả năng mở rộng
1.2.4 Nguyên tắc hoạt động của Hadoop MapReduce
Hadoop chia đầu vào cho mỗi công việc MapReduce vào các mảnh (piece) có
kích thước cố định gọi là các input split hoặc là các split Hadoop tạo ra một task map cho mỗi split, cái chạy mỗi nhiệm vụ map do người sử dụng định nghĩa cho mỗi bản
ghi (record) trong split
Có rất nhiều các split, điều này có nghĩa là thời gian xử lý mỗi split nhỏ hơn so với thời gian xử lý toàn bộ đầu vào Vì vậy, nếu chúng ta xử lý các split một cách song song, thì quá trình xử lý sẽ cân bằng tải tốt hơn, nếu các split nhỏ, khi đó một chiếc máy tính nhanh có thể xử lý tương đương nhiều split trong quá trình thực hiện công việc hơn là một máy tính chậm Ngay cả khi các máy tính giống hệt nhau, việc xử lý
Trang 15không thành công hay các công việc khác đang chạy đồng thời làm cho cần bằng tải như mong muốn, và chất lượng của cân bằng tải tăng như là chia các splits thành các phần nhỏ hơn
Mặt khác, nếu chia tách quá nhỏ, sau đó chi phí cho việc quản lý các split và của tạo ra các map task bắt đầu chiếm rất nhiều tổng thời gian của quá trình xử lý công việc Đối với hầu hết công việc, kích thước split tốt nhất thường là kích thước của một block của HDFS, mặc định là 64MB, mặc dù nó có thể thay đổi được cho mỗi cluster ( cho tất cả các file mới được tạo ra) hoặc định rõ khi mỗi file được tạo ra
Hadoop làm tốt nhất các công việc của nó khi chạy các map task trên một node khi mà dữ liệu đầu vào của nó cư trú ngay trong HDFS Nó được gọi là tối ưu hóa dữ
liệu địa phương Các map task ghi đầu ra của chúng trên đĩa cụ bộ, không phải là vào
HDFS
Khi “chạy Hadoop” có nghĩa là chạy một tập các trình nền - daemon, hoặc các chương trình thường trú, trên các máy chủ khác nhau trên mạng của bạn Những trình nền có vai trò cụ thể, một số chỉ tồn tại trên một máy chủ, một số có thể tồn tại trên nhiều máy chủ Các daemon bao gồm[6]:
DataNode
Mỗi máy slave trong cluster của bạn sẽ lưu trữ (host) một trình nền DataNode
để thực hiện các công việc nào đó của hệ thống file phân tán - đọc và ghi các khối HDFS tới các file thực tế trên hệ thống file cục bộ (local filesytem) Khi bạn muốn đọc hay ghi một file HDFS, file đó được chia nhỏ thành các khối và NameNode sẽ nói cho các client của bạn nơi các mỗi khối trình nền DataNode sẽ nằm trong đó Client của
Trang 16bạn liên lạc trực tiếp với các trình nền DataNode để xử lý các file cục bộ tương ứng với các block Hơn nữa, một DataNode có thể giao tiếp với các DataNode khác để nhân bản các khối dữ liệu của nó để dự phòng
Secondary NameNode
Các Secondary NameNode (SNN) là một trình nền hỗ trợ giám sát trạng thái của các cụm HDFS Giống như NameNode, mỗi cụm có một SNN, và nó thường trú trên một máy của mình Không có các trình nền DataNode hay TaskTracker chạy trên cùng một server SNN khác với NameNode trong quá trình xử lý của nó không nhận hoặc ghi lại bất cứ thay đổi thời gian thực tới HDFS Thay vào đó, nó giao tiếp với các NameNode bằng cách chụp những bức ảnh của siêu dữ liệu HDFS (HDFS metadata) tại nhưng khoảng xác định bởi cấu hình của các cluster
JobTracker
Trình nền JobTracker là một liên lạc giữa ứng dụng của bạn à Hadoop Một khi bạn gửi mã nguồn của bạn tới các cụm (cluster), JobTracker sẽ quyết định kế hoạch thực hiện bằng cách xác định những tập tin nào sẽ xử lý, các nút được giao các nhiệm vụ khác nhau, và theo dõi tất cả các nhiệm vụ khi dúng đang chạy Nếu một nhiệm vụ (task) thất bại (fail), JobTracker sẽ tự động chạy lại nhiệm vụ đó, có thể trên một node khác, cho đến một giới hạn nào đó được định sẵn của việc thử lại này
Chỉ có một JobTracker trên một cụm Hadoop Nó thường chạy trên một máy chủ như là một nút master của cluster
TaskTracker
Như với các trình nền lưu trữ, các trình nền tính toán cũng phải tuân theo kiến trúc master/slave: JobTracker là giám sát tổng việc thực hiện chung của một công việc MapRecude và các taskTracker quản lý việc thực hiện các nhiệm vụ riêng trên mỗi node slave Hình 2.2 minh họa tương tác này
Mỗi TaskTracker chịu trách nhiệm thực hiện các task riêng mà các JobTracker giao cho Mặc dù có một TaskTracker duy nhất cho một node slave, mỗi TaskTracker
có thể sinh ra nhiều JVM để xử lý các nhiệm vụ Map hoặc Reduce song song
Một trong những trách nhiệm của các TaskTracker là liên tục liên lạc với JobTracker Nếu JobTracker không nhận được nhịp đập từ một TaskTracker nào đó trong vòng một lượng thời gian đã quy định, nó sẽ cho rằng TaskTracker đã bị treo (cashed) và sẽ gửi lại nhiệm vụ tương ứng cho các nút khác trong cluster
Trang 17Hình 3 Tương tác giữa JobTracker và TaskTracker Sau khi client gọi JobTracker bắt đầu công việc
xử lý dữ liệu, các phân vùng JobTracker làm việc và giao các nhiệm vụ Map và Recude khác nhau cho
mỗi TaskTracker trong cluster
Hình 4 Cấu trúc liên kết của một nhóm Hadoop điển hình Đó là một kiến trúc master/slave trong đó
NameNode và JobTracker là Master và DataNode & TaskTracker là slave
Trang 18CHƯƠNG II LẬP TRÌNH CƠ BẢN VỚI MÔ HÌNH
TOÁN MAPREDUCE VÀ HADOOP
Trong chương này, em sẽ giới thiệu về cách ta tạo ra một ứng dụng MapReduce cơ bản, sử dụng java API của Apache Hadoop Ngoài ra, em cũng trình bày thêm các thư viện
mà Hadoop cung cấp để thao tác với hệ thống file của mình
2.1 Phương pháp viết một MapReduce job
MapReduce job là một đơn vị của công việc (job) mà khách hàng muốn được thực hiện: nó bao gồm dữ liệu đầu vào, chương trình MapReduce, và thông tin cấu hình Hadoop chạy các công việc này bằng cách chia nó thành các nhiệm vụ (task), trong đó có hai kiểu chính là: các nhiệm vụ map (map task) và các nhiệm vụ reduce (reduce task)[6]
Trong phần này em sẽ nói chi tiết hơn về từng giai đoạn trong chương trình MapReduce điển hình Hình 5 biểu diễn biểu đồ cao cấp của toàn bộ quá trình, và xem xét cụ thể từng phần:
Hình 5 Biểu đồ phân cấp quả quá trình
MapReduce
Trang 192.1.1 Các kiểu dữ liệu mà Hadoop hỗ trợ
MapReduce framework có một các định nghĩa cặp khóa key/value tuần tự để
có thể di chuyển chúng qua mạng, và chỉ các lớp hỗ trợ kiểu tuần tự
Cụ thể hơn, các lớp mà implement giao diện Writable có thể làm value, và các lớp mà implement giao diện WritableComparable<T> có thể làm cả key và
value Lưu ý rằng giao diện WritableComparable<T> là một sự kết hợp của
Writable và giao diện java.lang.Comparable<T> Chúng ta cần yêu cầu so sánh các khóa bởi vì chúng sẽ được sắp xếp ở giai đoạn reduce, trong khi giá trị thì đơn giản được cho qua
Hadoop đi kèm một số lớp được định nghĩa trước mà implement
WritableComparable, bao gồm các lớp bao cho tất cả các loại dữ liệu cơ bản như trong bảng 1 sau:
BooleanWritable Lớp bao (wapper) của biến kiểu Boolean chuẩn
ByteWritable Lớp bao của biến kiểu byte đơn
DoubleWritable Lớp bảo của biến kiểu Double
FloatWritable Lớp bao của biến kiểu Float
IntWritable Lớp bao của biến kiểu Integer
LongWritable Lớp bao của biến kiểu Long
Text Lớp bao của biến kiểu văn bản định dạng UTF-8
NullWritable Lớp để giữ chỗ khi mà key hoặc value không cần thiết
Bảng 1 Danh sách các kiểu dữ liệu cơ bản của Hadoop
Chúng ta cũng có thể tùy chỉnh một kiểu dữ liệu bằng cách implement
Writable (hay WritableComparable<T>) Như ví dụ sau, lớp biểu diễn các cạnh trong mạng, như đường bay giữa hai thành phố:
Trang 20private String departureNode; //Node khoi hanh
private String arrivalNode; //Node den
public String getDepartureNode(){
public int compareTo(Edge o) {
return (departureNode.compareTo (o.departureNode)!= 0)?
Nó trả lại giá trị -1, 0, +1
Với kiểu dữ liệu được định nghĩa tại giao diện, chúng ta có thể tiến hành giai đoạn đầu tiên của xử lý luồng dữ liệu như trong hình 5 - mapper
2.1.2 Mapper
Để tạo ra một Mapper, thì lớp này implements từ interface Mapper và kế thừa
từ lớp MapReduceBase [5] Lớp MapReduceBase, đóng vai trò là lớp cơ sở cho cả
mapper và reducer Nó bao gồm hai phương thức hoạt động hiệu quả như là hàm khởi tạo và hàm hủy của lớp:
Trang 21void configure(JobConf job) – trong hàm nay, bạn có thể trích xuất các thông số cài đặt hoặc bằng các file XML cấu hình hoặc trong các lớp chính của ứng dụng của bạn Gọi cái hàm này trước khi xử lý dữ liệu
void close() – Như hành động cuối trước khi chấm dứt nhiệm vụ map, hàm này nên được gọi bất cứ khi nào kết thúc – kết nối cơ sở dữ liệu, các file đang mở
Giao diện Mapper chịu trách nhiệm cho bước xử lý dữ liệu Nó sử dụng Java Generics của mẫu Mapper<K1, V1, K2, V2> chỗ mà các lớp key và các lớp value
mà implements từ interface WriteableComparable và Writable Phương pháp duy nhất của nó để xử lý các cặp (key/value) như sau:
void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter
reporter) throws IOException
Phương thức này tạo ra một danh sách (có thể rỗng) các cặp (K2, V2) từ một cặp đầu vào (K1, V1) OuputCollector nhận kết quả từ đầu ra của quá trình mapping, và Reporter cung cấp các tùy chọn để ghi lại thông tin thêm về mapper như tiến triển công việc
Hadoop cung cấu một vài cài đặt Mapper hữu dụng Bạn có thể thấy một vài cái như trong bản 3.2 sau:
IdentityMapper<K,V> Với cài đặt Mapper <K, V, K, V> và ánh xạ đầu vào trực
tiếp vào đầu ra
InverseMapper<K,V> Với cài đặt Mapper<K, V, V, K> và đảo ngược cặp (K/V)
RegexMapper<K> Với cài đặ Mapper<K, Text, Text, LongWritable> và
sinh ra cặp (match, 1) cho mỗi ánh xạ biểu thức phù hợp
TokenCountMapper<K> Với cài đặt Mapper<K, Text, Text, LongWritable> sinh
ra một cặp (token, 1) khi một giá trị đầu vào là tokenized
Bảng 2 Một vài lớp thực hiện Mapper được định nghĩa trước bởi Hadoop
2.1.3 Reducer
Với bất cứ cài đặt Mapper, một reducer đầu tiên phải mở rộng từ lớp MapReduce base để cho phép cấu hình và dọn dẹp Ngoài ra, nó cũng phải implement giao diện Reducer chỉ có một phương thức duy nhất sau:
void reduce(K2 key, Iterator<V2> values,OutputCollector<K3,V3> output, Reporter reporter) throws IOException
Khi nhận được các task từ đầu ra của các Mapper khác nhau, nó sắp xếp các dữ liệu đến theo các khóa của các cặp (key/value) và nhóm lại các giá trị cùng khóa
Trang 22Hàm reduce() được gọi sau đó, nó sinh ra một danh sách (có thể rỗng) các cặp (K3, V3) bằng cách lặp lại trên các giá trị được liên kết với khóa đã cho
OutputCollector nhận từ đầu ra của quá trình reduce và ghi nó ra đầu ra file
Reporter cung cấp tùy chọn ghi lại thông tin thêm về reducer như là một tiến triển công việc
Bảng 3.3 liệt kê một vài reducer cơ bản được triển khai cung cấp bởi Hadoop
IdentityReducer<K, V> Với cài đặt Reducer <K, V, K, V> và ánh xạ đầu vào trực
tiếp vào đầu ra
LongSumReducer<K>
Với cài đạt Reducer <K, LongWritable, K, LongWritable>
và quyết định thổng hợp tất cả các giá trị tương tứng với các key đã cho
Bảng 3 Danh sách một số reducer cơ bản được triển khai cung cấp bởi Hadoop
2.2 Hadoop I/O
Trong phần này em sẽ nói về cách mà MapReduce đọc dữ liệu vào và ghi dữ liệu
ra Trong phần này em tập trung vào giới thiệu các định dạng file mà nó sử dụng Để cho phép dễ dàng xử lý phân tán, MapReduce làm một số giả định về dữ liệu mà nó xử lý Nó cung cấp một cách linh hoạt trong việc xử lý với rất nhiều định dạng dữ liệu khác nhau
Dữ liệu đầu vào thường là các tập tin lớn, có thể đến hàng chục hoặc hàng trăm gigabyte và cũng có thể nhiều hơn Một trong những nguyên tắc cơ bản của xử lý
MapReduce là sự phân tách dữ liệu đầu vào thành các khối (chucks) Chúng ta có thể xử
lý các khối này một cách song song sử dụng nhiều máy tính khác nhau Trong Hadoop
thuật ngữ “khối” này được gọi là “input splits”
Việc quản lý truy cập và phân chia các khối nêu trên được Hadoop hỗ trợ Và nó được phát triển như một dự án con của Hadoop đó là Hệ thống file HDFS Phần tiếp theo
sẽ nói chi tiết hơn về các định dạng file mà HDFS hỗ trợ:
Trang 23- KeyValueTextInputFormat: Mỗi dòng trong file text là một record Kí tự phân chia đầu tiên trên mỗi dòng Tất cả mọi thứ phía trước dấu phân chia la khóa và sau phân chia là value Phân chia được thiết lập bởi thuộc tính
key.value.separator.input.line, và nó mặc định là dấu tab (\t)
o Key: Text
o Value: Text
- SequenceFileInputFormat<K,V>: Một InputFormat để đọc các file tuần tự (sequence files) Key và value được người sử dụng định nghĩa Sequence file là một dạng file nhị phân nén đặc biệt của hadoop Nó tối ưu cho truyền dữ liệu giữa đầu ra của một MapReduce job tới đầu vào của một MapReduce job khác
o Key: K (người sử dụng định nghĩa)
o Value: V (người sử dụng định nghĩa)
- NlineInputFormat : Giống như TextInputFormat, nhưng mỗi split được đảm
mapred.line.input.format.linespermap , với mặc định là 1, để thiết lập N
o Key: LongWritable
o Value: Text
KeyValueTextInputFormat được sử dụng trong các tập tin đầu vào có cấu trúc hơn, khi mà một ký tự được định nghĩa trước, thường là một dấu tabl (\t), phân cách key và value của mỗi dòng (record)
Ví dụ:
17:16:18 http://hadoop.apache.org/core/docs/r0.19.0/api/index.html
17:16:19 http://hadoop.apache.org/core/docs/r0.19.0/mapred_tutorial.html 17:16:20 http://wiki.apache.org/hadoop/GettingStartedWithHadoop
TextInputFormat bởi vì key là một số lệch (offset) Khi sử dụng
KeyValueTextInputFormat, cả key và value sẽ là Text, và bạn sẽ phải thay đồi implement của Mapper và phương thức map() để làm việc với kiểu dữ liệu mới của key
Dữ liệu đầu vào cho job MapReduce của chúng ta không nhất thiết phải là dữ liệu bên ngoài Trên thực tế, nó thường là các trường hợp mà đầu vào của một job MapReduce là đầu ra của một job MapReduce khác Như chúng ta thấy, bạn cũng có thể tùy chỉnh định dạng đầu ra Mặc định định dạng đầu ra viết cùng định dạng
Trang 24Hadoop cung cấp một định dạng file nén nhị phân hiệu quả hơn được gọi là sequence file Cái sequence file này là tối ưu cho xử lý Hadoop và là định dạng ưa thích khi xử
lý nhiều công việc MapReduce Lớp InputFormat để đọc sequen file là
SequenceFileInputFormat Kiểu đối tượng của key và value trong sequence file được định nghĩa bởi người sử dụng Kiểu đầu ra và đầu vaofphair giống nhau, và cái implement Mapper của bạn và phương thức map() để sử dụng được đúng loại đầu vào
2.2.2 OutputFormat
Dữ liệu đầu ra của MapReduce vào trong các file sử dụng lớp OutputFormat,
nó tương tư như lớp InputFormat Đầu ra thì không được split, mỗi reducer ghi một output của riêng nó Các tập tin đầu ra nằm trong thư mục hiện thời và được đặt tên là
part-nnnnn, trong đó nnnnn là ID vùng của reducer Đối tượng RecordWriter định dạng đầu ra và các RecordReader phân tích định dạng của đầu vào
Hadoop cung cấp một vài Implementation của OutputFormat, như trong bản 3.5 Không ngạc nhiên khi hầu hết chúng đề kế thừa từ lớp trừu tượng
FileOutPutFormat, lớp InputFormat kế thừa từ FileInputFormat Bạn chỉ rõ cái
OutputFormat bằng cách gọi phương thức setOutputFormat() của đối tượng
JobConf chứa cấu hình của job MapReduce của bạn
Chú ý: Bạn có thể tự hỏi tại sao có sự bách biệt giữa OutputFormat (InputFormat) và FileOutputFormat (FileInputFormat) khi giường như tất cả lớp OuputFormat (InputFormat) mở rộng ra FileOutputFormat (FileOutputFormat) Có phải lớp OutputFormat (InputFormat) rằng không làm việc với file? Vâng, lớp NullOutputFormat thực hiện OutputFormat trong một cách bình thường và nó không cần tới phân lớp FileOutputFormat Quan trọng hơn, có các lớp OutputFormat (InputFormat) mà làm việc với cơ sở dữ liệu hơn là các file, các lớp này ở trong một ngành riêng biệt trong hệ thống phân cấp lớp từ
FileOutputFormat (FileInputFormat) Các lớp đó có các ứng dụng đặc biệt, và reader quan tâm có thể đào sau hơn nữa trong các tài liệu java trực tuyến cho
Trong trường hợp đó key trong cặp key/value không được ghi ra, và cũng không có kí
tự phân cách Nếu bạn muốn chặn hoàn thiện đầu ra, thì bạn nên sử dụng
NullOutputFormat Việc ngăn chặn đầu ra của Hadoop sẽ hữu dụng nếu reducer của
Trang 25bạn ghi đầu ra của nó theo một cách riêng của bạn và không cần Hadoop ghi thêm gì
Đối với một số ứng dụng, ta cần có một cấu trúc dữ liệu đặc biệt nào đó để tổ chức
dữ liệu của mình Với việc thực hiện xử lý dựa trên MapReduce, đặt mỗi phần tử dữ liệu nhị phân vào trong các file riêng của mình là không khả thi, vì vậy Hadoop đã phát triển một số container cao cấp hơn cho tình huống này Và trong phần này em giới thiệu một container thường được dùng nhiểu nhất đó là SequenceFile
Trong một logfile, mơi mà mỗi bản ghi nhật kí là một dòng text Nếu muốn ghi nhật ký kiểu nhị phân, văn bản đơn giản không phải là một định dạng phù hợp Lớp SequenceFile của Hadoop phù hợp với luật trong tình huống này, cung cấp một cấu trúc
dữ liệu cặp key-value nhị phân Để sử dụng nó như là một định dạng logfile, bạn cần phải chọn một khóa, giống như nhãn thời gian được biểu diễn bởi LongWriteable, và value là một Writeable đại diện cho số lượng được ghi lại
SequenceFile cũng làm việc như là container cho các file nhỏ hơn HDFS và MapReduce được tối ưu cho các file lớn, do đó các file được đóng gói vào trong SequenceFile làm cho việc lưu trữ và xử lý các tập tin nhỏ hiệu quả hơn
Việc đọc và ghi SequenceFile mời xem phần Phụ lục
Trang 26CHƯƠNG III SỬ DỤNG MƠ HÌNH MAPREDUCE ĐỂ SONG SONG HĨA MỘT SỐ THUẬT TỐN CỤ THỂ
Trong hai chương trước, em đã giới thiệu về MapReduce, các thức chung để áp dụng
nĩ cho các thuật tốn Và em cũng giới thiệu cách áp dụng mơ hình này cho bài tốn đếm từ đơn giản
Trong chương này, em sẽ trình bày cách áp dụng mơ hình MapReduce để song song hĩa một số thuật tốn học máy Cụ thể, em sẽ trình bày cách song song hĩa ba thuật tốn k-means, nạve bayes, và LDA trên cơ sở mơ hình do MapReduce quy định
3.1 K-Means
3.1.1 Giới thiệu thuật tốn K-Means
K-means là một trong các thuật tốn phân cụm đơn giản và điển hình nhất
[2]
Thuật tốn phân cụm k-means do MacQueen đề xuất trong lĩnh vực thống kê năm 1967, mục đích của thuật tốn k-means là sinh ra k cụm dữ liệu
từ một tập dữ liệu ban đầu gồm n đối tượng trong khơng gian d chiều
̅̅̅̅̅ , sao cho hàm tiêu chuẩn: đạt giá trị tối thiểu Trong đĩ:
mi là trọng tâm của cụm Ci, D là khoảng cách giữa hai đối tượng
Trọng tâm của một cụm là một vector, trong đĩ giá trị của mỗi phần tử của
nĩ là trung bình cộng các thành phần tương ứng của các đối tượng vector dữ liệu
trong cụm đang xét Tham số đầu vào của thuật tốn là số cụm k, tập CSDL gồm n
phần tử và tham số đầu ra của thuật tốn là các trọng tâm của các cụm dữ liệu Độ
đo khoảng cách D giữa các đối tượng dữ liệu thường được sử dụng dụng là khoảng cách Euclide, bởi vì đây là mơ hình khoảng cách dễ để lấy đạo hàm và xác định các cực trị tối thiểu Hàm tiêu chuẩn và độ đo khoảng cách cĩ thể được xác định cụ thể hơn tuỳ vào ứng dụng hoặc các quan điểm của người dùng
Hình 6 Mơ hình K-means đơn giản
Trang 27INPUT: Một CSDL gồm n đối tượng và số các cụm k
OUTPUT: Các cụm C i (i=1 k) sao cho hàm tiêu chuẩn E đạt giá trị tối thiểu
Bước 1: Khởi tạo
Chọn k đối tượng m j (j=1 k) là trọng tâm ban đầu của k cụm từ tập dữ liệu
(Việc lựa chọn này có thể là ngẫu nhiên hoặc theo kinh nghiệm)
Lặp các bước 2 và 3 cho đến khi các trọng tâm của cụm không thay đổi
Quá trình phân nhóm kết thúc, nếu:
Không có (hoặc có không đáng kể) việc gán lại các ví dụ vào các nhóm khác, hoặc
Không có (hoặc có không đáng kể) thay đổi về các điểm trung tâm (centroids) của các nhóm, hoặc
Giảm không đáng kể về tổng lỗi phân nhóm:
∑ ∑
Trang 28
như phép tính nhân, chia, …Như vậy, do k-means phân tích phân cụm đơn giản nên
có thể áp dụng đối với tập dữ liệu lớn Tuy nhiên, nhược điểm của k-means là chỉ
áp dụng với dữ liệu có thuộc tính số và khám phá ra các cụm có dạng hình cầu, means còn rất nhạy cảm với nhiễu và các phần tử ngoại lai trong dữ liệu Hình sau diễn tả môi phỏng về một số hình dạng cụm dữ liệu khám phá được bởi k-means:
k-Hình 7 k-Hình dạng cụm dữ liệu được khám phá bởi k-means
Hơn nữa, chất lượng của thuật toán k-means phụ thuộc nhiều vào các tham số
đầu vào như: số cụm k và k trọng tâm khởi tạo ban đầu Trong trường hợp, các trọng
tâm khởi tạo ban đầu mà quá lệch so với các trọng tâm cụm tự nhiên thì kết quả phân cụm của k-means là rất thấp, nghĩa là các cụm dữ liệu được khám phá rất lệch so với các cụm trong thực tế Trên thực tế người ta chưa có một giải pháp tối ưu nào để chọn các tham số đầu vào, giải pháp thường được sử dụng nhất là thử nghiệm với các giá trị
đầu vào k khác nhau rồi sau đó chọn giải pháp tốt nhất
3.1.2 MapReduce hóa
Phân tích đặc trưng của k-means
Trong thuật toán k-means trình bày ở trên, phần lớn khối lượng tính toán tập trung ở bước tính khoảng cách từ mỗi điểm (đối tượng) tới các tâm cụm Số lượng đối tượng trong tập dữ liệu càng lớn, thời gian cần cho bước này càng nhiều Bên cạnh đó, có thể nhận thấy việc tính toán khoảng cách từ một điểm tới tâm cụm là độc lập, không phụ thuộc vào điểm khác Vì vậy, việc tính khoảng cách từ các điểm có thể thực hiện song song, đồng thời với nhau
Trang 29 Chiến lược MapReduce hoá
Trong k-means, rõ ràng rằng cách thức của việc tính khoảng cách Euclide giữa các vector với trọng tâm có thể được song song bằng cách phân tách dữ liệu vào các nhóm nhỏ và việc phân cụm sẽ được tách riêng ở mỗi nhóm nhỏ (sử dụng hàm map) Trong tính toán lại các vector trọng tâm mới, ta chia các vector vào các phân nhóm, tính tổng của vector trong từng nhóm nhỏ song song và cuối cùng là hàm reduce sẽ tính tổng chung và tính lại các trọng tâm mới
Vậy giải pháp cụ thể như sau:
Đầu tiên, là việc biểu diễn dữ liệu Dữ liệu được lưu trữ dưới dạng bảng, với mỗi hàng là một vector biể diễn cho một điểm Số cột là số chiều của điểm
Thứ hai, việc lưu trữ phân tán dữ liệu Do các điểm được tính toán độc lập với nhau, nên chúng ta có thể lưu trữ các phần của dữ liệu trên nhiều máy khác nhau để tăng tốc tính toán
Thứ ba, trên mỗi máy tính, trong mỗi vòng lặp, thì mỗi máy cần tính khoảng cách của mỗi điểm trong phần dữ liệu của nó với các trọng tâm, và tính xem nó gần trọng tâm nào nhất, sau đó gửi lại kết quả cho để gộp các điểm thuộc cùng một nhóm để tính lại trọng tâm sau mỗi vòng lặp
Lưu đồ biểu diễn
Trang 30Hình 8 Lưu đồ thuật toán k-means
Khởi tạo trọng các tâm
Xét một điểm, tìm trọng tâm gần nhất
Tính lại các trọng tâm
Xét hết tất cả các điểm
Các trọng tâm hội tụ
Trang 31Hình 9 Lưu đồ MapReduce hoá K-means
Khởi tạo trọng các tâm
Hết tập
dữ liệu 1
Các trọng tâm hội tụ
No
Yes
Kết thúc thuật toán, lưu trọng tâm
No
Yes
Xét một điểm, trong tập dữ liệu 2
Tìm trọng tâm gần nhất
Hết tập
dữ liệu 2 No
Yes
Xét một điểm, trong tập dữ liệu 3
Tìm trọng tâm gần nhất
Hết tập
dữ liệu 3 No
Yes
…
Trang 32 Cụ thể
Sau khi lưu dữ liệu cần phân cụm dưới dạng các bản thì ta cần phải
chuyển dữ liệu sang kiểu key/value làm đầu vào cho thuật tốn
Cùng xem lại mơ hình cơ bản của MapReduce:
map (k1, v1) -> list (k2, v2) reduce (k2, list (v2)) -> list (v3)
Áp dụng cho k-means:
Hàm map:
o Đầu vào: cặp key/value biểu diễn toạ độ của một điểm
k1 là null
v1 là vector biểu diễn toạ độ của một điểm
o Xử lý: tính khoảng cách của điểm với các trọng tâm (chưa phải
là trọng tâm cần tìm)
o Đầu ra:
k2 là số thứ tự của trọng tâm
v2 là toạ độ điểm thuộc trọng tâm k2
Hàm reduce: trước khi xuống hàm reduce, kết quả của hàm map
được xáo trộn lại, các cặp cùng k2, sẽ được gom thành một nhĩm
o Đầu vào:
k2 được chuyển từ hàm map
list(v2) là danh sách các điểm v2 mà nằm trong cụm thứ k2
o Xử lý: tính trung bình cộng của các điểm cùng nhĩm, và cập nhật lại trọng tâm của nhĩm đĩ
o Đầu ra:
list(v3) là danh sách các trọng tâm mới
3.2 Nạve Bayes
3.2.1 Giới thiệu thuật tốn Nạve Bayes cơ bản
Nạve Bayes là phương pháp phân loại dựa vào xác suất được sử dụng rộng rãi trong lĩnh vực học máy, được sử dụng lần đầu tiên trong lĩnh vực phân loại bởi Maron vào năm 1960, sau đĩ trở nên phổ biến trong nhiều lĩnh vực như các cơng cụ tìm kiếm, các bộ lọc mail nĩi riêng và phân loại văn bản nĩi chung[11]
Ý tưởng cơ bản của cách tiếp cận Nạve Bayes là sử dụng xác suất cĩ điểu kiện giữa từ và chủ đề để dự đốn xác suất chủ đề của một văn bản cần phân loại Điểm quan trọng của phương pháp này chính là ở chỗ giả định rằng sự xuất hiện của tất cả các từ trong văn bản đều độc lập với nhau Như thế Nạve bayes khơng khai thác sự phụ thuộc của nhiều từ vào trong một chủ đề cụ thể
Đây là thuật tốn được xem là đơn giản nhất trong các phương pháp Bộ phân lớp Bayes cĩ thể dự báo các xác suất là thành viên của lớp, chẳng hạn xác suất mẫu
Trang 33cho trước thuộc về một lớp xác định Chúng giả định các thuộc tính là độc lập nhau (độc lập điều kiện lớp)
Thuật tốn Nạve Bayes dựa trên định lý Bayes được phát biểu như sau:
| |
Trong đĩ:
Y đại diện một giả thuyết, giả thuyết này được suy luận khi cĩ được chứng cứ mới X
P(X): xác xuất X xảy ra (Xác suất biên duyên của X)
P(Y): xác xuất Y xảy ra (Điều kiện tiên nghiệm của Y)
P(X|Y): xác xuất X xảy ra khi Y xảy ra (xác suất cĩ điều kiện, khả năng của X khi Y đúng)
P(Y|X) : xác suất hậu nghiệm của Y nếu biết X
Áp dụng trong bài tốn phân loại, các dữ kiện cần cĩ :
D: tập dữ liệu huấn luyện đã được vector hố dưới dạng ⃗ (x 1 ,x 2 ,…x n)
C i : tập các tài liệu của D thuộc lớp Ci với i={1,2,3,…}
Các thuộc tính x 1 ,x 2 ,…x n độc lập xác suất đơi một với nhau
Thuật tốn Nạve Bayes cơ bản:
Các bước thực hiện thuật tốn Nạve Bayes:
Bước 1 : Huấn luyện Nạve Nayes (dựa vào tập dữ liệu)
Xét một ví dụ kinh điển là ví dụ dự đốn xem quyết định của người chơi cĩ
đi chơi Tennis hay khơng với các điều kiện về thời tiết đã được biết trước Trong ví
dụ này, ta cĩ một bảng dữ liệu huấn luyện như sau :
Trang 34D6 Rain Cool Normal Strong No
- Với thuộc tính Temp : có các giá trị Hot, Cold, Mild
P(hot|yes) = 2/9 P(hot|no) = 2/5 P(cold|yes) = 3/9 P(cold|no) = 1/5 P(mild|yes) = 4/9 P(mild|no) = 2/5
- Với thuộc tính Humidity : có các giá trị Normal,High
P(normal|yes) = 6/9 P(normal|no) = 1/5
Trang 35P(high|yes) = 3/9 P(high|no) = 4/5
- Với thuộc tính Wind : cĩ các giá trị Weak, Strong
P(weak|yes) = 6/9 P(weak|no) = 2/5 P(strong|yes) = 3/9 P(strong|no) = 3/5
X new thuộc vào lớp No
Thuật tốn Nạve Bayes áp dụng trong phân loại văn bản
Để áp dụng thuật tốn Nạve Bayes vào phân loại văn bản, ta cần thực hiện các bước tiền xử lý và vector hố các văn bản trong tập huấn luyện Các phương pháp tiền xử lý và vector hố đã được trình bày ở những phần trước Tuy nhiên, do thuật tốn Nạve Bayes dựa trên xác suất văn bản và xác suất đặc trưng, do đĩ ở phương pháp này, chúng ta sẽ sử dụng phương pháp vector hố bằng cách đếm tần suất từ (Word frequency weighting)
Sau khi đã vector hố các văn bản, ta cần thực hiện rút chọn các đặc trưng cho các văn bản huấn luyện Ta cũng cĩ rất nhiều cách để thực hiện rút chọn đặc trưng như sử dụng các độ đo, sử dụng Heuristic, sử dụng từ điển…
Sau khi đã rút chọn đặc trưng, ta sẽ thực hiện thuật tốn huấn luyện Ta cĩ thể tĩm tắt các bước như sau :
Bước 1: Huấn luyện
- Từ tập huấn luyện, ta rút trích tập từ vựng (các đặc trưng)
- Tính xác suất P(C i ) và P(x k |C i )
| |
docs i : số tài liệu của tập huấn luyện thuộc lớp c i
total#documents: số tài liệu cĩ trong tập huấn luyện
| | hoặc |
| |
(làm mịn với luật Laplace)
n : tổng số từ đơi một khác nhau của lớp ci
Trang 36Bộ từ vựng (đặc trƣng) : var, bit, chip, log
Bước 1: Huấn luyện
Tính xác xuất các lớp Ci trong tập huấn luyện
Tính xác xuất P(xk|Ci)
Lớp C1= “Comp” Tổng = 208 |
|
|
|
Lớp C2 = “Math” Tổng = 388
Trang 37|
|
|
|
Bước 2: Bước phân lớp với vecto đặc trưng sau:
Docnew=(23, 40, 15, 50) Xác định cho văn bản mới?
Phân tích đặc trưng của Nạve bayes
Cũng tương tự như thuật tốn k-means, Nạve bayes cũng cĩ vấn đề khi xử lý lượng dữ liệu lớn Trong quá trình học (trainning) mà số lượng dữ liệu quá lớn, dẫn đến các vấn đề về thiếu bộ nhớ, tốc độ xử lý Với lượng dữ liệu lớn (khoảng vài triệu bản ghi) thì hầu hết thời gian của Nạve bayes hầu hết là để đếm số lần xuất hiện của các biến, thơng qua đĩ tính các xác suất cần thiết để xây dựng mơ hình
Cơng việc mất thời gian chủ yếu, khi huấn luyện Nạve Bayes, là tính ba xác suất sau:
P(Ci)
P(xk|Ci) Trong đĩ, đề tính xác xuất P(xk|Ci) ta cần tính thêm tổng số từ thuộc kiểu Ci
Do đĩ, chúng ta phải đếm ba lần
Chiến lược MapReduce hố
Cĩ nhiều cách khác nhau để áp dụng mơ hình tốn MapReduce vào trong thuật tốn Nạve Bayes Đầu tiên, chúng ta cĩ thể dùng ba lần MapReduce để đến ba xác
Trang 38suất tương ứng Nhưng việc này tốt ở chỗ có thể chạy song song cả ba job MapReduce một lúc Tuy vậy chúng có thể dẫn đến xung đột tài nguyên vì nó cùng truy cập vào cùng một file
Cách thứ hai, sử dụng cả ba biến đếm một lúc, để đếm cho ba xác suất Tuy
vậy, đầu vào và đầu ra của hàm map và reduce chỉ có 1 kiểu key/value, do đó chúng ta phải tuỳ biến kiểu dữ liệu của key/value khác với các kiểu cơ bản như đã nhắc ở thuật
toán k-means
Dễ thấy, việc tính các xác xuất là độc lập, nên chúng ta chia dữ liệu thành nhiều phần nhỏ, sau đó các đếm các số lần xuất hiện của từng biến trong hàm map, sau
đó tập hợp kết quả và tính các xác xuất trong hàm reduce
Lưu đồ biểu diễn
Hình 10 Lưu đồ thuật toán Naive Bayes
Khởi tạo các biến đếm
Lấy một văn bản từ tập tất cả văn bản
Tăng các biến đếm tương ứng cho văn
Trang 39Hình 11 Lưu đồ MapReduce hoá Naive Bayes
Khởi tạo các biến đếm
Tăng các biến đếm tương ứng cho văn bản.
Hết tập văn bản thứ 2
Lấy một văn bản từ tập văn bản thứ 3
Tăng các biến đếm tương ứng cho văn bản.
Hết tập văn bản thứ 3