Đánh giá dựa trên một lượng lớn dữ liệu đã tạo ra cái nhìn sâu sắc hơn và mở ra những cơ hội hấp dẫn mới trong thương mại điện tử, khoa học và các ứng dụng tính toán.. MapReduce là một m
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CÔNG NGHỆ THÔNG TIN
Nha Trang, tháng 6 năm 2011
LUẬN VĂN TỐT NGHIỆP
Trang 21
TÓM TẮT
Sự phát triển nhanh chóng của công nghệ thông tin đã tạo ra một lượng dữ liệu lớn
và đặt ra những thách thức trong việc xử lý chúng Đánh giá dựa trên một lượng lớn
dữ liệu đã tạo ra cái nhìn sâu sắc hơn và mở ra những cơ hội hấp dẫn mới trong thương mại điện tử, khoa học và các ứng dụng tính toán Xử lý lượng dữ liệu lớn cho các công việc trên cần phải có những cụm máy tính lớn Chính vì thế, mô hình xử lý phân tán đang trở nên quan trọng trong sự phát triển của công nghệ thông tin hiện nay MapReduce là một mô hình lập trình để biểu diễn các tính toán phân tán trên tập
dữ liệu lớn và là bộ khung thực thi (execution framework) để xử lý dữ liệu lớn trên các cụm máy chủ bình thường (clusters of commodity servers) Mô hình lập trình MapReduce cung cấp một mức trừu tượng dễ hiểu cho việc thiết kế các thuật toán có thể mở rộng, trong khi bộ khung thực thi xử lý trong suốt các chi tiết ở mức hệ thống,
từ việc lập lịch đến việc xử lý lỗi
MapReduce được Google phát triển đầu tiên và được sử dụng rộng rãi thông qua cài đặt mã nguồn mở Hadoop – được phát triển bởi Yahoo (nay là một dự án Apache) Hiện nay Mapreduce được nhiều công ty ứng dụng như: Google, Yahoo, Amazone,… cũng như được các nhóm nghiên cứu quan tâm phát triển
Một vài ví dụ về dữ liệu lớn: Google xử lý 20 PB một ngày (2008), Facebook có 2.5 PB dữ liệu người dùng và tăng thêm 15 TB/ngày (4/2009) , eBay có 6.5 PB dữ liệu người dùng và tăng thêm 50 TB/ngày (5/2009)
Trong nghiên cứu khoa học, các tập dữ liệu hàng Petabyte cũng đang trở nên bình thường Ví dụ: Viện Large Hadron Collider (LHC) gần Geneva mô phỏng vụ nổ Big Bang, khi hoạt động sẽ tạo ra 15 PB/ năm Các nhà thiên văn học Chile đang tạo chiếc camera 3.2 Gigapixel, khi hoạt động sẽ tạo ra khoảng nửa Petabyte dữ liệu ảnh trong một tháng
Xử lý dữ liệu lớn nằm ngoài khả năng của của một máy và đòi hỏi phải có các cụm máy tính – có nghĩa các bài toán dữ liệu lớn chính là việc tổ chức tính toán trên hàng chục, trăm hay cả nghìn máy tính Đó chính là những gì MapReduce làm
Khóa luận này sẽ giới thiệu tổng quát về tính toán đám mây, cơ bản về MapReduce và thiết kế thuật toán trong MapReduce, một cài đặt mã nguồn mở của MapReduce là Hadoop Đồng thời khóa luận cũng giới thiệu về phần mềm mã nguồn
mở Lucene, Solr và Nutch và minh họa hoạt động của MapReduce thông qua ứng dụng tìm kiếm truyện tranh
Trang 32
LỜI CẢM ƠN
Trước hết tôi xin bày tỏ lòng cảm ơn đến quý thầy cô thuộc khoa Công nghệ thông tin trường Đại học Nha Trang đã tận tình dạy dỗ và truyền đạt cho tôi nhiều kiến thức quý báu trong suốt bốn năm qua
Đặc biệt, tôi xin tỏ lòng biết ơn xâu sắc đến thầy Huỳnh Tuấn Anh, người đã trực tiếp gợi ý, hướng dẫn và tận tình truyền đạt nhiều kinh nghiệm để tôi có thể thực hiện
và hoàn thành đề tài này
Tôi cũng xin gửi tất cả lòng biết ơn sâu sắc đến cha mẹ, cùng toàn thể gia đình, những người nuôi dạy tôi trưởng thành như ngày hôm nay, đồng thời cũng giúp đỡ, chăm sóc tôi trong suốt quá trình thực hiện đề tài
Cuối cùng, tôi xin cảm ơn những người bạn đã luôn động viên và cổ vũ để tôi có thể hoàn thành tốt đề tài này
Trang 43
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Trang 5
4
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
Trang 6
5
MỤC LỤC
Nội dung:
1 Giới thiệu 11
1.1 Cloud Computing 11
Định nghĩa 11
1.1.1 Các đặc trưng của tính toán đám mây 12
1.1.2 Các mô hình dịch vụ của tính toán đám mây 13
1.1.3 Các lợi ích của tính toán đám mây 17
1.1.4 Ảnh hưởng của sự phát triển các dịch vụ đám mây đến MapReduce17 1.1.5 1.2 Các ý tưởng của MapReduce 18
1.3 Sự quan trọng của MapReduce 19
2 Cơ bản về MapReduce 20
2.1 Nguồn gốc từ Functional Programming 21
2.2 Cấu trúc dữ liệu trong MapReduce 22
2.3 Mapper và Reducer – hai thành phần cơ bản trong MapReduce 22
2.4 Partitioner và Combiner 24
2.5 The execution framework (Bộ khung thực thi) 25
2.6 Distributed File System (Hệ thống file phân tán) 26
3 Thiết kế thuật toán cho MapReduce 31
3.1 Local Aggregation 32
Combiner và In-Mapper combining 33
3.1.1 Sự chính xác của thuật toán trong Local Aggregation 35
3.1.2 3.2 Secondary Sorting 38
3.3 Thuật toán MapReduce trong xử lý dữ liệu quan hệ 39
Phép chiếu: 39
3.3.1 Phép chọn: 39
3.3.2 Phép gộp (Group by ) 40
3.3.3 Phép kết nối quan hệ (Relational Join) 40
3.3.4 4 Apache Hadoop 42
Trang 76
4.1 Giới thiệu 42
4.2 MapReduce Job 42
JobTracker 42
4.2.1 TaskTracker 42
4.2.2 4.3 Các hàm API cơ bản của Hadoop 45
4.4 Các kiểu dữ liệu và định dạng trong Hadoop 45
Các kiểu dữ liệu 45
4.4.1 Các định dạng đầu vào (input formats) 45
4.4.2 Các định dạng đầu ra (output formats) 48
4.4.3 4.5 Ứng dụng đếm từ (Wordcount) viết trong Hadoop 49
4.6 Các chương trình xây dựng trên nền Hadoop 51
4.7 Hadoop và CSDL quan hệ 52
5 Mã nguồn mở Lucene, Solr và Nutch 53
5.1 Mã nguồn mở Lucene 53
5.2 Mã nguồn mở Solr 55
5.3 Mã nguồn mở Nutch 55
5.4 MapReduce trong Nutch: 57
Cấu trúc dữ liệu chính trong Nutch 57
5.4.1 Các thuật toán MapReduce trong Nutch 58
5.4.2 6 Giới thiệu ứng dụng tìm kiếm truyện tranh 62
6.1 Tóm tắt: 62
6.2 Cơ sở lý thuyết 63
Phân tích dữ liệu text và lấy thông tin (Information Retrieval) 63
6.2.1 Các cách tiếp cận Text mining 70
6.2.2 6.3 Sơ đồ hoạt động 71
Giai đoạn thu thập dữ liệu 72
6.3.1 Giai đoạn tạo tài liệu và đánh chỉ mục 74
6.3.2 Giai đoạn tìm kiếm 75
6.3.3 6.4 Các plugin được viết thêm cho ứng dụng tìm kiếm truyện tranh 76
Plugin parse-htmlformangasearch 76 6.4.1
Trang 87
Plugin index-mangasearch 76
6.4.2 6.5 Trang web tìm kiếm 77
AJAX Solr 77
6.5.1 Các tính năng chính 77
6.5.2 7 Tổng kết 79
7.1 Kết quả đạt được 79
7.2 Những hạn chế 79
7.3 Hướng phát triển 79
8 Phụ lục 80
8.1 Hướng dẫn cài đặt và sử dụng Hadoop trên Windows 80
8.2 Hướng dẫn cài đặt và sử dụng Nutch 84
Trang 98
DANH MỤC HÌNH VẼ
Hình 1 Mô hình trực quan để định nghĩa Cloud Computing của NIST 12
Hình 2 Các loại dịch vụ Cloud Computing 14
Hình 3 Mô hình chia để trị 20
Hình 4 Hàm Map và Fold trong Functional Programming 21
Hình 5 Hai pha Map và Reduce của một MapReduce job 23
Hình 6 Mô hình MapReduce đầy đủ các thành phần 25
Hình 7 Kiến trúc của HDFS 27
Hình 8 Vai trò của NameNode và DataNode trong HDFS 29
Hình 9 Kiến trúc HDFS đầy đủ 30
Hình 10 Bảo toàn trạng thái trong Hadoop 32
Hình 11 Tiến trình hoạt động của chương trình WordCount 33
Hình 12 Phép chiếu 39
Hình 13 Phép chọn 39
Hình 14 Phép kết nối quan hệ 40
Hình 15 Sự liên hệ giữa JobTracker và TaskTracker 43
Hình 16 Sơ đồ đầy đủ của một Hadoop Cluster 43
Hình 17 Sơ đồ thực thi chi tiết một ứng dụng MapReduce trong Hadoop 44
Hình 18 Hệ thống phân cấp các lớp của InputFormat 47
Hình 19 Hệ thống phân cấp các lớp của OutputFormat 48
Hình 20 Cấu trúc của Hbase 51
Hình 21 Hive và Pig 52
Hình 22 Các thành phần Lucene hỗ trợ cho hệ thống tìm kiếm 53
Hình 23 Sơ đồ hoạt động của Nutch khi sử dụng như một Crawler 56
Hình 24 Sơ đồ đầy đủ của Nutch khi sử dụng như một Search Engine 57
Hình 25 Revelant and retrieved 64
Hình 26 Sơ đồ hoạt động tổng quát của ứng dụng tìm kiếm truyện tranh 71
Hình 27 Sơ đồ hoạt động chi tiết của giai đoạn thu thập dữ liệu 72
Hình 28 Sơ đồ hoạt động chi tiết của giai đoạn tạo chỉ mục 74
Hình 29 Sơ đồ hoạt động của giai đoạn tìm kiếm 75
Hình 30 Giao diện trang web khi tìm kiếm 77
Hình 31 Kết quả tìm kiếm khi sử dụng chức năng lọc 78
Trang 109
Hình 32 Kết quả khi tìm kiếm theo tác giả 78
Hình 33 Giao diện của Cygwin 81
Hình 34 Giao diện web của NameNode 82
Hình 35 Giao diện web của JobTracker 83
Hình 36 Giao diện của CDH 84
Trang 1110
DANH MỤC TỪ VIẾT TẮT
Amazon EC2 Amazon‟s Elastic Compute Cloud
NIST National Institude of Standards and Technology
Trang 12Theo Wikipedia:
“Mô hình tính toán trên mạng Internet, nơi mà các tài nguyên chia sẻ,
phần mềm và thông tin được cung cấp đến máy tính và nhiều thiết bị
khác theo nhu cầu, như một tiện ích công cộng”
Theo Gartner2:
“Một hình thức tính toán trong đó các năng lực công nghệ thông tin với
sự co giãn lớn được cung cấp „theo kiểu dịch vụ‟ đến với người dùng
bên ngoài qua các kỹ thuật Internet”
Theo Forrester3:
“Một năng lực IT chuẩn (các dịch vụ, phần mềm, hay hạ tầng) triển
khai qua mạng Internet theo hình thức trả phí trên người dùng và trên
dịch vụ”
Các định nghĩa trên đều định nghĩa Cloud Computing là một hệ phân bố, cung cấp các dạng tài nguyên ảo dưới dạng dịch vụ một cách linh động theo nhu cầu của người dùng trên môi trường internet Hoặc có thể hiểu Tính toán đám mây thông qua các từ khóa đại diện cho những đặc trưng chính: cung cấp qua internet - delivered over internet (web 2.0), tài nguyên theo nhu cầu - resource on demand (scalable, elastic,
1 National Institude of Standards and Technology http://www.nist.gov
2 Gartner, Inc (NYSE: IT) là công ty tư vấn và nghiên cứu hàng đầu thế giới trong lĩnh vực CNTT
3 Forrester Research, Inc (Nasdaq: FORR) một công ty nghiên cứu độc lập cung cấp các lời khuyên tiên phong cho các lãnh đạo trong lĩnh vực kinh doanh và công nghệ toàn cầu
Trang 13Hình 1 Mô hình trực quan để định nghĩa Cloud Computing của NIST
Các đặc trưng của tính toán đám mây
1.1.2
1.1.2.1 Tự phục vụ theo nhu cầu (On-demand self-service)
Mỗi khi có nhu cầu, người dùng chỉ cần gửi yêu cầu thông qua trang web cung cấp dịch vụ, hệ thống của nhà cung cấp sẽ đáp ứng yêu cầu của người dùng Người dùng
có thể tự phục vụ yêu cầu của mình như tăng thời gian sử dụng server, tăng dung lượng lưu trữ… mà không cần phải tương tác trực tiếp với nhà cung cấp dịch vụ, mọi nhu cầu về dịch vụ đều được xử lý trên môi trường web (internet)
1.1.2.2 Truy xuất diện rộng (Broad network access)
Cloud Computing cung cấp các dịch vụ thông qua môi trường internet Do đó, người dùng có kết nối internet là có thể sử dụng dịch vụ Hơn nữa, Cloud Computing
ở dạng dịch vụ nên không đòi hỏi khả năng xử lý cao ở phía client, vì vậy người dùng
có thể truy xuất bằng các thiết bị di dộng như điện thoại, PDA, laptop… Với Cloud Computing người dùng không còn bị phụ thuộc vị trí nữa, họ có thể truy xuất dịch vụ
từ bất kỳ nơi nào, vào bất kỳ lúc nào có kết nối internet
1.1.2.3 Dùng chung tài nguyên (Resource pooling)
Tài nguyên của nhà cung cấp dịch vụ được dùng chung, phục vụ cho nhiều người dùng dựa trên mô hình “multi-tenant” Trong mô hình “multi-tenant”, tài nguyên sẽ
Trang 1413
được phân phát động tùy theo nhu cầu của người dùng Khi nhu cầu của một khách hàng giảm xuống, thì phần tài nguyên dư thừa sẽ được tận dụng để phục vụ cho một khách hàng khác Ví dụ như khách hàng A thuê 10 CPU mỗi ngày từ 7 giờ đến 11 giờ, một khách hàng B thuê 10 CPU tương tự mỗi ngày từ 13 giờ đến 17 giờ thì hai khách hàng này có thể dùng chung 10 CPU đó
Cloud Computing dựa trên công nghệ ảo hóa, nên các tài nguyên da phần là tài nguyên ảo Các tài nguyên ảo này sẽ được cấp phát động theo sự thay đổi nhu cầu của từng khách hàng khác nhau Nhờ đó nhà cung cấp dịch vụ có thể phục vụ nhiều khách hàng hơn so với cách cấp phát tài nguyên tĩnh truyền thống
1.1.2.4 Khả năng co giãn nhanh chóng (Rapid elasticity)
Đây là tích chất đặc biệt, nổi bật và quan trọng nhất của Cloud Computing Đó là khả năng tự động mở rộng hoặc thu nhỏ hệ thống tùy theo nhu cầu của người dùng Khi nhu cầu tăng cao, hệ thống sẽ tự mở rộng bằng cách thêm tài nguyên vào Khi nhu cầu giảm xuống, hệ thống sẽ tự giảm bớt tài nguyên
Ví dụ: khách hàng thuê một Server gồm 10 CPU Thông thường do có ít truy cập nên chỉ cần 5 CPU là đủ, khi đó hệ thống quản lý của nhà cung cấp dịch vụ sẽ tự ngắt bớt 5 CPU dư thừa, khách hàng không phải trả phí cho những CPU dư thừa này (những CPU này sẽ được cấp phát cho các khách hàng khác có nhu cầu) Khi lượng truy cập tăng cao, nhu cầu tăng lên thì hệ thống quản lý của nhà cung cấp dịch vụ sẽ
tự “gắn” thêm CPU vào, nếu nhu cầu tăng vượt quá 10 CPU thì khách hàng phải trả phí cho phần vượt mức theo thỏa thuận với nhà cung cấp
Khả năng co giãn giúp cho nhà cung cấp sử dụng tài nguyên hiệu quả, tận dụng triệt để tài nguyên dư thừa, phục vụ được nhiều khách hàng Đối với người sử dụng dịch vụ, khả năng co giãn giúp họ giảm chi phí do họ chỉ trả phí cho những tài nguyên thực sự dùng
1.1.2.5 Điều tiết dịch vụ (Measured service)
Hệ thống Cloud Computing tự động kiểm soát và tối ưu hóa việc sử dụng tài nguyên (dung lượng lưu trữ, đơn vị xử lý, băng thông…) Lượng tài nguyên sử dụng
có thể được theo dõi, kiểm soát và báo cáo một cách minh bạch cho cả hai phía nhà cung cấp dịch vụ và người sử dụng
Các mô hình dịch vụ của tính toán đám mây
Trang 15Đặc trưng
Cung cấp tài nguyên như là dịch vụ: bao gồm cả máy chủ, thiết bị mạng, bộ nhớ, CPU, không gian đĩa cứng, trang thiết bị trung tâm dữ liệu
Khả năng mở rộng linh hoạt
Chi phí thay đổi tùy theo thực tế
Nhiều người thuê có thể cùng dùng chung trên một tài nguyên
Cấp độ doanh nghiệp: đem lại lợi ích cho công ty bởi một nguồn tài nguyên tích toán tổng hợp
Các sản phẩm IaaS tiêu biểu
Amazon EC2 http://aws.amazon.com/ec2
Vào thời điểm hiện tại, dịch vụ IaaS chiếm thị phần lớn nhất là Amazon‟s Elastic Compute Cloud (Amazon EC2) Được triển khai từ tháng Tám năm 2006 và phát triển
kể từ đấy với việc thêm vào các dịch vụ khác nhau và sự hỗ trợ cho nhiều hệ điều hành Nó cung cấp giao diện Web cho phép truy cập các máy ảo
Khái niệm co dãn (Elastic) trong tên của sản phẩm là sự khác biệt, nó ám chỉ khả năng EC2 có thể tăng hay giảm tài nguyên hạ tầng tương ứng với nhu cầu, và chi trả
Trang 16Tích hợp dịch vụ web và cơ sở dữ liệu
Hỗ trợ cộng tác nhóm phát triển công cụ hỗ trợ tiện tích
Các sản phẩm tiêu biểu
Các sản phẩm dịch vụ nền tảng có thể chia làm ba nhóm:
Nhóm nền tảng hỗ trợ vòng đời phát triển tích hợp (Integrated lifecycle platforms)
Các nền tảng này cung cấp cho các nhà phát triển một môi trường đầy đủ cho toàn
bộ vòng đời phát triển ứng dụng: máy hỗ trợ luồng làm việc, các công cụ phát triển, môi trường kiểm tra, công cụ triển khai v.v… Tiêu biểu như:
o Google App Engine http://code.google.com/appengine
o Microsoft Windows Azure www.microsoft.com/windowsazure
Nhóm nền tảng hỗ trợ vòng đời phát triển đặc thù (Anchored lifecycle platforms)
Trang 17Không phải nền tảng đám mây nào cũng cung cấp một môi trường hỗ trợ đầy đủ cho vòng đời phát triển, nhóm này chỉ tập trung vào cung cấp một số khả năng nhất định, một vài khả năng chỉ là các công cụ Nhóm này gồm các sản phẩm tiêu biểu:
o Dịch vụ hỗ trợ kiểm tra trên nền đám mây: HP, IBM, công ty độc lập như iTKO và SOASTA v.v…
o Dịch vụ quản lý: RightScale là công ty quản lý cho Amazon
o Dịch vụ tùy biến: WaveMaker hỗ trợ tùy biến ứng dụng Web
o Dịch vụ phát triển mạng xa hội: Như dịch vụ blog Wordpress
1.1.3.3 Dịch vụ phần mềm (Software-as-a-Service SaaS )
Định nghĩa
Là các năng lực nhằm đem đến cho người dùng thông qua các ứng dụng thực thi trên nền tảng đám mây của nhà cung cấp phần mềm Các ứng dụng này có thể truy cập từ nhiều thiết bị khác nhau thông qua một giao diện như trình duyệt web (ví dụ như các dịch vụ email nền web) Người dùng không phải quản lý hoặc kiểm soát hạ tầng đám mây bên dưới và cả những ứng dụng đơn lẻ, ngoại trừ một số quyền cấu hình tùy chỉnh ứng dụng hạn chế cho một vài cá nhân cụ thể
Đặt trưng
Được xây dựng trên kiến trúc cho nhiều người thuê Nghĩa là nhiều khách hàng
có thể cùng chạy một thể hiện/dịch vụ đặt trên một máy chủ từ xa
Thông thường truy cập qua giao diện Web
Mô hình kinh doanh là dạng: hosted-Người cung cấp, vận hành CRM không phải là công ty có nhu cầu sử dụng ứng dụng mà là công ty khác
Phương thức thanh toán theo hàng phí hàng tháng Thường kèm theo chi phí khởi chạy ứng dụng hoặc chi phí tùy chỉnh cấu hình, tuy nhiên chi phí bảo trì thường đã tính trong phí hàng tháng
Các sản phẩm tiêu biểu
Có rất nhiều sản phẩm SaaS, tuy nhiên chúng có thể được chia làm ba nhóm:
Gói phần mềm (Packaged Software): Chiếm thị phần lớn nhất, gồm các sản phẩm ERP, CRM , SCM v.v… Các sản phẩm tiêu biểu gồm:
Trang 1817
o Netsuitt hay Salesforce.com, Intuit, RightNow, Concur, SugarCRM, Microsoft với Dynamics package, SAP với dịch vụ By Design, Oracle với
On Demand dựa trên Siebel
Phần mềm cộng tác (Collaborative software): Hỗ trợ cho các hình thức làm việc và cộng tác qua mạng giữa các cá nhân hoặc thành viên tổ chức Các sản phẩm tiêu biểu:
o Cùng nhiều sản phẩm tiện ích khác: Chia sẻ ảnh, nghe nhạc v.v…
Các lợi ích của tính toán đám mây
1.1.4
Giảm chi phí đầu tư và tỷ lệ phí tổn (Reduced Investment and Proportional Costs)
Gia tăng tính mở rộng (Increased Scalability)
Gia tăng khả năng đáp ứng và khả năng tin cậy (Increased Availability and Reliability)
Ảnh hưởng của sự phát triển các dịch vụ đám mây đến MapReduce 1.1.5
“Everyting as a Service” được hướng theo nhu cầu của các hiệu quả kinh doanh tốt hơn nhưng khả năng mở rộng và sự mềm dẻo cũng đóng vai trò quan trọng Cloud Computing giúp cho các tổ chức có thể mở rộng hoặc thu hẹp một cách dễ dàng mà không cần có kế hoạch từ trước Cloud services, cũng như MapReduce đại diện cho sự tìm kiếm một cấp độ trừu tượng thích hợp và lợi ích của việc chia sẻ sức lao động IaaS là một mức trừu tượng về phần cứng vật lý – một tổ chức có thể thiếu vốn, chuyên gia và sự quan tâm đến việc hoạt động các Datacenter, vì thế họ bỏ tiền thuê các Cloud Provider làm việc đó Điều này cũng tương tự với PaaS và SaaS Cũng cùng theo dòng chảy, mô hình lập trình MapReduce là một mức trừu tượng mạnh mẽ
để tách biệt “what” (xử lý cái gì) ra khỏi “how” (xử lý như thế nào) trong việc xử lý
dữ liệu lớn
Trang 1918
1.2 Các ý tưởng của MapReduce
Giải quyết các bài toán dữ liệu lớn đòi hỏi cách tiếp cận riêng biệt mà nhiều khi đối lập với mô hình tính toán truyền thống Dưới đây là các ý tưởng chính của MapReduce:
Scale “out” not “up” (mở rộng chứ không nâng cấp): Để tăng sức mạnh xử lý
thay vì nâng cấp bộ vi xử lý cũng như khả năng lưu trữ của máy tính (mua các server
có khả năng xử lý cao – high-end server) giải pháp đưa ra là tăng số lượng các server thông dụng (low-end server) Giải pháp này kinh tế hơn nhiều so vì nó chỉ bổ sung một số máy tính và tận dụng được các server sẵn có trong khi giải pháp nâng cấp có thể dẫn đến việc mua sắm mới lại toàn bộ các server Hơn nữa giá thành của một server chuyên dụng đắt hơn nhiều so với một cụm máy tính thông thường với khả năng xử lý tương đương
Assume failures are common (chấp nhận việc xảy ra lỗi là thường xuyên): Với
sự gia tăng về số lượng của các server trong một cluster, lỗi xảy ra là điều bình thường
Do đó các dịch vụ phân tán trên nhiều server phải tính toán đến các lỗi về phần cứng cũng như phần mềm thường xuyên xảy ra Mô hình lập trình MapReduce có khả năng
xử lý các lỗi thông qua một số cơ chế như tự động khởi động lại các task trên cluster node khác nhau
Move processing to the data (đưa xử lý đến dữ liệu): Trong các ứng dụng tính
toán hiệu năng cao truyền thống (High – Prefomance Computing - HPC) Thông thường, một siêu máy tính có các nút xử lý (processing node) và các nút lưu trữ (storage node) được kết nối với nhau qua một kết nối tốc độ cao Nhiều công việc nặng nề về dữ liệu không phải là những đòi hỏi xử lý cao Do đó việc tách rời việc lưu trữ dữ liệu và tính toán tạo ra sự thắt cổ chai trong mạng Do đó sẽ hiệu quả hơn nếu chuyển sự thực thi xử lý đến dữ liệu thay vì chuyển dữ liệu đến nơi xử lý chúng MapReduce sử dụng một kiến trúc trong đó các bộ xử lý và đĩa lưu trữ được đặt cùng với nhau Trong sự thiết lập như vậy, chúng ta có thể tận dụng lợi thế của dữ liệu cục
bộ bằng cách chạy đoạn mã trên bộ xử lý một cách trực tiếp trên khối dữ liệu cần xử
lý Hệ thống tập tin phân tán có nhiệm vụ quản lý dữ liệu mà MapReduce xử lý
Process data sequentially and avoid random access (xử lý dữ liệu tuần tự và tránh truy cập ngẫu nhiên): Trong trường hợp xử lý một lượng lớn dữ liệu, dung
lượng bộ nhớ thường không đủ cho toàn bộ dữ liệu xử lý Do đó dữ liệu phải được lưu trữ trên đĩa Thời gian cho việc truy cập ngẫu nhiên thường hạn chế bởi sự di chuyển của đầu đọc cũng như tốc độ đĩa do đó làm chậm công việc xử lý Để tránh hạn chế này, MapReduce được thiết kế để xử lý các khối dữ liệu của một tập dữ liệu lớn
Hide system-level details from the application developer (che giấu mức chi tiết
hệ thống đối với nhà phát triển): Để dễ dàng cho các lập trình viên khi viết ứng
dụng xử lý phân tán, MapReduce che giấu sự thực thi phức tạp bên dưới Thay vào đó,
Trang 2019
MapReduce cung cấp một mô hình lập trình trừu tượng với các interface đơn giản được định nghĩa sẵn
1.3 Sự quan trọng của MapReduce
Về tính thiết thực, MapReduce cung cấp một công cụ rất hiệu quả để giải quyết các bài toán dữ liệu lớn Ngoài ra, MapReduce còn quan trọng trong cách nó đã thay đổi việc sắp xếp tính toán trên quy mô lớn
Nói một cách công bằng thì MapReduce không phải là mô hình tính toán song song đầu tiên được đưa ra Mô hình phổ biến nhất trong lý thuyết khoa học máy tính
có từ mấy thập kỷ trước là PRAM4 (Parallel Random Access Machine) Trong mô hình này, một lượng lớn các vi xử lý chia sẻ một bộ nhớ lớn không giới hạn, hoạt động đồng thời trên một lượng dữ liệu chia sẻ để tạo ra kết quả Các mô hình khác như LogP5
và BSP6 (Bulk Synchronous Parallel), tuy nhiên không có mô hình nào có được sự thành công như MapReduce
MapReduce là mức trừu tượng thành công nhất trên các tài nguyên tính toán mở rộng cho đến nay Tuy nhiên, mức trừu tượng giải quyết sự phức tạp bằng cách che dấu sự chi tiết và đưa ra các hành vi được thiết kế tốt cho người sử dụng ứng với mức trừu tượng đó Chính vì thế, mức trừu tượng không thể hoàn hảo, nó làm cho một số công việc dễ hơn, nhưng cũng làm một số công việc khác khó hơn hoặc có khi là không thể thực hiện được Vấn đề này làm cho việc ứng dụng MapReduce trong một
số bài toán cũng có mặt hạn chế Điều đó có nghĩa MapReduce không phải là mô hình cuối cùng trong lớp mô hình lập trình mới cho phép xử lý tính toán trên quy mô lớn một cách hiệu quả
Trang 2120
Chương 2: CƠ BẢN VỀ MAPREDUCE
2 Cơ bản về MapReduce
Phương pháp thường được sử dụng để giải quyết các bài toán dữ liệu lớn hiện nay
là chia để trị Ý tưởng là phân mảnh một bài toán lớn thành các bài toán con nhỏ Các bài toán nhỏ độc lập với nhau để có thể được giải quyết song song bởi các workers khác nhau – workers có thể là các tiến trình trong bộ vi xử lý hoặc các bộ vi xử lý trong trong bộ vi xử lý đa nhân, các bộ xử lý trên một máy, các máy trên một cụm máy tính Các kết quả trung gian từ các worker cụ thể sẽ được gộp lại để tạo thành kết quả cuối cùng
Chia để trị:
Hình 3 Mô hình chia để trị
Trang 2221
2.1 Nguồn gốc từ Functional Programming
MapReduce có nguồn gốc từ lập trình hàm (Functional Programming) Ví dụ điển hình như các ngôn ngữ lập trình Lisp7 và ML8 Tính năng chính của lập trình hàm là khái niệm về các hàm bậc cao (higher-order functions), hoặc các hàm chấp nhận tham
số của nó là một hàm Hai hàm bậc cao thường được xây dựng sẵn là Map và Fold Như hình dưới, cho một danh sách, Map lấy tham số là một hàm f (có 1 tham số)
và áp dụng cho toàn bộ phần tử trong danh sách Cho một danh sách, Fold lấy tham số
là một hàm g (có 2 tham số) và một giá trị khởi tạo: g đầu tiên được áp dụng cho giá trị khởi tạo và phần tử đầu tiên trong danh sách, kết quả được lưu trong biến trung gian, tiếp tục dùng biến trung gian này để phần tử thứ 2 trong danh sách để làm tham
số cho hàm g, công việc tiếp lặp đi lặp lại đến khi hết toàn bộ danh sách Fold trả về kết quả cuối cùng là giá trị cuối cùng của biến trung gian
Hình 4 Hàm Map và Fold trong Functional Programming
Hàm Map trong MapReduce tương ứng với hàm Map, hàm Reduce tương ứng với hàm Fold trong lập trình hàm
7 http://en.wikipedia.org/wiki/Lisp_(programming_language)
8 http://en.wikipedia.org/wiki/ML_(programming_language)
Trang 2322
2.2 Cấu trúc dữ liệu trong MapReduce
Các cặp key-value là cấu trúc dữ liệu cơ bản trong MapReduce Key và value có thể nhận các giá trị có kiểu cơ bản như số nguyên, số thực, chuỗi hay có thể nhận các kiểu giá trị có cấu trúc do người dùng định nghĩa
Một phần quan trọng của giải thuật MapReduce là việc xác định cấu trúc key-value trên các tập dữ liệu cần xử lý Ví dụ, đối với một tập các trang web, các key có thể là các URL và các value có thể là nội dung của các trang HTML, đối với một đồ thị, key
có thể là node id và value có thể là danh sách kề của node đó Trong một số thuật toán key được sử dụng để phân biệt các bộ dữ liệu (giống như khái niệm khóa trong cơ sở
dữ liệu), trong khi ở một số thuật toán, các input key không quan trọng và thường được bỏ qua
2.3 Mapper và Reducer – hai thành phần cơ bản trong MapReduce
Trong MapReduce, lập trình viên định nghĩa một lớp Mapper và một lớp Reducer với hai hàm cơ bản sau:
map(k1, v1) → [(k2, v2)]
reduce(k2, [v2]) → [(k3, v3)]
Ký hiệu […] để chỉ một danh sách các giá trị Đầu vào của một công việc MapReduce (MapReduce job) là dữ liệu được lưu trữ trên hệ thống file phân tán (Distributed File System) Hàm map và reduce lần lượt được cài đặt trong hai lớp Mapper và Reducer Mapper được áp dụng cho mọi cặp key-value để tạo ra các cặp key-value trung gian Reducer được áp dụng cho tất cả các giá trị (value) ứng với cùng một key trung gian để tạo các cặp key-value ở đầu ra Giữa 2 pha map và reduce là một phép xử lý nhóm phân tán các cặp key-value trung gian dựa trên các key Dữ liệu trung gian được gởi đến mỗi reducer theo thứ tự được sắp xếp bởi các key Tuy nhiên không có một quan hệ thứ thự nào được thiết lập cho các key giữa các reducer với nhau Các cặp key-value ở đầu ra của các reducer được ghi vào hệ thống file phân tán (các cặp key-value trung gian được bỏ qua) Đầu ra cuối cùng là r file trên hệ thống file phân tán, trong đó r là số các reducer Trong phần lớn các trường hợp, việc tổng hợp các đầu ra của các reducer là không cần thiết bởi vì r files thường lại là đầu vào cho một MapReduce job khác Hình 5 mô tả 2 giai đoạn của một MapReduce job:
Trang 2423
Hình 5 Hai pha Map và Reduce của một MapReduce job
Ví dụ minh họa MapReduce:
Ứng dụng đếm từ (Word count) trong một tập văn bản
Input: Tập văn bản
Outut: Danh sách các từ cùng số lần xuất hiện của chúng trong tập văn bản
class Mapper
method Map(docId a, doc d)
for all term t ϵ doc d do
Emit(term t, count 1)
Trang 25Emit(term t, count sum)
Hàm Map duyệt qua từng từ trong tập văn bản ứng với mỗi từ sẽ tạo ra một cặp key-value với key chính là từ vừa gặp và value = 1 Hàm Reduce nhận đầu vào là một
từ (term) và và danh sách tần số ci bắt gặp của term đó (các giá trị thực là các số 1), Reduce chỉ đơn giản cộng tất cả các giá trị ci trong danh sách counts
2.4 Partitioner và Combiner
Phần trên chúng ta đã làm đơn giản cái nhìn về MapReduce, ngoài hai thành phần Mapper và Reducer, thường thì lập trình viên phải chỉ thêm 2 thành phần phụ nữa:
Thành phần Partitioner có nhiệm vụ chia không gian khóa (key) trung gian sau
bước Map và gán các cặp key-value trung gian tới các Reduce Hay nói một cách khác, partitioner chỉ định tác vụ (task) mà cặp key-value trung gian phải được chuyển đến
đó Trong mỗi Reducer, các khóa được xử lý theo thứ tự đã được sắp xếp Partitioner đơn giản nhất bao gồm việc tính toán giá trị băm của key và sau đó thực hiện phép chia lấy phần dư của giá trị này với số lượng reducer Do đó các partitioner có thể gán một key và danh sách value của nó tới một reducer có số hiệu là giá trị băm vừa tính được Thông thường hàm băm phải được tính toán sao cho số lượng key gởi đến mỗi reducer xấp xỉ bằng nhau Tuy nhiên partitioner không chú ý đến giá trị value trong cặp key-value, do đó có thể xảy ra tình trạng phân bố dữ liệu không đồng đều trên các reducer
Thành phần Combiner trong MapReduce đóng vai trò như một thành phần tối ưu
giúp giảm tải việc chuyển dữ liệu giữa từ các Mapper đến các Reducer Có thể xem combiner như là một reducer nhỏ (mini-reducer) đặt tại đầu ra của mapper, trước pha trộn và sắp xếp (shuffle and sort phase) gởi các cặp key-value tới các reducer Mỗi combiner hoạt động cô lập và do đó nó không truy xuất đến các cặp key-value của các mapper khác Đầu vào của combiner là các cặp key-value từ đầu ra của mapper và nó
xử lý tất cả các cặp key-value có key giống nhau để chuyển thành cặp key-value (cùng định dạng như ở đầu vào của combiner có key không thay đổi nhưng value đã bị biến đổi) ở đầu ra Tuy nhiên, Reducer và Combiner không thể hoán đổi vai trò cho nhau
Trang 2625
Hình 6 Mô hình MapReduce đầy đủ các thành phần
2.5 The execution framework (Bộ khung thực thi)
Một trong những ý tưởng quan trọng nhất trong MapReduce là tách biệt việc xử lý phân tán cái gì (what) ra khỏi việc xử lý phân tán như thế nào (how) Một chương trình MapReduce (Mapreduce Job), bao gồm đoạn mã cho Mapper, Reducer và có thể thêm Partioner và Combiner được đóng gói lại với nhau với các tham số cấu hình (ví
dụ vị trí các tập tin đầu vào và nơi lưu trữ đầu ra) Nhà phát triển đưa chương trình lên cho node quản lý tác vụ trong cluster (trong Hadoop gọi là JobTracker) và execution framework xử lý tất cả những thứ khác: xử lý trong suốt các vấn đề của việc thực thi
mã lệnh phân tán Các chức năng chính của Execution framework bao gồm:
Scheduling (lập lịch) Mỗi chương trình MapReduce được chia nhỏ thành các đơn
vị nhỏ gọi là tasks Ví dụ, một map task có thể chịu trách nhiệm xử lý một khối các
Trang 2726
cặp key-value nào đó (trong Hadoop gọi là input split), tương tự, một reduce task có thể xử lý một phần của không gian khóa
Data/code co-location (di chuyển dữ liệu và mã lệnh) Ý tưởng của MapReduce
là di chuyển mã lệnh, không phải di chuyển dữ liệu Tuy nhiên, trong một số trường hợp – để cho việc tính toán có thể thực hiện chúng ta phải đưa dữ liệu đến mã lệnh Trong MapReduce, việc này phụ thuộc phần lớn vào hệ thống file phân tán Để có được việc cục bộ dữ liệu, scheduler phải khởi động task tại node có chứa khối dữ liệu cần thiết cho task đó Nếu không thể được (do đang chạy quá nhiều task), một task mới sẽ được khởi tạo ở node khác và dữ liệu được truyền qua mạng đến node đó để xử
lý
Synchronization (đồng bộ hóa) Việc đồng bộ hóa chỉ đến các cách thức để các
tiến trình đang xử lý đồng thời có thể hợp lại (“join up”), ví dụ chia sẻ kết quả trung gian hoặc trao đổi thông tin trạng thái Trong MapReduce, việc đồng bộ hóa xảy ra giữa pha map và reduce Các cặp key-value trung gian phải được gộp theo khóa, điều này đạt được bằng một phép toán sắp xếp phân tán lớn trên tất cả các node đã chạy map tasks và tất cả các node sẽ chạy reduce tasks Dữ liệu trung gian được copy qua mạng, vì thế tiến trình này thường được gọi là “shuffle and sort” Một chương trình
MapReduce với m mapper và r reducer có thể có tới m x r phép toán copy vì mỗi
mapper có thể có đầu ra đến tất cả các reducer
Error and fault handling (xử lý lỗi) MapReduce framework phải hoàn thành tất
cả các tasks trong môi trường xảy ra lỗi thường xuyên Vì MapReduce được thiết kế dành cho các cụm máy giá rẻ (low-end) nên việc thực thi có thể sẽ dễ xảy ra lỗi, đặc biệt trong các cụm lớn, lỗi đĩa cứng và RAM sẽ xảy ra thường xuyên MapReduce frame work phải xử lý được các việc này
2.6 Distributed File System (Hệ thống file phân tán)
Chúng ta đã tập trung nhiều vào việc xử lý dữ liệu lớn Nhưng một điều không kém phần quan trọng đó là: nếu không có dữ liệu thì chúng ta không có gì để xử lý cả Trong tính toán hiệu năng cao (HPC – High-Performance Computing) và các kiến trúc cụm truyền thống, việc lưu trữ được xem là một thành phần tách biệt với việc tính toán Có nhiều cách cài đặt khác nhau, trong đó có Network-Attach Storage (NAS) và Storage Area Network (SAN) là được sử dụng thường xuyên Tuy nhiên với cách cài đặt nào đi nữa thì chu trình xử lý vẫn không thay đổi: các node tính toán lấy đầu vào
từ nơi lưu trữ, nạp dữ liệu vào bộ nhớ, xử lý dữ liệu và ghi kết quả ngược trở lại Khi kích thước dữ liệu càng tăng lên thì khả năng xử lý cũng phải tăng lên Nhưng khi khả năng xử lý tăng thì sự liên kết giữa node lưu trữ và node xử lý lại trở thành một trở ngại Lúc này để có hiệu năng cao thì cần phải có đường truyền mạng tốc độ cao (vd: 10 gigabit Ethernet, InfiniBand) Đây không phải là giải pháp hiệu quả về
Trang 2827
kinh tế Một cách khác đó là bỏ qua sự tách biệt giữa lưu trữ và tính toán Đây chính là
ý tưởng của hệ thống file phân tán bên dưới MapReduce Google File System (GFS)
là cài đặt hệ thống file phân tán riêng của Google và Hadoop Distributed File System (HDFS) là một cài đặt mã nguồn mở của GFS
Ý tưởng chính là chia dữ liệu thành các khối và sao lưu thành các khối đó trên đĩa của các node trong cluster (mặc định là 3) Các khối dữ liệu thường có kích thước mặc định là 64MB Hệ thống file phân tán sử dụng kiến trúc master-slave, master duy trì không gian tên file (metadata, cấu trúc thư mục, ánh xạ file đến block, vị trí các block, quyền truy cập) và slave quản lý các khối dữ liệu cụ thể Trong GFS, master được gọi
là GFS Master và slave được gọi là GFS ChunkServer Trong Hadoop, master được gọi là NameNode và slave được gọi là DataNode Cả 2 hệ thống này hoạt động hầu như giống nhau, tuy nhiên, trong HDFS thì không có ghi thêm vào file và hiệu suất của HDFS cũng hơi chậm hơn so với GFS
Kiến trúc của HDFS:
Hình 7 Kiến trúc của HDFS Nhiệm vụ của NameNode:
Namespace management (Quản lý không gian tên) NameNode chịu trách
nhiệm duy trì không gian tên file, bao gồm metadata, cấu trúc thư mục, ánh xạ file đến block, vị trí của các block và quyền truy cập Các dữ liệu này được nạp vào bộ nhớ để truy cập cho nhanh
Trang 2928
Coordinating file operations (Định vị các phép toán trên file) Namenode điều
khiển các ứng dụng khách (clients) đến datanode để đọc và cấp phát các block thích hợp để ghi Tất cả việc trao đổi diễn ra trực tiếp giữa client và datanode Khi một file
bị xóa, HDFS không lập tức thu lại không gian lưu trữ, thay vào đó, các block sẽ được thu gom từ từ (lazily garbage collected)
Maintain overall health of the file system (Duy trì sự hoạt động của hệ thống file) Định kì, namenode sẽ gửi các thông điệp báo hiệu (heartbeat messages) đến
datanode để bảo đảm sự toàn vẹn của hệ thống Nếu namenode thấy một block nào có
số bản sao thập hơn yêu cầu, nó sẽ điều khiển để tạo ra các bản sao mới Cuối cùng, namenode chịu trách nhiệm cân bằng hệ thống file Trong các phép toán thông thường, một datanode có thể sẽ chứa nhiều blocks hơn những cái khác, namenode sẽ cân bằng bằng cách chuyển các blocks từ các datanode có nhiều blocks đến các datanode có ít blocks hơn
Thiết kế có một master của GFS và HDFS là một điểm yếu dễ thấy Vì nếu master
bị lỗi thì toàn bộ hệ thống và tất các MapReduce jobs sẽ bị dừng Yếu điểm này được giảm bớt đi một phần nhờ vào bản chất của các phép toán của hệ thống file: không có
dữ liệu đi qua NameNode và toàn bộ sự giao tiếp của clients và DataNode chỉ chứa metadata Vì thế, NameNode cũng ko hẳn là một yếu điểm, trong hầu hết trường hợp đều tránh được lỗi do tràn dữ liệu Trong thực tế, điểm chết (Single Point Of Failure - SPOF) này ko phải là một hạn chế lớn – với việc theo dõi NameNode thường xuyên thì thời gian bị lỗi sẽ không quá lâu trong các triển khai thương mại Hơn nữa, Hadoop cũng được thiết kế thêm một NameNode dự phòng (Secondary NameNode) để có thể chuyển đổi nhanh chóng khi NameNode bị lỗi
Nhiệm vụ của DataNode:
DataNode có nhiệm vụ đọc và ghi các block của HDFS vào hệ thống file cục bộ Khi muốn đọc hay ghi một file HDFS, file này sẽ được chia nhỏ thành các block và namenode sẽ cho client biết DataNode nào đang chứa block nào Client truy cập trực tiếp đến DataNode để lấy block dữ liệu cần xử lý Ngoài ra, các DataNode cũng giao tiếp với nhau để sao lưu dữ liệu
Trang 3029
Hình 8 Vai trò của NameNode và DataNode trong HDFS
Hình 8 thể hiện vai trò của NameNode và DataNode Trong hình này, ta có hai files: một tại /user/chuck/data1 và một tại /user/james/data2 File 1 có 3 block 1, 2, 3
và file 2 có 2 block 4 và 5 Nội dung của các file được lưu trữ phân tán giữa các DataNode, mỗi block có 3 bản sao Ví dụ, block 1 được sao lưu trên 3 DataNode bên phải, điều này đảm bảo rằng nếu một DataNode bị lỗi thì vẫn có thể đọc được file trên các DataNode khác
Các DataNode liên tục báo cáo lên NameNode Sau khi khởi tạo, mỗi DataNode sẽ báo cáo lên NameNode các block nó đang lưu trữ Sau khi hoàn tất, DataNode sẽ tiếp tục liên lạc với NameNode để cung cấp thông tin về sự thay đổi dữ liệu cục bộ và nhận các chỉ thị để tạo, di chuyển hay xóa các block từ đĩa cục bộ
Nhiệm vụ của Secondary NameNode:
Secondary NameNode (SNN) là một tiến trình nền (daemon) để hỗ trợ cho việc theo dõi trạng thái của HDFS cluster Cũng như NameNode, mỗi cluster cũng có một SNN và thường chạy trên một server riêng Không có DataNode hoặc TaskTracker nào chạy trên server này Điểm khác của SNN so với NameNode là nó không nhận và lưu lại sự thay đổi thời gian thực của HDFS Thay vào đó, nó liên hệ trực tiếp với NameNode để lưu lại trạng thái của HDFS sau một khoảng thời gian do người dùng cấu hình
Trang 3130
Như đã nói ở trên, NameNode là một yếu điểm của Hadoop cluster và SNN giúp giảm thiểu thời gian lỗi và mất dữ liệu Tuy nhiên, khi một NameNode gặp sự cố, thì cần có con người can thiệp và cấu hình lại cluster để SNN có thể trở thành NameNode
Hình 9 Kiến trúc HDFS đầy đủ
Trang 3231
Chương 3: THIẾT KẾ THUẬT TOÁN CHO
MAPREDUCE
3 Thiết kế thuật toán cho MapReduce
Phần lớn sức mạnh của MapReduce đến từ sự đơn giản: để chuẩn bị cho dữ liệu đầu vào, lập trình viên chỉ cần cài đặt mapper và reducer, hoặc thêm partioner và combiner Tất cả phần thực thi được xử lý trong suốt bởi Execution framework – trên các clusters từ một đến hàng nghìn node, trên các tập dữ liệu từ gigabytes đến petabytes Tuy nhiên, nó cũng có nghĩa là bất cứ thuật toán nào người lập trình muốn phát triển cũng phải được diễn tả theo một cách nghiêm ngặt theo các thành phần đã được định nghĩa sẵn Điều đó có nghĩa không phải bất kỳ thuật toán nào cũng có thể chuyển sang mô hình lập trình này Mục đích của chương này là cung cấp, chủ yếu qua các ví dụ để thiết kế thuật toán cho MapReduce
Đồng bộ hóa có lẽ là phần khó nhất của việc thiết kế thuật toán cho MapReduce (và các thuật toán song song hoặc phân tán nói chung) Trong các bài toán xử lý song song, các tiến trình trong các node khác nhau trong một cụm tại một thời điểm nào đó phải dồn lại với nhau, ví dụ: phân tán các kết quả từng phần từ các nodes tạo ra chúng đến các nodes sẽ sử dụng chúng Với một MapReduce Job, chỉ có một lần đồng bộ hóa trên toàn cluster – giai đoạn sort và shuffle, lúc mà các cặp key-value trung gian được copy từ mapper đến reducer và gộp theo key Ngoài lúc đó, mapper và reducer chạy độc lập và không có cơ chế liên lạc trực tiếp giữa chúng Hơn nữa, người lập trình có rất ít sự điều khiển trên nhiều khía cạnh của sự thực thi, ví dụ:
Chỉ định Node cho một Mapper hoặc Reducer cụ thể
Chỉ định thời gian bắt đầu và kết thúc của Mapper hoặc Reducer
Chỉ định Mapper sẽ xử lý cặp key-value cụ thể
Chỉ định Reducer sẽ xử lý các cặp key-value trung gian
Tuy nhiên, lập trình viên cũng có một số kĩ thuật để điều khiển việc thực thi và quản lý dòng dữ liệu trong MapReduce Bao gồm:
Khả năng xây dựng các cấu trúc dữ liệu phức tạp dùng làm keys và values để lưu trữ và giao tiếp các kết quả từng phần
Khả năng thực thi các đoạn mã của người dùng lúc bắt đầu và kết thúc map và reduce task
Khả năng bảo toàn trạng thái giữa các mapper và reducer qua nhiều khóa đầu vào hoặc trung gian
Trang 3332
Khả năng điều khiển thứ tự sắp xếp của các keys trung gian, do đó có thể biết được thứ tự các key mà reducer sẽ nhận
Khả năng điều khiển phân mảnh không gian khóa, do đó có thể biết được thứ
tự tập khóa mà một reducer nào đó sẽ nhận
Một MapReduce Job không thể biểu diễn tất cả các thuật toán Người lập trình thường phải phân tích thuật toán phức tạp thành một chuỗi các jobs, yêu cầu chuỗi các
dữ liệu liên tục, vì thế đầu ra của một job trở thành đầu vào của job kế tiếp Nhiều thuật toán thường có bản chất lặp đi lặp lại, đòi hỏi sự thực thi lặp đi lặp lại để đạt được một ngưỡng hội tụ cần thiết
Chương này sẽ giải thích các kĩ thuật khác nhau để điều khiển sự thực thi lệnh và dòng dữ liệu có thể được áp dụng để thiết kế thuật toán trong MapReduce
Hình 10 Bảo toàn trạng thái trong Hadoop
Trang 3433
Hình 10 mô tả việc tạo đối tượng và bản toàn trạng thái trong Hadoop, một đối tượng Mapper và Reducer được tạo ra tương ứng với một task, hàm Configure được chạy lúc khởi tạo đối tượng, hàm map/reduce chạy tương ứng với mỗi cặp key-value, hàm close được chạy khi hủy đối tượng Trạng thái (state) của đối tượng được bảo toàn qua các lần gọi hàm map/reduce
Combiner và In-Mapper combining
3.1.1
Để minh họa các kỹ thuật khác nhau của hàm gộp cục bộ Ta sử dụng ví dụ là chương trình Wordcount:
Input: Tập các văn bản
Output: Các từ và số lượng của chúng trong tập các văn bản
Chương trình Wordcount cơ bản:
Hình 11 Tiến trình hoạt động của chương trình WordCount
Class MAPPER
Method MAP(docid a, doc d)
For all term t in doc d do
EMIT(term t, count 1) Class REDUCER
Method REDUCE(term t, counts [C 1, C 2, …])
Sum ← 0
For all count c in counts [C 1, C 2, …] do
Sum ← Sum + c EMIT(term t, count s)
Trang 3534
Mapper đưa lên các key-value trung gian ứng với mỗi từ nó tìm thấy với key là từ
đó và value là 1, Reducer tổng các giá trị trung gian để đưa ra kết quả cuối cùng
Word Count: Version 1 (Reducer vẫn giữ nguyên)
Class MAPPER
Method MAP(docid a, doc d)
H ← new ASSOCIATIVEARRAY For all term t in doc d do
H{t} ← H{t} + 1 >Đếm số lượng tổng cộng một tài liệu
For all term t in H do EMIT(term t, count H{t})
Thuật toán này cải thiện hơn so với chương trình wordcount cơ bản, sử dụng một mảng kết hợp để đếm số lượng các từ trong một tài liệu sau đó mới đưa lên các từ và
số lượng của các từ đó trong mảng Dễ thấy cách này sẽ làm giảm đi số lượng các key-value trung gian
Word Count: Version 2
Class MAPPER
Method INITIALIZE
H ← new ASSOCIATIVEARRAY >bảo toàn trạng thái giữa các cặp
key/value
Method MAP(docid a, doc d)
For all term t in doc d do
H{t} ← H{t} + 1 >Đếm số lượng tổng cộng trên nhiều tài liệu
dữ liệu trung gian thì hàm CLOSE sẽ được gọi, lúc này ta gửi cặp key-value tương tứng với các phần tử trong mảng kết hợp Với kĩ thuật này, ta đang sử dụng chức năng của hàm Combiner trực tiếp ở trong Mapper Ta không cần phải chạy các Combiner khác, vì tất cả khả năng gộp cục bộ đã được chỉ rõ Mẫu thiết kế này trong
MapReduce thường được gọi là “In-Mapper Combining” Có 2 lợi ích khi sử dụng
mẫu thiết kế này:
Trang 3635
Thứ nhất, nó điều khiển được khi nào việc gộp cục bộ xảy ra và chính xác xảy ra như thế nào Ngược lại, ý nghĩa của hàm Combiner không được chỉ rõ trong MapReduce Ví dụ: Hadoop không bảo đảm hoặc Combiner được thực hiện bao nhiêu lần hoặc có thể không thực hiện lần nào Combiner được xem là một tối ưu hóa trong execution framework, có thể sử dụng hoặc không, có thể được gọi không hoặc nhiều lần Trong nhiều trường hợp, sự không chắc chắn này không chấp nhận được, chính vì thế nhiều lập trình viên tự viết hàm gộp trong Mapper
Thứ hai, In-Mapper Combining sẽ hiệu quả hơn các Combiner thực sự Combiner làm giảm số lượng các key-value trung gian trong pha shuffle and sort nhưng không làm giảm số lượng các key-value tạo ra trong pha map, việc này làm tạo ra nhiều việc tạo và hủy đối tượng Ngược lại, trong In-Mapper Combining chỉ tạo các cặp key-value cần thiết cho pha shuffle and sort
Tuy nhiên, trong mẫu In-Mapper Combining cũng có hạn chế Nó làm mất đi ý tưởng ban đầu của MapReduce vì có bảo toàn trạng thái giữa các cặp key-value Bảo toàn trạng thái giữa các dữ liệu đầu vào, có nghĩa thuật toán có thể phụ thuộc vào thứ
tự của các cặp key-value, dẫn đến có thể xảy ra các lỗi về thứ tự Thứ hai, khi dữ liệu quá lớn thì có thể làm cho dữ liệu trung gian không thể chứa đủ trong bộ nhớ dẫn đến vấn đề về bộ nhớ Giải pháp là giới hạn kích thước của Block và thường xuyên hủy các cấu trúc dữ liệu không dùng tới trong bộ nhớ
Sự chính xác của thuật toán trong Local Aggregation
3.1.2
Mặc dù Combiner có thể làm giảm thời gian chạy của chương trình nhưng cũng cần cẩn thận khi sử dụng chúng Vì Combiner trong Hadoop được xem là các tối ưu phụ nên sự chính xác của thuật toán không thể phụ thuộc vào sự tính toán trên Combiner hoặc phụ thuộc vào nó Trong các chương trình MapReduce, kiểu dữ liệu đầu vào trong Reducer phải cùng kiểu dữ liệu đầu ra của Mapper, vì thế kiểu dữ liệu đầu vào và đầu ra của Combiner phải cùng kiểu với dữ liệu đầu ra của Mapper Trong trường hợp kiểu dữ liệu đầu vào và đầu ra của Reducer giống nhau thì Reducer có thể dùng như Combiner
Ví dụ: Computing the Mean (Tính giá trị trung bình)
Input: Tập dữ liệu với input key kiểu string và input value kiểu integer
Output: Giá trị trung bình ứng với mỗi key
Computing the Mean: Version 1
Class MAPPER
Method MAP(string t, integer r)
EMIT(string t, integer r) Class REDUCER
Trang 3736
Method REDUCE(string t, integers [r1, r2, …])
Sum ← 0 Cnt ← 0 For all integer r in integers [r1, r2, …]) do Sum ← Sum + r
Cnt ← Cnt + 1
r avg ← Sum/Cnt EMIT(string t, integer r avg)
Thuật toán này không thể sử dụng combiner nhƣ reducer vì trung bình của các giá trị trung bình cục bộ không bằng trung bình của toàn bộ các giá trị
Ví dụ: ((3+4)/2 + (8+9+10)/3)/2 = 6.25
(3 + 4 + 8 + 9 + 10)/5 = 6.8
Dễ thấy trong ví dụ trên, hai cách tính toán cho ra hai kết quả khác nhau
Computing the Mean: Version 2
Class MAPPER
Method MAP(string t, integer r)
EMIT(string t, integer r) Class COMBINER
Method COMBINE(string t, integers [r1, r2, …])
Sum ← 0 Cnt ← 0 For all integer r in integers [r1, r2, …]) do Sum ← Sum + r
Cnt ← Cnt + 1 EMIT(string t, pair(Sum,Cnt) >Sum và Count riêng phần
Class REDUCER
Method REDUCE(string t, pairs [(s1,c1), (s2,c2), …])
Sum ← 0 Cnt ← 0 For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s
Cnt ← Cnt + c
r avg ← Sum/Cnt
Trang 3837
EMIT(string t, integer r avg)
Thuật toán này không chính xác vì sự khác nhau về kiểu dữ liệu của key-value giữa Combiner và Reducer (nếu Combiner không đƣợc gọi lần nào thì sẽ sai)
Computing the Mean: Version 3
Class MAPPER
Method MAP(string t, integer r)
EMIT(string t, pair(r,1)) Class COMBINER
Method COMBINE(string t, pairs [(s1,c1), (s2,c2), …]))
Sum ← 0 Cnt ← 0 For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s
Cnt ← Cnt + c EMIT(string t, pair(Sum,Cnt) >Sum và Count riêng phần
Class REDUCER
Method REDUCE(string t, pairs [(s1,c1), (s2,c2), …])
Sum ← 0 Cnt ← 0 For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s
Cnt ← Cnt + c
r avg ← Sum/Cnt EMIT(string t, integer r avg)
Thuật toán đúng vì kiểu dữ liệu của Combiner và Reducer giống nhau
Trang 3938
Computing the Mean: Version 4
Thuật toán sử dung In-Mapper combining
Class MAPPER
Method INITIALIZE
S ← new ASSOCIATIVEARRAY
C ← new ASSOCIATIVEARRAY Method MAP(string t, integer r) S{t} ← S{t} + r
C{t} ← C{t} + 1 Method CLOSE
For all term t in S do
EMIT(term t, pair (S{t}, C{t}))
3.2 Secondary Sorting
MapReduce sắp xếp các cặp key-value theo keys trong pha Shuffle and Sort, sẽ rất thuận tiện nếu việc tính toán ở reducer dựa vào thứ tự sắp xếp Tuy nhiên, làm cách nào để ngoài sắp xếp theo key, ta sắp theo theo value nữa? MapReduce của Google có tính năng secondary được xây dựng sẵn để đảm bảo các values được sắp xếp khi đến Reducer Tuy nhiên, Hadoop chưa có tính năng này Có 2 cách để dùng secondary sort trong Hadoop: một là lưu tạm trong bộ nhớ sau đó sắp xếp, tuy nhiên cách này sẽ bị giới hạn khi dữ liệu trong bộ nhớ quá lớn Cách thứ hai là sử dụng mẫu thiết kế Value-to-key tạo nên các composite key (khóa kết hợp) (k,v1)
Trang 40Map trên các bộ dữ liệu và đƣa lên bộ dữ liệu mới với các thuộc tính thích hợp, không cần Reducer, trừ khi cần gộp nhóm lại hoặc xếp lại các bộ dữ liệu Hoặc có thể
sử dụng cách khác là thực hiện phép chiếu bên Reducer
Phép chọn:
3.3.2
Hình 13 Phép chọn Phép chọn trong MapReduce
Chỉ cần sử dụng hàm Map, đƣa vào tập dữ liệu vào lấy ra các bộ dữ liệu thỏa điều kiện