Tải bản đầy đủ (.pdf) (78 trang)

Đồ án: Mô hình Mapreduce và ứng dụng của Bigdata

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.94 MB, 78 trang )

Đồ án tốt nghiệp Đại học
SVTH: Vũ Minh Ngọc D07CNPM1
i
LỜI NÓI ĐẦU

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
Đồ án tốt nghiệp Đại học


SVTH: Vũ Minh Ngọc D07CNPM1
ii
NHẬN XÉT, ĐÁNH GIÁ, CHO ĐIỂM
(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)

Đồ án tốt nghiệp Đại học
SVTH: Vũ Minh Ngọc D07CNPM1
iii
Mục lục
ĐẶ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 toá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 TOÁ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
TOÁN CỤ THỂ 18

3.1. K-Means 18
3.1.1. Giới thiệu thuật toán K-Means 18
3.1.2. MapReduce hóa 20
3.2. Naïve Bayes 24
3.2.1. Giới thiệu thuật toán Naï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 toá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
Đồ án tốt nghiệp Đại học
SVTH: Vũ Minh Ngọc D07CNPM1
iv
4.1. Cài đặt trên Hadoop 47
4.1.1 K-Means 47
4.1.2. Naï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. Naï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 toá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 toá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

Đồ án tốt nghiệp Đại học
SVTH: Vũ Minh Ngọc D07CNPM1

v
SƠ ĐỒ HÌNH
Hì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 toán k-means 22
Hình 9. Lƣu đồ MapReduce hoá K-means 23
Hình 10. Lƣu đồ thuật toán Naive Bayes 30
Hình 11. Lƣu đồ MapReduce hoá Naive Bayes 31
Hình 12. Quá trình lặp của thuật toá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 toán lấy mẫu Gibbs 39
Hình 15. Lƣu đồ MapReduce hoá thuật toán lấy mẫu Gibbs - chiến lƣợc 1 41
Hình 16. Lƣu đồ MapReduce hoá 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 Naï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 Naï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 toà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 Naï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 toá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 toán Naï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
(phƣơng sai). 62
Đồ án tốt nghiệp Đại học
SVTH: Vũ Minh Ngọc D07CNPM1
vi
DANH MỤC BẢNG
Bả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

Đồ án tốt nghiệp Đại học Đặt vấn đề
SVTH: Vũ Minh Ngọc D07CNPM1
1
ĐẶT VẤN ĐỀ

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.

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 toá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 toá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 toá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 toán cho 3 thuật
toán là K-Mean, Naïve Bayes và LDA. Trong đó, sẽ giới thiệu về ba thuật toán này, cùng với
cách áp dụng mô hình toán cho mỗi thuật toán.
Chƣơng 4. Là phần cài đặt các mô hình toán của 3 thuật toá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 hoà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.
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
1
CHƢƠNG I. MÔ HÌNH MAPREDUCE VÀ HADOOP

1.1. Mô hình MapReduce
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.
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
2

Hì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
Map 1
Map 3
Map 2
Reduce 1
Reduce 2
Giai đoạn
Map
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
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
3
Giai đ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
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
4

Hì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
2 phần:
-Map: Đầu vào là nút chủ (master node) và sau đó chia nhỏ nó ra thành các vấn đề bé
hơn. Gọi là các split 0, split 1, split 2 …
-Reduce: Từ các đầu ra trung gian sẽ tổng hợp lại để đƣa ra các kết quả cuối cùng cho
vấn đề master.

Phần sau là ví dụ minh họa cho bài đếm từ, đầu vào và đầu ra, tƣơng tự nhƣ phần trên
nhƣng mô tả cụ thể nội dung của từng hàm:
Hàm Map:
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
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
5
// 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.
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
6
1.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ý
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1

7
khô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]
:
 NameNode
 DataNode
 SecondaryNameNode
 JobTracker
 TaskTracker

1.2.5. Các trình nền của Hadoop
 NameNode
Là một trình nền quan trọng nhất của Hadoop - các NameNode. Hadoop sử
dụng một kiển trúc master/slave cho cả lƣu trữ phân tán và xử lý phân tán. Hệ thống
lƣu trữ phân tán đƣợc gọi là Hadoop File System hay HDFS. NameNode là master của

HDFS để chỉ đạo các trình nền DataNode slave để thực hiện các nhiệm vụ I/O mức
thấp. NadeNode là nhân viên kế toán của HDFS; nó theo dõi cách các tập tin của bạn
đƣợc phân kia thành các block, những node nào lƣu các khối đó, và “kiểm tra sức
khỏe” tổng thể của hệ thống tệp phân tán.
 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
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
8
bạ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.
Đồ án tốt nghiệp Đại học Chƣơng 1. Mô hình toán MapReduce và Hadoop
SVTH: Vũ Minh Ngọc D07CNPM1
9

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.

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.



SVTH: Vũ Minh Ngọc D07CNPM1
10

Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học
CHƢƠ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

SVTH: Vũ Minh Ngọc D07CNPM1
11
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học

2.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:

Tên lớp

Miêu tả
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ố:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

public class Edge implements WritableComparable<Edge>{


SVTH: Vũ Minh Ngọc D07CNPM1
12
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học
private String departureNode; //Node khoi hanh
private String arrivalNode; //Node den


public String getDepartureNode(){
return departureNode;
}

public void readFields(DataInput in) throws IOException {
departureNode = in.readUTF();
arrivalNode = in.readUTF();
}

@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(departureNode);
out.writeUTF(arrivalNode);
}

@Override
public int compareTo(Edge o) {
return (departureNode.compareTo (o.departureNode)!= 0)?
departureNode.compareTo(departureNode):
arrivalNode.compareTo(o.arrivalNode);
}
}

Lớp Edge thực hiện hai phƣơng thức readFields() và write() của giao
diện Writeable. Chúng làm việc với lớp Java DataInput và DataOutput để tuần tự
nội dung của các lớp. Thự hiện phƣơng pháp compareTo() cho interface Comparable.
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:

SVTH: Vũ Minh Ngọc D07CNPM1
13
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học
void 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:
Tên lớp
Miêu tả
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.

SVTH: Vũ Minh Ngọc D07CNPM1
14
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop

Đồ án tốt nghiệp Đại học
Hà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
Tên lớp
Miêu tả
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ợ:
2.2.1. InputFormat
Danh sách các bản cài đặt phổ biến của InputFormat với mô tả của mỗi cặp
key/value đƣợc chuyển tới Mapper.
- TextInputFormat : Mỗi dòng trong file text là một record. Khóa là một byte
offset của dòng, và giá trị là nội dung của dòng đó.
o Key: LongWritable
o Value: Text

SVTH: Vũ Minh Ngọc D07CNPM1
15
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học
- 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
bảo phải có chính xác N dòng. Thuộc tính
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
17:16:19
17:16:20
17:16:20
17:16:25

Bạn có thể thiết lập đối tƣơng JobConf để sử dung lớp đọc file trên:
conf.setInputFormat(KeyValueTextInputFormat.class);
Nhớ lại mapper trƣớc của chúng ta sử dụng LongWritable và Text tƣơng ứng
nhƣ là kiểu của key và value. LongWritable là một kiểu hợp lý cho key hơn
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 .

SVTH: Vũ Minh Ngọc D07CNPM1
16
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học

Hadoop 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
DBInputformat và DBOutputFormat.
Các OutputFormat mặc định là TextOutputFormat, mà ghi mỗi record là một

dòng văn bản. Mỗi key, value của mỗi bản ghi đƣợc convert sang string thông qua
toString(), và kí tự \t để phân tách. Ký tự phân tách có thể thay đổi bằng thuộc tính
mapred.textoutputformat.separator.
Kết quả dữ liệu đầu ra TextOutputFormat trong một định dạng có thể đọc
đƣợc là KeyValueTextInputFormat, nếu bạn dùng kiểu khóa là NullWritable.
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

SVTH: Vũ Minh Ngọc D07CNPM1
17
Chƣơng 2. Lập trình cơ bản với mô hình toán MapReduce
và Hadoop
Đồ án tốt nghiệp Đại học
bạ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ì
ra file.
Cuối cùng, SequenceFileOutputFormat ghi đầu ra trong định dạng sequence
file (file tuần tự), có thể đƣợc đọc lại bằng cách sử dụng SequenceFileInputFormat.
Nó hữu ích để viết dữ liệu kết quả trung gian khi thực hiện chuỗi công việc
MapReduce.
2.3. SequenceFile
Đố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.

×