SlideShare a Scribd company logo
1 of 13
MapReduce: Đơn giản hóa việc xử lý dữ liệu trên các
cụm lớn
Jeffey Dean và Sanjay Ghemawat
jeff@google.com, sanjay@google.com
Google, Inc.
Tóm tắt nội dung
MapReduce là một mô hình lập trình và một phương
thức triển khai có liên kết gồm nhiều máy tính kết
nối với nhau để tính toán và xử lý trên các bộ dữ
liệu lớn. Người dùng chỉ định một hàm map xử lý
một cặp key/value và tạo ra các cặp key/value trung
gian, và hàm reduce gộp tất cả các value có cùng key
trung gian.Nhiều vấn đề trong thực tế có thể diễn
đạt được thông qua mô hình này, sẽ được mô tả dưới
đây.
Chương trình được viết theo cách này sẽ được
thực thi song song một cách tự động trên một cụm
gồm nhiều máy tính. Toàn bộ qúa trình từ chia nhỏ
dữ liệu đầu vào đến lập lịch xử lý cho các máy tính
trên cụm, xử lý sự cố, quản lý việc giao tiếp giữa
các máy được thực hiện bởi hệ thống runtime. Điều
này cho phép lập trình viên không cần phải có kinh
nghiệm về hệ thống song song và phân tán cũng có
thể dễ dàng sử dụng được một hệ thống phân tán
cỡ lớn.
MapReduce được cài đặt trên một cụm gồm nhiều
máy tính có khả năng mở rộng cao: Việc thực thi
của MapReduce cho phép xử lý nhiều terabytes dữ
liệu trên hàng nghìn máy tính. Hàng trăm chương
trình MapReduce được đã cài đặt và lên tới một
nghìn MapReduce job đang được chạy trên cụm tại
Google hàng ngày.
1 Giới thiệu
Năm năm qua, các tác giả và cộng sự của mình tại
Google đã triển khai hàng trăm tính toán với mục
tiêu chuyên biệt nhằm xử lý số lượng lớn dữ liệu
thô, ví dụ như các tài liệu được thu thập về, lịch
sử truy vấn web, v.v.., để tính toán ra các dạng dữ
liệu dẫn xuất, như đánh chỉ mục ngược, các dạng
biểu diễn cấu trúc đồ thị của tài liệu web, tóm tắt
số trang thu thập được trên mỗi host tương ứng, tập
các truy vấn thường gặp trong một ngày nhất định,
v.v... Hầu hết những tính toán như vậy đều khá dễ
dàng về mặt khái niệm. Tuy nhiên, dữ liệu đầu vào
thường khá lớn và các tính toán phải được phân tán
trên hàng trăm hoặc hàng nghìn máy để có thể hoàn
thành trong khoảng thời gian hợp lý. Những vấn đề
như là làm thế nào để song song hóa các tính toán,
phân tán dữ liệu, xử lý sự cố, cùng với nó là khối
lượng code đồ sộ, đã ngăn cản việc che giấu những
tính toán đơn giản truyền thống.
Để giải quyết sự phức tạp này, chúng tôi đã đề
xuất một khái niệm trừu tượng mới cho phép chúng
ta diễn đạt các tính toán đơn giản, đồng thời che
giấu đi các chi tiết cồng kềnh của việc song song
hóa, chịu lỗi, phân tán dữ liệu và cân bằng tải trên
thư viện. Sự trừu tượng hóa này được bắt nguồn
từ diễn tả nguyên thủy map và reduce trong Lisp
và các ngôn ngữ hướng chức năng khác. Chúng tôi
nhận ra hầu hết các tính toán đều liên quan tới áp
dụng toán tử map vào mỗi bản ghi logic tại đầu vào
để tính toán ra tập các cặp key/value trung gian,
sau đó áp dụng toán tử reduce cho tất cả các value
có cùng key, để có thể kết hợp dữ liệu dẫn xuất một
cách hợp lý. Việc sử dụng mô hình hướng chức năng
với map và reduce cho phép chúng ta song song hóa
dễ dàng các tính toán lớn và cho phép tái thực thi
với cơ chế chủ đạo trong việc chịu lỗi.
Đóng góp chủ yếu của công trình này là tạo ra một
giao diện đơn giản, mạnh mẽ cho phép thực hiện tự
động các công việc song song hóa và tính toán phân
tán trên phạm vi lớn, kết hợp với việc triển khai giao
diện này để đạt được hiệu năng tính toán cao trên
cụm lớn các máy tính phổ thông.
Phần 2 mô tả mô hình lập trình cơ bản và đưa
ra một vài ví dụ. Phần 3 mô tả việc cài đặt giao
diện MapReduce thích hợp với môi trường tính toán
dựa trên cụm. Phần 4 mô tả một vài tinh chỉnh
khá hữu ích của mô hình lập trình. Phần 5 chứa
các kết quả đo hiệu năng của việc triển khai ứng
với các công việc khác nhau. Phần 6 mô tả việc
sử dụng MapReduce trong Google, bao gồm những
kinh nghiệm của chúng tôi trong việc sử dụng nó làm
công cụ viết lại trong hệ thống đánh chỉ mục. Phần
7 thảo luận về các công trình liên quan và công việc
trong tương lai.
2 Mô hình lập trình
Trong phương pháp tình toán này, ta đưa vào một
tập hợp các cặp key/value đầu vào, và kết quả là một
tập key/value đầu ra. Người sử dụng MapReduce chỉ
cần viết 2 hàm: Map và Reduce.
Người dùng viết hàm Map nhận đầu vào là một
cặp key/value và tạo ra một tập hợp các cặp key/-
value tạm thời. Thư viện MapReduce sẽ nhóm tất
cả những cặp key/value tạm thời mà có key giống
nhau sau đó chuyển cho hàm Reduce.
Trong hàm Reduce người dùng sẽ viết mã để xử
lý đầu vào là một key và một danh sách các value
của key đó, và tạo ra một tập các value với số lượng
phần tử ít hơn. Thông thường là không hoặc một
value được tạo ra từ hàm Reduce. Danh sách các
value tạm thời được gửi đến hàm Reduce thông qua
một vòng lặp. Điều đó cho phép chúng có thể xử lý
một danh sách value có kích thước lớn hơn bộ nhớ
vật lý.
2.1 Ví dụ
Một ví dụ điển hỉnh áp dụng MapReduce đó là bài
toán đếm số từ xuất hiện trong một số lượng lớn các
văn bản. Được thể hiện bằng mã giả dưới đây:
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1");
reduce(String key, Iterator values):
// key: a word
// value: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
Hàm Map đưa ra mỗi từ với số lần xuất hiện của
từ đó (trong ví dụ trên là ‘1’). Hàm Reduce thực
hiện việc tính tổng số lần xuất hiện của mỗi từ.
Thêm vào đó, người dùng viết mã để thêm vào
một vài đặc tả như là tên của tệp đầu vào, đầu ra
và các tham số tùy chỉnh (như tham số - số máy thực
hiện map, số máy thực hiện reduce). Sau đó người
dùng gọi đến hàm MapReduce, truyền vào đó những
đối tượng cụ thể (là những đối tượng mapreduce đã
tạo trước đó). Mã của người dùng được liên kết với
thư viện MapReduce. Phụ lục A chứa đầy đủ mã
chương trình cho ví dụ này.
2.2 Kiểu dữ liệu
Đoạn mã giả trong ví dụ trước sử dụng kiểu xâu
trong đầu vào và đầu ra. Tuy nhiên người dùng có
thể sử dụng bất kỳ kiểu dữ liệu nào cho hàm map
và reduce theo mẫu sau:
map (k1, v1) → list(k2, v2)
reduce (k2, list(v2)) → list(v2)
Lưu ý:
1. k1, k2, v1, v2 là các kiểu dữ liệu, chẳng hạn
như String, Integer, Object ... hay bất cứ kiểu
dữ liệu nào do người dùng định nghĩa.
2. Các cặp key/value đầu vào và đầu ra trong
MapReduce không thuộc cùng lĩnh vực. Như
trong ví dụ trước, đầu vào là các cặp Document-
Name/DocumentContent đầu ra là cặp Word/-
count. Mặt khác, các cặp key/value tạm thời có
cùng lĩnh vực với các cặp key/value đầu ra.
3. Đầu ra của hàm reduce thuộc kiểu list(v2)
nhưng đó chưa phải kết quả cuối cùng của toàn
bộ quá trình MapReduce. Kết quả cuối cùng
mà người dùng nhận được là các cặp key/value
với kiểu là (k2, list(v2)) với list(v2) là các
kết quả được trả về bởi hàm reduce.
2.3 Các ví dụ khác
Sau đây là một vài ví dụ về các chương trình thú vị
có thể dễ dàng thực hiện bằng MapReduce.
Grep phân tán: cho phép người dùng nhập vào
một mẫu (pattern), hệ thống tìm trong tập các văn
bản và trả về các dòng (line) khớp với mẫu đã cho.
Hàm map nhận đầu vào là một cặp pattern/line
đầu ra là cặp pattern/line nếu line khớp (match)
với patten. Hàm reduce đơn giản chi cần trả về danh
sách các list(line) mà nó nhận được.
Đếm số lượt truy cập trên một URL: Khi người
dùng truy cập vào một trang nào đó, url của trang
đó sẽ được ghi vào một file log. Hàm map nhận đầu
vào là các file log và trả về <URL,1>. Hàm reduce
tính tổng các value của cùng một URL và trả về cặp
<URL,total count>.
Đồ thị web-link ngược: Thông thường một trang
web chứa các link trỏ đến các trang web khác. Trong
một số trường hợp ví dụ như để tính PageRank của
một trang web ta cần biết có những trang web nào
trỏ đến nó. Hàm map nhận đầu vào là một cặp
(source, list(target)) trả về các cặp (target,
source). Hàm reduce chỉ cần trả về list(source)
mà nó nhận được từ đầu vào.
Term-Vector cho văn bản: Một term vector là
một danh sách các cặp từ/tần suất xuất hiện của từ
của một hay nhiều văn bản. Hàm map nhận đầu vào
là (url, content) trả về một tập ((url, word),
1), hàm reduce tính tổng các value và trả về số
frequency cho mỗi từ xuất hiện trong 1 văn bản.
Kết quả ta được ((url, word), frequency). Tiếp
tục thực hiện MapReduce, hàm map trả về (url,
(word, frequency)) và hàm reduce trả về danh
sách value mà nó nhận được từ đầu vào.
Chỉ mục ngược: Là một cấu trúc dữ liệu lưu trữ từ
và danh sách id của các văn bản chứa từ đó: (word,
list(docId)). Hàm map nhận đầu vào là (docId,
content) trả về một tập các cặp (word, docId),
hàm reduce lọc bỏ những docId trùng lặp vả trả về
các docId cho mỗi từ.
Sắp xếp phân tán: Hàm map trích từ khóa từ
mỗi bản ghi và trả về các cặp (key/record). Hàm
reduce trả về những cặp không đổi. Việc tính toán
dựa trên hàm chia được mô tả trong phần 4.1 và
hàm sắp xếp mô tả trong phần 4.2.
3 Triển khai
Có nhiều cách để triển khai thuật toán MapReduce,
lựa chọn cách nào là phụ thuộc vào môi trường cụ
thể. Ví dụ một cách triển khai có thể phù họp với
một hệ thống máy tính chia sẻ bộ nhớ cỡ nhỏ hay
một hệ thống lớn cho phép chia sẻ bộ nhớ không
đồng bộ trên nhiều vi xử lý cho đến một hệ thống
máy tính lớn được kết nối thông qua mạng.
Trong phần này mô tả một cách triển khai trên
môi trường tính toán được sử dụng bởi Google: nhiều
cụm máy tính phố thông được kết nối với nhau thông
qua mạng Ethernet.
1. Máy tính với cấu hình CPU 2 nhân x86, 2-4 GB
Ram, chạy Linux.
2. Phần cứng mạng từ 100 Mb/s đến 1Gb/s giữa
các tầng máy tính, và giữa các máy tính với
nhau.
3. Mỗi cụm chứa từ hàng trăm đến hàng ngàn máy
tính do đó khả năng chúng bị lỗi là hoàn toán
có thể.
4. Hệ thống lưu trữ được cung cấp bởi những đĩa
cứng phổ thông, gắn trực tiếp trên mỗi máy
tính. Một hệ thống file phân tán được phát triển
nội bộ được sử dụng để quản lý dữ liệu trên các
đĩa cứng này. Hệ thống file sử dụng các bản sao
để mang lại khả năng sẵn sàng và độ tin cậy
cao trên một phần cứng không đáng tin cậy.
5. Người sử dụng đưa công việc của mình lên hệ
thống điều phối. Mỗi công việc bao gồm một
tập các tác vụ, và nó được hệ thống điều phối
gửi đến cho những máy tính đang sẵn sàng trên
cụm.
3.1 Tổng quan quá trình thực thi
Hàm Map được thực thi phân tán trên nhiều máy
tính bằng cách chia tự động dữ liệu đầu vào thành
một tập M mảnh. Các mảnh này có thể được xử
lý song song bởi nhiều máy tính. Hàm Reduce cũng
được thực thi phân tán bằng cách chia không gian
key tạm thời (Không gian key: là tập tất cả các key,
trong bài toán wordcount không gian key chính là
tập các từ được tạo ra từ hàm map) thành R phần
bằng cách sử dụng hàm hàm chia (chẳng hạn như
hash(key) mod R). Số lượng các phần (R) có thể
tùy chỉnh được bởi người dùng.
Hình 1 cho thấy sơ đồ luồng hoạt động của
MapReduce được cài đặt bởi Google. Khi người sử
dụng gọi MapReduce, quá trình thực hiện như sau:
1. Thư viện MapReduce được sử dụng trong
chương trình đầu tiên sẽ chia nhỏ dữ liệu đầu
vào thành M mảnh thông thường có kích thước
từ 16-64 MB (có thể tùy biến được bởi người sử
dụng). Sau đó chương trình sẽ được tải lên các
máy tính đang sẵn sàng trên cụm và bắt đầu
thực thi.
2. Một máy tính trong số chúng sẽ được chọn làm
master. Các máy còn lại là worker, chúng sẽ
nhận tác vụ từ master. Sẽ có M tác vụ map và
R tác vụ reduce cần thực hiện. Master chọn các
worker đang rảnh rỗi để giao cho mỗi worker
một tác vụ map hoặc reduce.
3. Một worker khi nhận tác vụ map sẽ đọc dữ liệu
trong mảnh tương ứng. Nó thực thi hàm Map
(được định nghĩa bởi người dùng) với đầu vào
là một cặp key/value được lấy ra từ dữ liệu vừa
đọc. Các cặp key/value tạm thời trả về từ hàm
Map sẽ được lưu trên bộ nhớ tạm.
4. Theo chu kỳ, các cặp key/value tạm thời sẽ được
ghi ra đĩa của map worker và được chia thành
R phần bằng cách sử dụng hàm chia. Thông tin
về vị trí của các cặp key/value tạm thời trên
đĩa được gửi về cho master, sau đó master sẽ
chuyển những thông tin này cho reduce worker.
5. Reduce worker nhận được những thông tin này
sẽ sử dụng lời gọi từ xa để đọc dữ liệu tạm thời
nằm trên ổ đĩa của các map worker. Sau khi có
đủ dữ liệu nó sẽ sắp xếp chúng theo key để gom
lại những key giống nhau. Việc sắp xếp là cần
thiết bởi sẽ có nhiều key được chuyển đến một
tác vụ reduce. Nếu dữ liệu quá lớn không thể
xử lý trên bộ nhớ nó sẽ thực hiện việc sắp xếp
ngoài.
6. Sau khi sắp xếp, với mỗi một key và một tập
value cùng key, reduce worker sẽ gọi một hàm
Reduce (được định nghĩa bởi người dùng) để xử
lý. Kết quả của hàm Reduce sẽ được tổng hợp
vào một file tương ứng với tác vụ reduce.
7. Sau khi tất cả các tác vụ map và reduce đã đươc
thực hiện xong, master sẽ kết thúc chương trình
MapReduce và trả điều khiển lại cho chương
trình của người dùng.
Hình 1: Quá trình thực thi
Sau khi hoàn tất, kết quả thực thi của MapReduce
được lưu trên R file (Mỗi tác vụ reduce sinh ra một
file). Người dùng không cần phải gộp R file này
thành một, những file này thường sẽ làm đầu vào
cho một quá trình MapReduce khác hoặc được sử
dụng trong các ứng dụng phân tán mà cần dữ liệu
đầu vào được chia thành nhiều file.
3.2 Cấu trúc dữ liệu trong master
Master cần duy trì một vài cấu trúc dữ liệu. Với mỗi
một tác vụ map và reduce, nó sẽ lưu giữ trạng thái
(chưa thực hiện, đang thực hiện hay hoàn thành),
và định danh của máy worker (trừ tác vụ chưa thực
hiện).
Thông tin vị trí của các cặp key/value tạm thời
được chuyển từ tác vụ map sang tác vụ reduce thông
qua master. Vì vậy với mỗi tác vụ map được hoàn
thành, master sẽ lưu trữ địa chỉ và kích thước của
R phần dữ liệu từ mỗi tác vụ map. Những thông tin
này sau đó được gửi đến cho các worker đang làm
tác vụ reduce.
3.3 Khả năng chịu lỗi
Thuật toán MapReduce được thiết kế để giúp xử lý
lượng dữ liệu rất lớn trên hàng trăm tới hàng ngàn
máy tính, nó phải có khả nằng xử lý khi một vài
máy tính trong số đó gặp sự cố.
Worker bị lỗi
Master thường xuyên liên lạc với các worker. Nếu nó
không nhận được trả lời từ worker sau một khoảng
thời gian nào đó, master sẽ đánh dấu worker đó bị
lỗi. Tất cả các tác vụ map đã hoàn thành bởi worker
này sẽ được đặt lại trạng thái chưa thực hiện, và vì
thế chúng có thể được thực hiện lại bởi một worker
khác. Thông thường bất kỳ một tác vụ map hay
reduce nào đang được thực hiện mà worker gặp lỗi
đều phải thực hiện lại.
Những tác vụ map đã hoàn thành phải thực hiện
lại bởi vì dữ liệu key/value tạm thời chỉ được lưu trên
đĩa địa phương của máy đang gặp lỗi nên không thể
truy cập được. Những tác vụ reduce không cần thực
hiện lại vì dữ liệu đầu ra của chúng được lưu trên
hệ thống file toàn cục (có các bản sao trên các máy
khác).
Khi một tác vụ map đã được thực hiện lần đầu
bởi worker A sau đó được thực hiện lại bởi worker
B (vì A bị lỗi), tất cả các worker thực thi tác vụ
reduce sẽ được thông báo về việc thực hiện lại này.
Bất kỳ tác vụ reduce nào chưa đọc được dữ liệu từ
A sẽ đọc dữ liệu từ B.
MapReduce có khả năng co giãn (mở rộng hoặc
thu hep) khi một số máy tính gặp sự cố. Ví dụ, trong
một quá trình thực thi MapReduce, mạng cần được
bảo trì trên một cluster đang chạy khiến cho 80 máy
không thể liên lạc được trong vài phút. Master của
MapReduce sẽ yêu cầu thực thi lại công việc đã hoàn
thành bởi các worker đó, và tiếp tục thực hiện các
công việc tiếp theo cho đến khi hoàn thành quá trình
MapReduce.
Master bị lỗi
Có thể định kỳ ghi lại những cấu trúc dữ liệu của
master như được mô tả ở trên một cách dễ dàng.
Nếu master gặp sự cố, một master khác có thể khởi
động từ bản sao lưu dữ liệu gần nhất của master.
Tuy nhiên, do chỉ có một master nên nếu nó gặp sự
cố thì chương trình MapReduce sẽ không thể hoàn
thành. Người dùng có thể kiểm tra lại trạng thái và
khởi động lại chương trình nếu muốn.
Ngữ nghĩa của chương trình khi gặp lỗi
Kết quả của chương trình MapReduce và một
chương trình chạy tuần tự tương ứng nếu không có
lỗi phải giống nhau trên cùng dữ liệu đầu vào.
Chương trình MapReduce dựa trên kết quả của
mỗi tiến trình map, reduce để đảm bảo điều kiện
trên. Mỗi tiến trình khi thực hiện tác vụ sẽ ghi kết
quả của chúng ra các file tạm thời. Một tiến trình
reduce chỉ tạo ra một file, và một tiến trình map
tạo ra R file (mỗi file cho một tiến trình reduce).
Khi tiến trình map hoàn tất worker gửi thông báo
kèm với tên của R file tạm này về cho master. Nếu
master nhận được thông báo hoàn thành của một
tiến trình map đã hoàn thành trước đó rồi, nó sẽ bỏ
qua nó. Nếu không nó sẽ ghi lại tên của R file vào
cấu trúc dữ liệu của master.
Khi một tiến trình reduce hoàn thành, reduce
worker tự động đổi tên các file tạm của nó thành
file output cuối cùng. Nếu cùng tác vụ reduce được
thực hiện trên nhiều máy khác nhau, sẽ tạo ra nhiều
file output giống nhau. Hệ thống file sẽ đảm bảo dữ
liệu cuối cùng chỉ được tạo ra bởi một máy tính.
Một cách tổng quát, nếu quy trình thực hiện map
và reduce đã được xác định thì ngữ nghĩa của chương
trình MapReduce tương đương với một chương trình
được thực hiện tuần tự. Điều này giúp cho lập trình
viên có thể dễ dàng hiểu được hành vi chương trình
của họ. Nếu quá trình thực hiện map và reduce là
không xác định, chúng tôi cung cấp ngữ nghĩa yếu
hơn nhưng vẫn đảm bảo tính hợp lý. Trong thực tế
đầu ra của tác vụ reduce R1 chưa xác định là tương
đương với đầu ra của tác vụ R1 mà được thực hiện
tuần tự. Tuy nhiên đầu ra của một tác vụ reduce
R2 khác có thể không đúng với đầu ra khi thực hiện
tuần tự trong một chương trình không xác định.
Xem xét tác vụ map M và hai tác vụ reduce R1,
R2. Cả R1 và R2 đều cần đầu vào từ kết quả của M,
nhưng R1, R2 có thể đọc kết quả của M từ những
lần thực thi khác nhau nên sẽ không đảm bảo được
ngữ nghĩa của chương trình.
3.4 Truy cập địa phương
Băng thông mạng là tài nguyên khó có thể cải thiện,
nhưng có thể tìm cách để sử dụng nó một cách hợp
lý. Dữ liệu lưu trên hệ thống file phân tán thực chất
được lưu trên đĩa cứng của các máy tính trên cụm.
Hệ thống file chia nhỏ mỗi file thành các block 64
MB và lưu một vài bản sao (thường là 3) của mỗi
block trên các máy tính khác nhau. Master trong
chương trình MapReduce lấy thông tin vị trí của các
file input, nó sẽ điều phối sao cho các map worker
có thể lấy được dữ liệu input của nó ngay trên đĩa
địa phương (của chính map worker đó) hoặc có thể
lấy được dữ liệu ở gần đó (thường trong cùng switch
mạng). Nếu dữ liệu được chia nhỏ và lưu trữ hợp
lý trên các máy tính, việc điều phối có thể giúp đọc
được toàn bộ dữ liệu một cách địa phương mà không
tiêu tốn băng thông mạng, ngay cả trong nhưng
chương trình đòi hỏi tính toán lớn.
3.5 Chi tiết tác vụ
Giai đoạn map được chia thành M phần và reduce
được chia thành R phần như đã mô tả ở trên. Ý
tưởng là M và R có thể rất lớn hơn so với số worker.
Mỗi worker có thể đảm nhận nhiều tác vụ khác nhau
cho phép cân bằng tải một cách linh hoạt, đồng thời
tăng tốc độ khôi phục khi một worker bị lỗi: nhiều
tác vụ map có thể hoàn thành bằng cách thực hiện
trên tất cả các máy tính.
Giới hạn về độ lớn của M và R trong thực tế là
bao nhiêu? Như đã mô tả ở trên master cần phải
thực hiện O(M + R) điều phối và lưu trữ O(M ∗ R)
trạng thái trên bộ nhớ. (Kích thước bộ nhớ là có
hạn nhưng tuy nhiên O(M ∗ R) trạng thái thường
chỉ chiếm khoảng 1 byte cho mỗi cặp tác vụ map/re-
duce.)
Thêm vào đó, R là số thường được quy định bởi
người dùng bởi vì đầu ra của mỗi tác vụ reduce
sẽ là một mảnh của dữ liệu đầu ra. Trong thực tế,
việc chọn M sao cho mỗi tác vụ chỉ cần xử lý một
lượng dữ liệu trong khoảng từ 16-64MB từ dữ liệu
đầu vào (đem lại hiệu quả cao nhất do có thể tối ưu
địa phương như được mô tả ở trên). Trong khi đó
R lại được đề nghị là một số không quá lớn so với
số lượng máy worker. Thông thường với tính toán
MapReduce chọn M = 200, 000 và R = 5, 000 khi
chạy trên 2, 000 máy worker.
3.6 Tác vụ dự phòng
Một trong những nguyên nhân thường thấy làm tăng
thời gian thực thi của MapReduce là “Straggler”:
một máy tính mà cần nhiều thời gian một cách bất
thường để xử lý một tác vụ map hoặc reduce trong
quá trình tính toán. Straggler xuất hiện có thể do
hỏng hóc. Ví dụ, trên một máy tính với ổ địa kém
có thể xảy ra lỗi làm giảm tốc độ đọc từ 30 MB/s
xuống còn 1 MB/s. Hệ thống điều phối cụm có thể
phải điều phối tác vụ khác cho máy tính này.
Có một vài biện pháp để làm giảm bớt ảnh hưởng
của Straggler. Khi một chương trình MapReduce sắp
kết thúc, master điều phối thực thi tác vụ hỗ trợ đối
với những tác vụ còn đang thực hiện. Một tác vụ
được đánh dấu là hoàn tất khi việc thực thi chính
tắc hoặc hỗ trợ hoàn tất. Cách làm này làm tiêu
tốn thêm tài nguyên tính toán nhưng không quá vài
phần trăm. Như trong ví dụ về giải thuật sắp xếp
sẽ đươc nói tới ở phần 5.3 mất nhiều thời gian hơn
44% khi tác vụ hỗ trợ bị tắt.
4 Các tinh chỉnh
Mặc dù chỉ cần viết các hàm Map và Reduce là đủ
cho hầu hết các yêu cầu, xong người dùng vẫn có
thể có các tinh chỉnh hữu ích khác. Chúng được mô
tả trong phần này.
4.1 Hàm phân chia
Những người dùng MapReduce xác định số lượng
các tác vụ reduce (chính là số lượng các tập tin đầu
ra) mà họ mong muốn (R). Dữ liệu được phân chia
trên các tác vụ này bằng cách sử dụng một hàm
phân chia trên các key trung gian. Hàm phân chia
mặc định là hàm băm (ví dụ: “hash (key) mod R”).
Điều này khiến cho các phần dữ liệu được phân chia
khá cân bằng. Tuy nhiên, trong một số trường hợp,
việc phân chia dữ liệu bằng một số hàm phân chia
khác sẽ mang lại kết quả tốt hơn. Ví dụ, đôi khi các
key đầu ra là các URL , chúng ta muốn với tất cả các
url trong cùng một host đều cùng được xử lý trên
một máy và kết quả của chúng nằm trong cùng file
đầu ra. Để hỗ trợ các tình huống này, người sử dụng
thư viện MapReduce có thể đưa ra hàm phân chia
đặc biệt. Ví dụ, sử dụng “hash (Hostname (urlkey))
mod R” là hàm phân chia, như vậy thì tất cả các
URL từ cùng một host sẽ có các kết quả khi thực
hiện hàm reduce đều trong một tập tin đầu ra.
4.2 Đảm bảo thứ tự
Chúng tôi đảm bảo rằng trong một phần dữ liệu
nhất định, các cặp key/value trung gian được xử
lý theo thứ tự tăng dần của key. Việc này giúp dễ
dàng tạo ra một phần dữ liệu đầu ra đã được sắp
xếp. Điều này hữu ích khi tệp tin đầu ra cần hỗ trợ
cho việc tra cứu tìm kiếm theo key, hoặc khi người
dùng các tập tin đầu ra cảm thấy hữu ích khi có
trong tay dữ liệu đã được sắp xếp.
4.3 Hàm Combiner
Trong một số trường hợp, có sự lặp lại đáng kể các
key trung gian được tạo ra bởi các tác vụ Map, đồng
thời hàm Reduce do người dùng viết lại có tính chất
giao hoán và kết hợp. Một ví dụ điển hình cho điều
này là bài toán đếm từ trong phần 2.1. Vì tần số của
từ có xu hướng tuân theo phân bố Zipf, mỗi tác vụ
Map sẽ tạo ra hàng trăm hoặc hàng nghìn bản ghi
có dạng <the, 1>. Tất cả các bản ghi này sẽ được
gửi qua mạng tới một tác vụ reduce và sau đó được
cộng lại bởi hàm Reduce để tạo ra một số, như vậy
hiệu năng của hệ thống sẽ giảm. Do đó, chúng tôi
cho phép người dùng chỉ định một hàm Combiner
tùy chọn để có thể kết hợp một số phần dữ liệu này
trước khi nó được gửi qua mạng.
Hàm Combiner được thực hiện trên các máy thực
hiện tác vụ Map. Thông thường, nó chính là đoạn
mã nguồn của hàm reduce. Sự khác biệt duy nhất
giữa hàm reduce và hàm combiner là cách mà thư
viện MapReduce xử lý đầu ra của chúng. Đầu ra
của một hàm reduce được ghi vào tập tin đầu ra
cuối cùng (final output), còn đầu ra của một hàm
combiner được ghi vào một tập tin trung gian để gửi
đến một tác vụ reduce.
Việc kết hợp một số phần dữ liệu ở ngay trên máy
thực hiện tác vụ map trước khi gửi qua mạng sẽ tăng
tốc độ đáng kể cho nhiều hoạt động MapReduce.
Phụ lục A chứa một ví dụ sử dụng hàm combiner.
4.4 Các kiểu đầu vào và đầu ra
Thư viện MapReduce hỗ trợ việc đọc dữ liệu đầu
vào theo nhiều định dạng khác nhau. Ví dụ, đầu vào
dạng "text" xử lý mỗi dòng như một cặp key/value:
key chính là độ lệch của dòng trong tệp và value là
nội dung của dòng. Một định dạng khác được hỗ trợ
lưu trữ một chuỗi các cặp key/value được sắp xếp
theo key. Mỗi kiểu đầu vào được cài đặt để biết cách
tự phân chia nó thành các khoảng phù hợp để xử lý
bằng các tác vụ map riêng biệt (ví dụ: với dữ liệu
text, việc chia tách khoảng đảm bảo biên phân chia
chỉ xuất hiện ở ranh giới các dòng - như vậy các
dòng sẽ được xử lý như một cặp key/value). Người
dùng có thể tự thêm hỗ trợ cho một kiểu đầu vào
mới bằng cách cung cấp một cài đặt giao diện reader
đơn giản. Tuy vậy, phần lớn người dùng chỉ cần sử
dụng các kiểu đầu vào đã được thư viện MapReduce
hỗ trợ là đã đủ cho yêu cầu của mình.
Một reader không nhất thiết phải đọc dữ liệu từ
một tập tin.Các reader có thể đọc dữ liệu là các bản
ghi từ một cơ sở dữ liệu, hoặc từ các cấu trúc dữ
liệu được ánh xạ trong bộ nhớ.
Tương tự như vậy, chúng tôi cũng hỗ trợ một tập
các định dạng dữ liệu đầu ra khác nhau, và cũng rất
dễ dàng cho người dùng khi muốn thêm hỗ trợ cho
các kiểu đầu ra mới.
4.5 Side-effects
Trong một số trường hợp, người sử dụng MapReduce
thấy có ích khi tạo ra các tập tin phụ như đầu ra bổ
sung từ các hoạt động map/reduce. Chúng tôi dựa
vào những người viết ứng dụng (application writer)
tạo ra các hiệu ứng lề duy nhất và không đổi như
thế. Thông thường ứng dụng viết vào một tập tin
tạm thời và atomically đổi tên tập tin này một khi
nó đã được tạo ra đầy đủ.
Chúng tôi không cung cấp hỗ trợ cho các commit
hai pha nguyên tố (atomic two-phase com- mits) của
nhiều tệp đầu ra được tạo ra bởi cùng một tác vụ
nhất định. Do đó, các tác vụ tạo ra nhiều tệp đầu
ra với các yêu cầu nhất quán về các tệp tin chéo nên
được xác định. Hạn chế này không phải là một vấn
đề quá lớn trong thực tế.
4.6 Bỏ qua các bản ghi tồi
Đôi khi có lỗi trong mã nguồn của người dùng làm
cho hàm Map hoặc Reduce xảy ra sự cố và dừng trên
một số bản ghi. Những lỗi như vậy ngăn cản hoạt
động MapReduce hoàn thành. Cách đối phó thông
thường là sửa lỗi, nhưng đôi khi điều này là không
khả thi. Có thể lỗi này nằm trong thư viện của bên
thứ ba mà mã nguồn không có. Ngoài ra, đôi khi
có thể chấp nhận việc bỏ qua một số bản ghi, ví dụ
như khi thực hiện phân tích thống kê trên một bộ
dữ liệu lớn. Chúng tôi cung cấp một chế độ thực
thi tùy chọn, nhờ đó thư viện MapReduce phát hiện
bản ghi nào gây ra các sự cố và bỏ qua các bản ghi
này để tiếp tục thực hiện quá trình xử lý.
Mỗi worker được cài đặt một trình xử lý tín hiệu
nhận các vi phạm phân đoạn và lỗi bus. Trước khi
gọi tác vụ Map hay Reduce của người dùng, thư viện
MapReduce lưu trữ số thứ tự tham số trong một biến
toàn cục. Nếu chương trình của người dùng tạo ra
một tín hiệu, trình xử lý tín hiệu sẽ gửi một gói tin
UDP "last gasp" có chứa số thứ tự cho MapReduce
master. Khi master nhìn thấy nhiều hơn một lỗi trên
một bản ghi cụ thể, master sẽ báo rằng bản ghi nên
được bỏ qua khi nó chạy lại các tác vụ Map/Reduce
tương ứng.
4.7 Thực thi cục bộ
Gỡ các lỗi trong các hàm Map/Reduce có thể rất
phức tạp, vì việc tính toán xảy ra trong một hệ thống
phân tán, thường là trên vài ngàn máy, mà các quyết
định giao việc gì cho worker nào thì được thực hiện
tự động bởi master. Để giúp thuận lợi cho việc gỡ
lỗi, lập hồ sơ, và thử nghiệm quy mô nhỏ, chúng
tôi đã phát triển một cơ chế thực thi khác của thư
viện MapReduce là thực hiện tuần tự tất cả công
việc của một hoạt động MapReduce trên máy địa
phương (local). Quyền kiểm soát chúng được cung
cấp cho người dùng, nên việc tính toán có thể được
giới hạn cho các tác vụ map cụ thể. Người dùng gọi
chương trình của họ bằng một cờ đặc biệt và sau đó
có thể dễ dàng sử dụng bất kỳ công cụ gỡ lỗi hoặc
thử nghiệm nào mong muốn (ví dụ: gdb).
4.8 Thông tin trạng thái
Master chạy một máy chủ HTTP ở bên trong và
xuất ra một tập các trang trạng thái cho con người.
Các trang này hiển thị các trạng thái của tiến trình
đang tính toán, chẳng hạn như số lượng tác vụ đã
hoàn thành, số lượng tác vụ đang thực thi, các byte
đầu vào, các byte của dữ liệu trung gian, các byte
đầu ra, tốc độ xử lý, vv. Các trang cũng chứa liên kết
đến lỗi tiêu chuẩn và các tập tin đầu ra tiêu chuẩn
được tạo ra bởi mỗi tác vụ. Người dùng có thể sử
dụng các thông tin này để dự đoán việc tính toán sẽ
mất bao lâu, và liệu có nên thêm nhiều tài nguyên
tính toán hay không. Các thông tin này cũng có thể
được sử dụng để chỉ ra khi nào tính toán chậm hơn
nhiều so với dự kiến.
Ngoài ra, ở mức cao hơn, các trang trạng thái
cho biết worker nào đã bị lỗi và các tác vụ map và
reduce nào đang được xử lý trên worker đó khi bị
lỗi. Thông tin này khá hữu ích khi muốn tìm kiếm
lỗi trong chương trình của người dùng.
4.9 Bộ đếm
Thư viện MapReduce cung cấp một công cụ bộ đếm
để tính các biến cố/sự cố của các sự kiện khác nhau.
Ví dụ: chương trình của người dùng có thể muốn
đếm tổng số từ đã được xử lý hoặc số tài liệu của
Đức đã được lập chỉ mục, v.v.
Để sử dụng bộ đếm này, chương trình của người
dùng tạo một đối tượng bộ đếm được đặt tên và
sau đó tăng bộ đếm một cách hợp lý trong hàm
Map/Reduce . Ví dụ:
Counter* uppercase;
uppercase = GetCounter("uppercase");
map(String name, String contents):
for each word w in contents:
if (IsCapitalized(w)):
uppercase->Increment();
EmitIntermediate(w, "1");
Các giá trị của (bộ đếm) từ các máy worker riêng
lẻ được định kỳ lan truyền đến master (piggybacked
trên ping response). Master tổng hợp giá trị bộ đếm
từ các tác vụ map và reduce thành công, rồi trả
lại chúng cho chương trình của người dùng khi hoạt
động MapReduce hoàn tất. Các giá trị bộ đếm hiện
tại cũng được hiển thị trên trang trạng thái của
master để con người có thể xem tiến trình tính toán
trực tiếp . Khi tổng hợp giá trị bộ đếm, Master sẽ
loại bỏ việc thực thi trùng lặp của cùng một tác
vụ map/reduce để tránh đếm hai lần. (Sự thực hiện
trùng lặp có thể phát sinh từ việc chúng ta sử dụng
các tác vụ sao lưu và từ việc chạy lại các tác vụ do
lỗi.)
Một số giá trị bộ đếm được tự động duy trì bởi
thư viện MapReduce, chẳng hạn như số lượng cặp
key/value đầu vào đã được xử lý và số lượng cặp
key/value đã được tạo ra.
Nhiều người dùng thấy rằng, công cụ bộ đếm này
hữu ích khi muốn kiểm tra nhanh hành vi của hoạt
động MapReduce. Ví dụ, trong một số hoạt động
MapReduce, người dùng có thể muốn đảm bảo rằng
số lượng các cặp đầu ra được tạo ra chính xác bằng
số cặp đầu vào được xử lý, hoặc rằng phần tài liệu
Đức đã được xử lý nằm trong một phần cho phép
của tổng số tài liệu được xử lý.
5 Hiệu năng
Trong phần này chúng tôi sẽ đo hiệu năng của mô
hình MapReduce trên hai bài toán tính toán chạy
trên một cụm lớn các máy. Một bài toán tính toán
sẽ thực hiện tìm kiếm trên xấp xỉ một tetabyte dữ
liệu để tìm ra một kiểu mẫu cụ thể nào đó. Một bài
toán khác là thực hiện công việc sắp xêp trên xấp
xỉ một tetabyte dữ liệu.
Hai chương trình trên, mỗi chương trình là tiêu
biểu cho một tập con rộng lớn của các chương trình
trong thực tế mà được viết bởi người lập trình
MapReduce. Một bài toán thực hiện việc trộn dữ
liệu từ một thể hiện dữ liệu với những thể hiện khác.
Một lớp bài toán khác là trích rút dữ liệu phù hợp
từ một lượng lớn dữ liệu.
5.1 Cấu hình cụm máy tính
Tất cả các chương trình được thực thi trên một cụm
chứa khoảng 1800 máy. Mỗi máy có hai vi xử lý Intel
Xeon 2GHz với công nghệ HyperThreading, 4GB bộ
nhớ chính, hai ổ cứng 160GB IDE, và một đường
truyền Ethernet tốc độ một gigabit. Các máy được
sắp xếp tạo thành một mạng chuyển mạch hình cây
hai cấp với xấp xỉ 100-200 Gbps băng thông tại nút
gốc. Tất cả các máy trong cùng một phạm vi định
danh nên thời gian truyền thông giữa hai máy bất
kì là nhỏ hơn một phần nghìn giây.
Một phần của bộ nhớ chính, khoảng từ 1-1.5GB
được giữ lại để phục vụ cho những tác vụ khác trong
cụm. Các chương trình được chạy vào chiều cuối
tuần nên các chíp xử lý, ổ cứng, đường truyền mạng
là hầu như rảnh rỗi.
5.2 Grep
Chương trình duyệt qua mười tỉ bản ghi, mỗi bản
ghi có kích thước 100 bytes, tìm kiếm mẫu 3 kí tự
tương đối ít xuất hiện(những mẫu xuất hiện trong
92,337 bản ghi). Đầu vào được chia ra thành từng
mảnh, mỗi mảnh xấp xỉ khoảng 64MB( M=15000).
Toàn bộ dữ liệu đầu ra được đặt vào một tệp(R=1)
Biểu đồ 2 biểu diễn quá trình thực thi tính toán theo
thời gian. Trục Y biểu diễn tốc độ dữ liệu đầu vào
được duyệt qua. Tốc độ tăng dần theo số lượng máy
được phân công tính toán, và cao nhất là 30 GB/s
khi 1764 máy được phân công tác vụ.Khi tác vụ Map
kết thúc, tốc độ này bắt đầu giảm và xuống đến 0 sau
khoảng 80 giây. Toàn bộ quá trình tính toán khoảng
150 giây từ khi bắt đầu đến khi kết thúc. Thời gian
này đã bao gồm quả chi phí khởi động. Tổng chi phí
bao gồm thời gian truyền chương trình đến cho các
máy tính toán, thời gian trễ do việc tương tác với
GFS để mở tệp dữ liệu và lấy về thông tin cần thiết.
Hình 2: Tốc độ truyền dữ liệu theo thời gian
5.3 Sắp xếp
Chương trình sắp xếp thực hiện sắp xếp 10 tỉ bản
ghi, mỗi bản ghi có kích thước 100 byte(xấp xỉ một
tetabyte dữ liệu). Chương trình này được mô hình
theo tiêu chuẩn TeraSort [10]. Chương trình chứa ít
hơn 50 dòng mã. Hàm Map gồm 3 dòng mã, thực
hiện trích rút ra 10-byte key sắp xếp từ một dòng kí
tự và sau đó đưa ra một key và dòng kí tự gốc như
một cặp key/value. Chúng tôi sử dụng một hàm đã
xây dựng Identity như là hàm Reduce. Hàm này sẽ
chuyển cặp cặp key/value không bị thay đổi gì như
là cặp key/value đầu ra. Kết quả được sắp xếp cuối
cùng được ghi ra một tập hợp dưới dạng tệp GFS
sao lưu thành hai bản sao.
Như trước đó, dữ liệu đầu vào được chia thành
các phần 64MB(M=15000). Chúng tôi cũng chia tệp
được sắp xếp thành 4000 tệp(M=4000). Hàm phân
chia sử dụng các byte đầu của key để tách các key
thành từng phần trong số các phần R.
Hàm phân mảnh cho bài toán TeraSort được xây
dựng dựa trên thông tin phân bố của các khóa.
Trong các chương trình sắp xếp thông thường, chúng
tôi cần thêm một toán tử MapReduce để lấy mẫu
key và sử dung phân bố của key để tính ra các điểm
phân chia cho lượt sắp xếp cuối cùng.
Biểu đồ 3 (a) thể hiện quá trình thực thi thông
thường của chương trình sắp xếp. Biểu đồ trên cùng
phía trên trái chỉ ra tốc độ đọc dữ liệu đầu vào.
Tốc độ đạt mức cao nhất khoảng 13GB/s và sau đó
nhanh chóng giảm bởi vì tác vụ Map đã xong trước
khoảng thời gian 200 giây. Chú ý là tốc độ đọc dữ
liệu là nhỏ hơn so với bài toán grep. Nguyên nhân
chính là bởi vì tác vụ Map dành hầu hết thời gian
cho việc ghi các kết quả đầu ra trung gian ra ổ cứng
cục bộ. Trong khi đó đầu ra trong bài toán grep có
kích thước bé hơn rất nhiều.
Biểu đồ bên trái ở giữa thể hiện tỉ lệ dữ liệu được
gửi từ các tác vụ Map đến các tác vụ Reduce. Qúa
trình trộn dữ liệu diễn ra ngay sau khi tác vụ Map
đầu tiên hoàn thành. Trong biểu đồ, gò đầu tiên
là tập các tác vụ Reduce đầu tiên, xấp xỉ khoảng
1700 tác vụ(toàn bộ tác vụ Reduce được phân cho
1700 máy, mỗi máy thực hiện nhiều nhất một tác
vụ Reduce tại một thời điểm). Xấp xỉ khoảng 300
giây cho việc tính toán, một vài trong số các tác vụ
Hình 3: Tỉ lệ truyền dữ liệu theo thời gian cho các giao đoạn của quá trình tính toán
Reduce đầu tiên hoàn thành và chúng ta bắt đầu
thực hiện việc trộn dữ liệu cho các tác vụ Reduce
còn lại. Toàn bộ quá trình trộn tốn khoảng 600 giây.
Biểu đồ dưới cùng bên trái thể hiện tỉ lệ dữ liệu
sau khi được sắp xếp và được tác vụ Reduce ghi
ra tệp đầu ra. Có một khoảng trễ giữa khoảng thời
gian trộn đầu tiên và quá trình ghi là do các máy
cần tốn thời gian cho việc trộn các kết quả trung
gian. Qúa trình ghi tiếp tục với tỉ lệ 2-4 GB/s trong
một khoảng thời gian. Toàn bộ quá trình ghi kết
thúc trong khoảng 850 giây. Bao gồm cả tổng chi
phí khởi động, quá trình thực hiện trong 891 giây.
Kết quả này cũng tương tự với kết quả tốt nhất được
báo cáo hiện tại 1057 giây cho điểm chẩm TeraSort.
Một vài điều chú ý: tỉ lệ trong quá trình đầu vào
cao hơn tỉ lệ trong quá trình trộn và quá trình xuất
ra lý do là bởi việc tối ưu cục bộ của chúng tôi - tất
cả dữ liệu được đọc từ các ổ cứng cục bộ và bỏ qua
những giới hạn tương đối trong băng thông mạng.
Tỉ lệ trộn là cao hơn tỉ lệ trong quá trình xuất ra
là bởi vì quá trình xuất ra, chúng tôi viết ra thêm
hai bản sao lưu cho dữ liệu đã được sắp xếp(chúng
tôi tạo ra hai bản sao cho kết quả đầu ra vì lý do
tin cậy và sẵn sàng của thông tin). Chúng tôi viết
hai bản sao bởi đó là kĩ thuật cho tính tin cậy và
tính sẵn sàng của dữ liệu cho các hệ thống tệp dữ
liệu cơ bản. Băng thông mạng cho việc ghi dữ liệu
có thể được giảm nếu như hệ thống tệp cơ bản sử
dụng "mã hóa xóa bỏ" thay vì sao chép lại.
5.4 Ảnh hưởng của quá trình sao lưu
tác vụ
Trong biểu đồ 3 (b), chúng tôi đưa ra quá trình thực
thi chương trình sắp xếp nhưng bỏ qua tác vụ sao
lưu tác vụ. Luồng thực thi là giống như đã đưa ra ở
biểu đồ 3 (a), ngoại trừ là có một khoảng dài phía
cuối hầu như rất ít khi có sự xuất hiện của hoạt
động ghi. Sau 960 giây, tất cả ngoại trừ còn lại 5
tác vụ Reduce đã hoàn thành. Tuy nghiên, những
tác vụ Reduce chạy chậm này không kết thúc đến
300 giây sau. Toàn bộ quá trình tính toán mất 1283
giây, tăng 40% trong tổng thời gian.
5.5 Vấn đề máy tính toán lỗi
Trong biểu đồ 3 (c), chúng tôi thể hiện quá trình
thực thi của chương trình sắp xếp, tại đó chúng tôi
cố ý tắt đi 200 trong sô 1746 tiến trình làm việc trong
một vài phút khi tính toán. Ngay lập tức, bộ lập lịch
trên cụm khởi động lại một tiếng trình làm việc mới
tại máy này(bởi vì chỉ có tiến trình bị ngừng, còn
các máy vẫn hoạt động tốt). Những lần kết thúc máy
làm việc toán thể hiện như tỉ lệ đầu vào âm bởi vì
một vài tác vụ Map đã hoàn thành trước đó biến
mất (bởi vì những tác vụ Map tương ứng với máy
làm việc cũng bị kết thúc theo). Việc thực thi lại các
tác vụ Map lặp lại rất nhanh chóng. Toàn bộ quá
trình tính toán hoàn thiện trong 933 giây bao gồm
cả tổng chi phí khởi động (chỉ tăng 5% so với thời
gian thực thi thông thường).
6 Thử nghiệm
Chúng tôi viết phiên bản đầu tiên cho thư viện
MapReduce vào tháng 2 năm 2003 và tạo ra những
cải thiện đáng kể vào tháng 8 năm 2003, bao gồm cả
việc tối ưu hóa địa phương, cân bằng tải động của
quá trình thực thi trong các máy. Thời điểm này,
chúng tôi vô cùng ngạc nhiên về tính ứng dụng rộng
rãi của thư viện MapReduce đối với các công việc
chúng tôi đang làm. Nó được sử dụng trong nhiều
lĩnh vực của Google, bao gồm:
• vấn đề học máy trên phạm vi lớn,
• vấn đề phân cụm cho Google News và các sản
phẩm của Froogle,
• trích rút ra dữ liệu được sử dụng tạo ra báo
cáo về các câu truy xuất thường xuyên (ví dụ:
Google Zeitgeis),
• trích rút ra những thuộc tính của trang web
cho những thí nghiệm và tính nămg mới (ví dụ:
trích rút ra vị trí địa lý từ tập các trang web
for việc tìm kiếm theo địa điểm), và
• tính toán đồ thị trên phạm vi lớn.
Hình 4: Số lượng ví dụ theo thời gian
Bảng 1: MapReduce Job chạy trong tháng 8 năm
2004
Số lượng job 29423
thời gian trung bình hoàn thiện job 634 giây
số ngày máy được sử dụng 79186
Dữ liệu đọc 3288TB
Dữ liệu trung gian tạo ra 758TB
Dữ liệu ghi ra 193TB
Số worker trung bình trên job 157
Số worker trung bình chết trên job 1.2
Số tác vụ map trên job 3351
Số tác vụ reduce trên job 55
Triển khai riêng tác vụ Map 395
Triển khai riêng tác vụ Reduce 269
Triển khai kết hợp Map/Reduce 426
Biểu đồ 4 cho thấy sự tăng trưởng nhanh chóng
về số lượng chương trình MapReduce riêng rẽ được
ghi lại bởi hệ thống quản lý mã nguồn qua thời gian,
từ con số 0 vào đầu năm 2003 đến gần 900 chương
trình vào cuối tháng 9 nằm 2004. MapReduce đã rất
thành công bởi vì nó có cho phép viết một chương
trình đơn giản và chạy một cách hiệu quả trên hàng
nghìn máy trong một khóa học nửa giờ, đẩy nhanh
quá trình phát triển và mô hình lặp. Hơn nữa, nó
cho phép người lập trình chưa có kinh nghiệm về hệ
thống phân tán hay song song có thể khai thác một
số lượng lớn các tài nguyên một cách hiệu quả. Tại
điểm kết thúc của mỗi công việc, MapReduce thống
kê về những tài nguyên tính toán được sử dụng bởi
công việc. Trong bảng 1, chúng tôi đưa ra thống kê
cho một tập con các công việc MapReduce chạy tại
Google vào tháng 8 năm 2014.
6.1 Đánh chỉ mục trên phạm vi rộng
Một trong số những sử dụng quan trọng của MapRe-
duce cho đến nay của chúng tôi là việc viết lại hệ
thống tạo ra chỉ mục, hệ thống mà tạo ra các cấu
trúc dữ liệu được sử dụng cho dịch vụ tìm kiếm trang
web của Google. Hệ thống đánh chỉ mục nhận đầu
vào là một tập lớn tài liệu, những tài liệu này được
lấy về thông qua hệ thống thu thâp của chúng tôi,
và được lưu trữ như một tập các tệp GFS. Nội dung
thô của các dữ liệu này là hơn 20 terabytes. Qúa
trình đánh chỉ mục thực hiện như một chuỗi từ 5
đến 10 toán tử MapReduce. Việc sử dụng MapRe-
duce (thay vì truyền thông phân tán tự cung tự cấp
trong các phiên bản trước của hệ thống đánh chỉ
mục) thu được những lợi ích sau:
• Các câu lệnh đánh chỉ mục đơn giản hơn, ngắn
hơn và dễ hiểu hơn, bởi vì những câu lệnh cho
việc vượt qua lỗi, phân tán, song song là ẩn đi
trong thư viện MapReduce. Ví dụ, kích thước
của một pha trong tính toán giảm từ xấp xỉ
3800 dòng code khi viết bởi ngôn ngữ C++
xuống còn xấp xỉ 700 dòng khi viết bởi MapRe-
duce.
• Hiệu năng của thư viện MapReduce là đủ khả
năg để chúng ta có thể giữ những việc tính toán
không liên quan đến nhau theo lý thuyết độc
lập với nhau, thay vì trộn chúng lại với nhau
để tránh những việc dư thừa đối với dữ liệu. Ví
dụ, một thay đổi có thể tốn một vài tháng đối
với hệ thống cũ nhưng chỉ mất vài ngày để thực
hiện trên hệ thống mới.
• Qúa trình đánh chỉ mục trở nên dễ dàng hơn
nhiều để hoạt động, bởi vì hầu hết các vấn đề
gây ra bởi việc hỏng máy, máy hoạt động chậm,
trục trặc về mạng đã được xử lý một cách tự
động bởi thư viện MapReduce mà không cần sự
can thiệp của chương trình nào. Thêm nữa, nó
dễ dàng cải thiện hiệu năng của quá trình đánh
chỉ mục bằng cách thêm máy mới vào cùm máy
đánh chỉ mục.
7 Các công trình liên quan
Nhiều hệ thống đã cung cấp các mô hình lập trình
giới hạn (restricted programming models) và sử
dụng các giới hạn để song song hóa tự động các tính
toán. Ví dụ, một hàm liên kết có thể tính toán trên
các tiền tố của một mảng N phần tử trong khoảng
thời gian log N trên N bộ xử lý bằng cách sử dụng
tính toán tiền tố song song (parallel prefix compu-
tations) [6, 9, 13]. MapReduce được coi là phép đơn
giản hóa và làm sạch các mô hình trên dựa vào kinh
nghiệm làm việc với các tính toán cỡ lớn trong thực
tế. Quan trọng hơn, chúng tôi cung cấp một phép
cài đặt có khả năng chịu lỗi có thể mở rộng lên tới
hàng nghìn bộ xử lý. Trong khi đó, hầu hết các hệ
thống xử lý song song hiện có chỉ được cài đặt trên
phạm vi nhỏ và đẩy các chi tiết về xử lý sự cố, thất
bại cho các lập trình viên.
Lập trình đồng bộ theo đống (Bulk Synchronous
Programming) [17] và một vài MPI nguyên thủy [11]
cung cấp cách nhìn trừu tượng ở mức cao hơn giúp
cho các lập trình viên dễ dàng viết các chương trình
song song. Điểm khác biệt chủ đạo giữa những hệ
thống đó và MapReduce là ở chỗ, MapReduce khai
thác mô hình lập trình giới hạn để song song hóa
chương trình một cách tự động và cung cấp khả
năng chịu lỗi trong suốt.
Bộ tối ưu hóa cục bộ được bắt nguồn từ các kỹ
thuật như các đĩa kích hoạt [12, 15], tại đó các tính
toán dùng để xử lý các thành phần gần với đĩa cục
bộ, để giảm thiểu số lượng dữ liệu được gửi thông
qua cổng I/O của mạng. Chúng tôi chạy trên các bộ
xử lý phổ thông, trong đó một số lượng nhỏ đĩa được
kết nối trực tiếp thay vì chạy trực tiếp trên các bộ
xử lý điều khiển đĩa, nhưng về cách tiếp cận tổng
quát thì là tương tự.
Cơ chế tác vụ dự phòng giống với cơ chế lập lịch
tích cực (eager scheduling) được sử dụng trong Hệ
thống Charlotte [3]. Một trong những điều thiếu sót
của việc lập lịch tích cực đơn giản là nếu một tác vụ
nhất định gây lỗi lặp đi lặp lại, toàn bộ tính toán
không thể hoàn thành. Chúng tôi đã khắc phục một
vài trường hợp của vấn đề này với cơ chế bỏ qua các
bản ghi lỗi.
Phép cài đặt MapReduce dựa trên hệ thống quản
lý cụm nằm bên trong chịu trách nhiệm việc phân
tán và thực thi các tác vụ người dùng trên một tập
lớn các máy cùng chia sẻ. Tuy đây không phải là mục
tiêu của bài báo này, tinh thần của hệ thống quản lý
cụm giống với các hệ thống khác như Condor [16].
Khả năng sắp xếp là một phần của thư viện
MapReduce, tương tự trong tính toán với NOW-
Sort [1]. Các máy nguồn (máy thực thi map) phân
nhỏ dữ liệu để sắp xếp và gửi đến một trong R máy
thực thi reduce. Mỗi máy thực thi reduce sắp xếp
dữ liệu một cách cục bộ (trong bộ nhớ nếu có thể).
NOW-Sort không có các hàm Map và Reduce có thể
được định nghĩa bởi người dùng, điều làm cho thư
viện của chúng ta được áp dụng rộng rãi.
River [2] cung cấp mô hình lập trình tại đó các
tiến trình giao tiếp với nhau bằng cách gửi dữ liệu
qua các hàng đợi phân tán. Giống với MapReduce,
hệ thống River cung cấp hiệu năng với mặt bằng
chung tốt, mặc dù có sự xuất hiện của các yếu tố
không đồng nhất do phần cứng không đồng nhất
hoặc do nhiễu loạn của hệ thống. River đạt được
điều này do lập lịch trên đĩa kỹ lưỡng và chuyển giao
trên mạng để có được thời gian hoàn thành mức cân
bằng. MapReduce có cách tiếp cận khác. Bằng cách
giới hạn mô hình lập trình, framework MapReduce
có thể phân nhỏ vấn đề thành số lượng lớn các tác
vụ được làm mịn. Các tác vụ này được lập lịch động
trên các máy sẵn sàng do đó các tác vụ được xử lý
nhanh. Mô hình lập trình có giới hạn đồng thời cho
phép ta lập lịch việc thực thi các tác vụ dư thừa
gần với đoạn cuối, giúp giảm đáng kể thời gian hoàn
thành với sự xuất hiện của các yếu tố không đồng
nhất (như các máy làm việc chậm hoặc bị nghẽn).
BAD-FS [5] có mô hình lập trình rất khác so với
MapReduce, khác với MapReduce, mục tiêu của việc
thực thi bao trùm trên mạng diện rộng. Tuy vậy, có
hai điểm tương đồng như sau. (1) Cả hai hệ thống
đều sử dụng việc thực thi dư thừa để phục hồi mất
mất dữ liệu gây ra bởi các sự cố. (2) Cả hai đều sử
dụng lập lịch mức địa phương để giảm thiểu lượng
dữ liệu gửi qua các liên kết dễ tắc nghẽn trong mạng.
TACC [7] là một hệ thống được thiết kế để đơn
giản hóa việc xây dựng các dịch vụ mạng có tính
sẵn sàng cao. Giống với MapReduce, nó dựa trên cơ
chế tái thực thi để thực hiện tính năng chịu lỗi.
8 Kết luận
Mô hình lập trình MapReduce đã được sử dụng
thành công tại Google cho nhiều mục đích. Chúng
tôi coi đây là thành công vì một số lý do. Đầu tiên,
mô hình này dễ sử dụng, thậm chí với các lập trình
viên chưa có kinh nghiệm với hệ thống song song
và phân tán, vì nó ẩn đi các chi tiết về song song
hóa, chịu lỗi, tối ưu hóa cục bộ và cân bằng tải. Thứ
hai, số lượng lớn các vấn đề đa dạng được diễn đạt
dễ dàng thông qua MapReduce. Ví dụ, MapReduce
được áp dụng cho thế hệ dữ liệu dành cho các sản
phẩm của Google bao gồm dịch vụ tìm kiếm trên
web, sắp xếp, khai phá dữ liệu, học máy, và nhiều
hệ thống khác. Thứ ba, chúng tôi đã phát triển việc
triển khai MapReduce lên tới phạm vi các cụm máy
lớn gồm hàng nghìn máy. Việc triển khai này tận
dụng hiệu quả tài nguyên máy và do đó, phù hợp
với nhiều mục đích sử dụng với lượng lớn các vấn đề
tính toán tại Google.
Chúng tôi đã ghi nhận được một vài điều từ công
trình này. Đầu tiên, giới hạn mô hình lập trình giúp
việc song song hóa, tính toán phân tán và chịu lỗi dễ
dàng hơn. Thứ hai, băng thông mạng là tài nguyên
găng. Một vài phép tối ưu hóa trong hệ thống có tác
vụ giảm thiểu khối lượng dữ liệu gửi qua mạng: Tối
ưu hóa cục bộ cho phép chúng ta đọc dữ liệu từ các
đĩa cục bộ, và viết các bản sao của dữ liệu trung gian
lên đĩa cục bộ để tiết kiệm băng thông mạng. Thứ
ba, các phép thực thi dư thừa có thể được sử dụng
để giảm thiểu các tác động của máy xử lý chậm, xử
lý sự cố máy và mất mát dữ liệu.
Lời cảm ơn
Josh Levenberg đã giúp đỡ chúng tôi rất nhiều trong
việc xem xét và mở rộng MapReduce API mức người
dùng với nhiều tính năng mới dựa trên kinh nghiệm
của mình trong việc sử dụng MapReduce cùng các
đề xuất của cộng sự trong việc nâng cao hiệu năng.
MapReduce đọc đầu vào và viết đầu ra tại Google
File System [8]. Chúng tôi dành lời cảm ơn tới Mo-
hit Aron, Howard Gobioff, Markus Gutschke, David
Kramer, Shun-Tak Leung, và Josh Redstone đã dành
công sức của mình trong việc phát triển GFS. Chúng
tôi đồng thời muốn cảm ơn Percy Liang và Olcan
Sercinoglu vì đã phát triển hệ thống quản lý cụm mà
MapReduce sử dụng. Mike Burrows, Wilson Hsieh,
Josh Levenberg, Sharon Perl, Rob Pike, và Debby
Wallach đã dành những nhận xét hữu ích về những
bản thảo trước đây của bài báo này. Những người
đánh giá ẩn danh OSDI, và người hướng dẫn của
chúng tôi, Eric Brewer đã đưa ra nhiều góp ý quý
báu về những khía cạnh mà bài báo này cần cải
thiện. Cuối cùng, chúng tôi chân thành cảm ơn tất
cả những người dùng của MapReduce trong tổ chức
kỹ thuật của Google đã đưa ra những phản hồi, góp
ý và báo cáo lỗi hữu ích.
Các tham chiếu
[1] Andrea C. Arpaci-Dusseau, Remzi H. Arpaci-
Dusseau, David E. Culler, Joseph M. Hellerstein,
and David A. Patterson. High-performance sorting
on networks of work-stations. In Proceedings of the
1997 ACM SIGMOD International Conference on
Management of Data, Tucson, Arizona, May 1997.
[2] Remzi H. Arpaci-Dusseau, Eric Anderson,
Noah Treuhaft, David E. Culler, Joseph M. Heller-
stein, David Patterson, and Kathy Yelick. Cluster
I/O with River: Making the fast case common. In
Proceedings of the Sixth Workshop on Input/Out-
put in Parallel and Distributed Systems (IOPADS
’99), pages 10–22, Atlanta, Georgia, May 1999.
[3] Arash Baratloo, Mehmet Karaul, Zvi Kedem,
and Peter Wyckoff. Charlotte: Metacomputing on
the web. In Proceedings of the 9th International
Conference on Parallel and Distributed Computing
Systems, 1996.
[4] Luiz A. Barroso, Jeffrey Dean, and Urs H¨olzle.
Web search for a planet: The Google cluster archi-
tecture. IEEE Micro, 23(2):22–28, April 2003
[5] John Bent, Douglas Thain, Andrea C.Arpaci-
Dusseau, Remzi H. Arpaci-Dusseau, and Miron
Livny. Explicit control in a batch-aware distributed
file system. In Proceedings of the 1st USENIX Sym-
posium on Networked Systems Design and Imple-
mentation NSDI, March 2004.
[6] Guy E. Blelloch. Scans as primitive parallel
operations. IEEE Transactions on Computers, C-
38(11), November 1989
[7] Armando Fox, Steven D. Gribble, Yatin
Chawathe, Eric A. Brewer, and Paul Gauthier.
Cluster-based scalable network services. In Proceed-
ings of the 16th ACM Symposium on Operating
System Principles, pages 78–91, Saint-Malo, France,
1997.
[8] Sanjay Ghemawat, Howard Gobioff, and Shun-
Tak Leung. The Google file system. In 19th Sympo-
sium on Operating Systems Principles, pages 29–43,
Lake George, New York, 2003.
[9] S. Gorlatch. Systematic efficient parallelization
of scan and other list homomorphisms. In L. Bouge,
P. Fraigniaud, A. Mignotte, and Y. Robert, editors,
Euro-Par’96. Parallel Processing, Lecture Notes in
Computer Science 1124, pages 401–408. Springer-
Verlag, 1996.
[10] Jim Gray.Sort benchmark home page.
http://research.microsoft.com/barc/SortBenchmark/.
[11] William Gropp, Ewing Lusk, and Anthony
Skjellum. Using MPI: Portable Parallel Program-
ming with the Message-Passing Interface. MIT
Press, Cambridge, MA, 1999.
[12] L. Huston, R. Sukthankar, R. Wick-
remesinghe, M. Satyanarayanan, G. R. Ganger, E.
Riedel, and A. Ailamaki. Diamond: A storage ar-
chitecture for early discard in interactive search. In
Proceedings of the 2004 USENIX File and Storage
Technologies FAST Conference, April 2004.
[13] Richard E. Ladner and Michael J. Fischer.
Parallel prefix computation. Journal of the ACM,
27(4):831–838, 1980.
[14] Michael O. Rabin. Efficient dispersal of infor-
mation for security, load balancing and fault toler-
ance. Journal of the ACM, 36(2):335–348, 1989.
[15] Erik Riedel, Christos Faloutsos, Garth A.
Gibson, and David Nagle. Active disks for large-scale
data processing. IEEE Computer, pages 68–74, June
2001.
[16] Douglas Thain, Todd Tannenbaum, and
Miron Livny. Distributed computing in practice:
The Condor experience. Concurrency and Compu-
tation: Practice and Experience, 2004.
[17] L. G. Valiant. A bridging model for par-
allel computation. Communications of the ACM,
33(8):103–111, 1997.
[18] Jim Wyllie. Spsort: How
to sort a terabyte quickly.
http://alme1.almaden.ibm.com/cs/spsort.pdf.
Phụ lục A: Word Frequency
Đoạn này chứa 1 ví dụ đếm số lần xuất hiện của
các từ trong một tập các file đầu vào được chỉ định
trong dòng lệnh.
#include "mapreduce/mapreduce.h"
// User’s map function
class WordCounter : public Mapper {
public:
virtual void Map(const MapInput& input) {
const string& text = input.value();
const int n = text.size();
for (int i = 0; i < n; ) {
// Skip past leading whitespace
while ((i < n) && isspace(text[i]))
i++;
// Find word end
int start = i;
while ((i < n) && !isspace(text[i]))
i++;
if (start < i)
Emit(text.substr(start,i-start),"1");
}
}
};
REGISTER_MAPPER(WordCounter);
// User’s reduce function
class Adder : public Reducer {
virtual void Reduce(ReduceInput* input) {
// Iterate over all entries with the
// same key and add the values
int64 value = 0;
while (!input->done()) {
value += StringToInt(input->value());
input->NextValue();
}
// Emit sum for input->key()
Emit(IntToString(value));
}
};
REGISTER_REDUCER(Adder);
int main(int argc, char** argv) {
ParseCommandLineFlags(argc, argv);
MapReduceSpecification spec;
// Store list of input files into "spec"
for (int i = 1; i < argc; i++) {
MapReduceInput* input = spec.add_input();
input->set_format("text");
input->set_filepattern(argv[i]);
input->set_mapper_class("WordCounter");
}
// Specify the output files:
//
/gfs/test/freq-00000-of-00100
//
/gfs/test/freq-00001-of-00100
//
...
MapReduceOutput* out = spec.output();
out->set_filebase("/gfs/test/freq");
out->set_num_tasks(100);
out->set_format("text");
out->set_reducer_class("Adder");
// Optional: do partial sums within map
// tasks to save network bandwidth
out->set_combiner_class("Adder");
// Tuning parameters: use at most 2000
// machines and 100 MB of memory per task
spec.set_machines(2000);
spec.set_map_megabytes(100);
spec.set_reduce_megabytes(100);
// Now run it
MapReduceResult result;
if (!MapReduce(spec, &result)) abort();
// Done: ’result’ structure contains info
// about counters, time taken, number of
// machines used, etc.
return 0;
}

More Related Content

What's hot

Hệ thống thông tin quản lý-website tin tức nhà đất
Hệ thống thông tin quản lý-website tin tức nhà đấtHệ thống thông tin quản lý-website tin tức nhà đất
Hệ thống thông tin quản lý-website tin tức nhà đấtKali Back Tracker
 
Báo cáo quản lý cửa hàng máy tính
Báo cáo quản lý cửa hàng máy tínhBáo cáo quản lý cửa hàng máy tính
Báo cáo quản lý cửa hàng máy tínhthuvienso
 
Hệ PhâN TáN
Hệ PhâN TáNHệ PhâN TáN
Hệ PhâN TáNit
 
phân tích thiết kế hệ thống thông tin
phân tích thiết kế hệ thống thông tinphân tích thiết kế hệ thống thông tin
phân tích thiết kế hệ thống thông tinQuynh michelanh quynh
 
[123doc] mo-hinh-thuc-the-moi-ket-hop
[123doc]   mo-hinh-thuc-the-moi-ket-hop[123doc]   mo-hinh-thuc-the-moi-ket-hop
[123doc] mo-hinh-thuc-the-moi-ket-hopMay Trang
 
Bài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITBài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITNguynMinh294
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchBIC
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Tú Cao
 
Hỗ trợ ra quyết định
Hỗ trợ ra quyết địnhHỗ trợ ra quyết định
Hỗ trợ ra quyết địnhlmphuong06
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsaBảo Điệp
 
Bài tập thiết kế cơ sở dữ liệu
Bài tập thiết kế cơ sở dữ liệuBài tập thiết kế cơ sở dữ liệu
Bài tập thiết kế cơ sở dữ liệuLê Minh
 
Do an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuDo an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuThiênĐàng CôngDân
 
Xây dựng biểu đồ use case
Xây dựng biểu đồ use caseXây dựng biểu đồ use case
Xây dựng biểu đồ use caseTrung Chinh Hà
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnhTùng Trần
 
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGTrường Phạm
 

What's hot (20)

Hệ thống thông tin quản lý-website tin tức nhà đất
Hệ thống thông tin quản lý-website tin tức nhà đấtHệ thống thông tin quản lý-website tin tức nhà đất
Hệ thống thông tin quản lý-website tin tức nhà đất
 
Báo cáo quản lý cửa hàng máy tính
Báo cáo quản lý cửa hàng máy tínhBáo cáo quản lý cửa hàng máy tính
Báo cáo quản lý cửa hàng máy tính
 
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đĐề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
 
17406 bai giang csdl nang cao
17406   bai giang csdl nang cao17406   bai giang csdl nang cao
17406 bai giang csdl nang cao
 
Hệ PhâN TáN
Hệ PhâN TáNHệ PhâN TáN
Hệ PhâN TáN
 
phân tích thiết kế hệ thống thông tin
phân tích thiết kế hệ thống thông tinphân tích thiết kế hệ thống thông tin
phân tích thiết kế hệ thống thông tin
 
[123doc] mo-hinh-thuc-the-moi-ket-hop
[123doc]   mo-hinh-thuc-the-moi-ket-hop[123doc]   mo-hinh-thuc-the-moi-ket-hop
[123doc] mo-hinh-thuc-the-moi-ket-hop
 
Đề tài: Xây dựng phần mềm quản lý nhà hàng ăn uống
Đề tài: Xây dựng phần mềm quản lý nhà hàng ăn uốngĐề tài: Xây dựng phần mềm quản lý nhà hàng ăn uống
Đề tài: Xây dựng phần mềm quản lý nhà hàng ăn uống
 
Đề tài: Hệ thống hỗ trợ điểm danh sinh viên trường ĐH Hải Phòng
Đề tài: Hệ thống hỗ trợ điểm danh sinh viên trường ĐH Hải PhòngĐề tài: Hệ thống hỗ trợ điểm danh sinh viên trường ĐH Hải Phòng
Đề tài: Hệ thống hỗ trợ điểm danh sinh viên trường ĐH Hải Phòng
 
Bài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTITBài giảng công nghệ phần mềm PTIT
Bài giảng công nghệ phần mềm PTIT
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà Sách
 
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
 
Hỗ trợ ra quyết định
Hỗ trợ ra quyết địnhHỗ trợ ra quyết định
Hỗ trợ ra quyết định
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsa
 
Bài tập thiết kế cơ sở dữ liệu
Bài tập thiết kế cơ sở dữ liệuBài tập thiết kế cơ sở dữ liệu
Bài tập thiết kế cơ sở dữ liệu
 
Do an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tuDo an xay_dung_website_thuong_mai_dien_tu
Do an xay_dung_website_thuong_mai_dien_tu
 
Xây dựng biểu đồ use case
Xây dựng biểu đồ use caseXây dựng biểu đồ use case
Xây dựng biểu đồ use case
 
Giáo trình xử lý ảnh
Giáo trình xử lý ảnhGiáo trình xử lý ảnh
Giáo trình xử lý ảnh
 
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI GIẢNG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
 
Luận văn: Hồi quy bội tuyến tính và Hồi quy phi tuyến, HOT, 9đ
Luận văn: Hồi quy bội tuyến tính và Hồi quy phi tuyến, HOT, 9đLuận văn: Hồi quy bội tuyến tính và Hồi quy phi tuyến, HOT, 9đ
Luận văn: Hồi quy bội tuyến tính và Hồi quy phi tuyến, HOT, 9đ
 

Similar to Mapreduce simplified-data-processing

Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoHuy Nguyễn
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoBác Luân
 
Chuong 02. gioi thieu ngon ngu r
Chuong 02.  gioi thieu ngon ngu rChuong 02.  gioi thieu ngon ngu r
Chuong 02. gioi thieu ngon ngu rTtx Love
 
Chuong 02. gioi thieu ngon ngu r
Chuong 02.  gioi thieu ngon ngu rChuong 02.  gioi thieu ngon ngu r
Chuong 02. gioi thieu ngon ngu rTtx Love
 
TRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfTRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfPHNGUYNNGC9
 
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn Ninh
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn NinhIntro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn Ninh
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn NinhBUTGOYEUTHUONG
 
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp toàn LỪA ĐẢO)
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp  toàn LỪA ĐẢO)Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp  toàn LỪA ĐẢO)
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp toàn LỪA ĐẢO)Cậu Ba
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamesePhi Phi
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamesePhi Phi
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamesehoshi 17
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamesePhi Phi
 
Distributed graphlab: a framework for machine learning and data mining in the...
Distributed graphlab: a framework for machine learning and data mining in the...Distributed graphlab: a framework for machine learning and data mining in the...
Distributed graphlab: a framework for machine learning and data mining in the...Thành Thư Thái
 
Introduction to data statistics with r - Part I (in Vietnamese)
Introduction to data statistics with r - Part I (in Vietnamese)Introduction to data statistics with r - Part I (in Vietnamese)
Introduction to data statistics with r - Part I (in Vietnamese)Quang Nguyen
 
Gt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhGt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhvantai30
 
Hadoop là gì
Hadoop là gìHadoop là gì
Hadoop là gìHLV
 
Hadoop là gì
Hadoop là gìHadoop là gì
Hadoop là gìHLV
 

Similar to Mapreduce simplified-data-processing (20)

Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Chuong 01
Chuong 01Chuong 01
Chuong 01
 
Chuong 01 mo dau
Chuong 01 mo dauChuong 01 mo dau
Chuong 01 mo dau
 
Chuong 02. gioi thieu ngon ngu r
Chuong 02.  gioi thieu ngon ngu rChuong 02.  gioi thieu ngon ngu r
Chuong 02. gioi thieu ngon ngu r
 
Chuong 02. gioi thieu ngon ngu r
Chuong 02.  gioi thieu ngon ngu rChuong 02.  gioi thieu ngon ngu r
Chuong 02. gioi thieu ngon ngu r
 
TRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdfTRNG_DI_HC_NHA_TRANG.pdf
TRNG_DI_HC_NHA_TRANG.pdf
 
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn Ninh
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn NinhIntro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn Ninh
Intro to r_vietnamese - Sưu tầm của thầy Nguyễn Văn Ninh
 
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp toàn LỪA ĐẢO)
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp  toàn LỪA ĐẢO)Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp  toàn LỪA ĐẢO)
Intro to r_vietnamese ( Viết thuê luận văn tốt nghiệp toàn LỪA ĐẢO)
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamese
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamese
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamese
 
Intro to r_vietnamese
Intro to r_vietnameseIntro to r_vietnamese
Intro to r_vietnamese
 
Distributed graphlab: a framework for machine learning and data mining in the...
Distributed graphlab: a framework for machine learning and data mining in the...Distributed graphlab: a framework for machine learning and data mining in the...
Distributed graphlab: a framework for machine learning and data mining in the...
 
Introduction to data statistics with r - Part I (in Vietnamese)
Introduction to data statistics with r - Part I (in Vietnamese)Introduction to data statistics with r - Part I (in Vietnamese)
Introduction to data statistics with r - Part I (in Vietnamese)
 
Asp
AspAsp
Asp
 
Gt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhGt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanh
 
Hadoop là gì
Hadoop là gìHadoop là gì
Hadoop là gì
 
Hadoop là gì
Hadoop là gìHadoop là gì
Hadoop là gì
 
Giáo trình asp.net với c sharp
Giáo trình asp.net với c sharpGiáo trình asp.net với c sharp
Giáo trình asp.net với c sharp
 

More from Viet-Trung TRAN

Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017
Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017
Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017Viet-Trung TRAN
 
Dynamo: Amazon’s Highly Available Key-value Store
Dynamo: Amazon’s Highly Available Key-value StoreDynamo: Amazon’s Highly Available Key-value Store
Dynamo: Amazon’s Highly Available Key-value StoreViet-Trung TRAN
 
Pregel: Hệ thống xử lý đồ thị lớn
Pregel: Hệ thống xử lý đồ thị lớnPregel: Hệ thống xử lý đồ thị lớn
Pregel: Hệ thống xử lý đồ thị lớnViet-Trung TRAN
 
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của Facebook
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của FacebookTìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của Facebook
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của FacebookViet-Trung TRAN
 
giasan.vn real-estate analytics: a Vietnam case study
giasan.vn real-estate analytics: a Vietnam case studygiasan.vn real-estate analytics: a Vietnam case study
giasan.vn real-estate analytics: a Vietnam case studyViet-Trung TRAN
 
A Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkA Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkViet-Trung TRAN
 
A Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkA Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkViet-Trung TRAN
 
Large-Scale Geographically Weighted Regression on Spark
Large-Scale Geographically Weighted Regression on SparkLarge-Scale Geographically Weighted Regression on Spark
Large-Scale Geographically Weighted Regression on SparkViet-Trung TRAN
 
Recent progress on distributing deep learning
Recent progress on distributing deep learningRecent progress on distributing deep learning
Recent progress on distributing deep learningViet-Trung TRAN
 
success factors for project proposals
success factors for project proposalssuccess factors for project proposals
success factors for project proposalsViet-Trung TRAN
 
OCR processing with deep learning: Apply to Vietnamese documents
OCR processing with deep learning: Apply to Vietnamese documents OCR processing with deep learning: Apply to Vietnamese documents
OCR processing with deep learning: Apply to Vietnamese documents Viet-Trung TRAN
 
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...Viet-Trung TRAN
 
Introduction to BigData @TCTK2015
Introduction to BigData @TCTK2015Introduction to BigData @TCTK2015
Introduction to BigData @TCTK2015Viet-Trung TRAN
 
From neural networks to deep learning
From neural networks to deep learningFrom neural networks to deep learning
From neural networks to deep learningViet-Trung TRAN
 
From decision trees to random forests
From decision trees to random forestsFrom decision trees to random forests
From decision trees to random forestsViet-Trung TRAN
 
Recommender systems: Content-based and collaborative filtering
Recommender systems: Content-based and collaborative filteringRecommender systems: Content-based and collaborative filtering
Recommender systems: Content-based and collaborative filteringViet-Trung TRAN
 
3 - Finding similar items
3 - Finding similar items3 - Finding similar items
3 - Finding similar itemsViet-Trung TRAN
 

More from Viet-Trung TRAN (20)

Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017
Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017
Bắt đầu tìm hiểu về dữ liệu lớn như thế nào - 2017
 
Dynamo: Amazon’s Highly Available Key-value Store
Dynamo: Amazon’s Highly Available Key-value StoreDynamo: Amazon’s Highly Available Key-value Store
Dynamo: Amazon’s Highly Available Key-value Store
 
Pregel: Hệ thống xử lý đồ thị lớn
Pregel: Hệ thống xử lý đồ thị lớnPregel: Hệ thống xử lý đồ thị lớn
Pregel: Hệ thống xử lý đồ thị lớn
 
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của Facebook
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của FacebookTìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của Facebook
Tìm kiếm needle trong Haystack: Hệ thống lưu trữ ảnh của Facebook
 
giasan.vn real-estate analytics: a Vietnam case study
giasan.vn real-estate analytics: a Vietnam case studygiasan.vn real-estate analytics: a Vietnam case study
giasan.vn real-estate analytics: a Vietnam case study
 
Giasan.vn @rstars
Giasan.vn @rstarsGiasan.vn @rstars
Giasan.vn @rstars
 
A Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkA Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural Network
 
A Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural NetworkA Vietnamese Language Model Based on Recurrent Neural Network
A Vietnamese Language Model Based on Recurrent Neural Network
 
Large-Scale Geographically Weighted Regression on Spark
Large-Scale Geographically Weighted Regression on SparkLarge-Scale Geographically Weighted Regression on Spark
Large-Scale Geographically Weighted Regression on Spark
 
Recent progress on distributing deep learning
Recent progress on distributing deep learningRecent progress on distributing deep learning
Recent progress on distributing deep learning
 
success factors for project proposals
success factors for project proposalssuccess factors for project proposals
success factors for project proposals
 
GPSinsights poster
GPSinsights posterGPSinsights poster
GPSinsights poster
 
OCR processing with deep learning: Apply to Vietnamese documents
OCR processing with deep learning: Apply to Vietnamese documents OCR processing with deep learning: Apply to Vietnamese documents
OCR processing with deep learning: Apply to Vietnamese documents
 
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...
Paper@Soict2015: GPSInsights: towards a scalable framework for mining massive...
 
Deep learning for nlp
Deep learning for nlpDeep learning for nlp
Deep learning for nlp
 
Introduction to BigData @TCTK2015
Introduction to BigData @TCTK2015Introduction to BigData @TCTK2015
Introduction to BigData @TCTK2015
 
From neural networks to deep learning
From neural networks to deep learningFrom neural networks to deep learning
From neural networks to deep learning
 
From decision trees to random forests
From decision trees to random forestsFrom decision trees to random forests
From decision trees to random forests
 
Recommender systems: Content-based and collaborative filtering
Recommender systems: Content-based and collaborative filteringRecommender systems: Content-based and collaborative filtering
Recommender systems: Content-based and collaborative filtering
 
3 - Finding similar items
3 - Finding similar items3 - Finding similar items
3 - Finding similar items
 

Mapreduce simplified-data-processing

  • 1. MapReduce: Đơn giản hóa việc xử lý dữ liệu trên các cụm lớn Jeffey Dean và Sanjay Ghemawat jeff@google.com, sanjay@google.com Google, Inc. Tóm tắt nội dung MapReduce là một mô hình lập trình và một phương thức triển khai có liên kết gồm nhiều máy tính kết nối với nhau để tính toán và xử lý trên các bộ dữ liệu lớn. Người dùng chỉ định một hàm map xử lý một cặp key/value và tạo ra các cặp key/value trung gian, và hàm reduce gộp tất cả các value có cùng key trung gian.Nhiều vấn đề trong thực tế có thể diễn đạt được thông qua mô hình này, sẽ được mô tả dưới đây. Chương trình được viết theo cách này sẽ được thực thi song song một cách tự động trên một cụm gồm nhiều máy tính. Toàn bộ qúa trình từ chia nhỏ dữ liệu đầu vào đến lập lịch xử lý cho các máy tính trên cụm, xử lý sự cố, quản lý việc giao tiếp giữa các máy được thực hiện bởi hệ thống runtime. Điều này cho phép lập trình viên không cần phải có kinh nghiệm về hệ thống song song và phân tán cũng có thể dễ dàng sử dụng được một hệ thống phân tán cỡ lớn. MapReduce được cài đặt trên một cụm gồm nhiều máy tính có khả năng mở rộng cao: Việc thực thi của MapReduce cho phép xử lý nhiều terabytes dữ liệu trên hàng nghìn máy tính. Hàng trăm chương trình MapReduce được đã cài đặt và lên tới một nghìn MapReduce job đang được chạy trên cụm tại Google hàng ngày. 1 Giới thiệu Năm năm qua, các tác giả và cộng sự của mình tại Google đã triển khai hàng trăm tính toán với mục tiêu chuyên biệt nhằm xử lý số lượng lớn dữ liệu thô, ví dụ như các tài liệu được thu thập về, lịch sử truy vấn web, v.v.., để tính toán ra các dạng dữ liệu dẫn xuất, như đánh chỉ mục ngược, các dạng biểu diễn cấu trúc đồ thị của tài liệu web, tóm tắt số trang thu thập được trên mỗi host tương ứng, tập các truy vấn thường gặp trong một ngày nhất định, v.v... Hầu hết những tính toán như vậy đều khá dễ dàng về mặt khái niệm. Tuy nhiên, dữ liệu đầu vào thường khá lớn và các tính toán phải được phân tán trên hàng trăm hoặc hàng nghìn máy để có thể hoàn thành trong khoảng thời gian hợp lý. Những vấn đề như là làm thế nào để song song hóa các tính toán, phân tán dữ liệu, xử lý sự cố, cùng với nó là khối lượng code đồ sộ, đã ngăn cản việc che giấu những tính toán đơn giản truyền thống. Để giải quyết sự phức tạp này, chúng tôi đã đề xuất một khái niệm trừu tượng mới cho phép chúng ta diễn đạt các tính toán đơn giản, đồng thời che giấu đi các chi tiết cồng kềnh của việc song song hóa, chịu lỗi, phân tán dữ liệu và cân bằng tải trên thư viện. Sự trừu tượng hóa này được bắt nguồn từ diễn tả nguyên thủy map và reduce trong Lisp và các ngôn ngữ hướng chức năng khác. Chúng tôi nhận ra hầu hết các tính toán đều liên quan tới áp dụng toán tử map vào mỗi bản ghi logic tại đầu vào để tính toán ra tập các cặp key/value trung gian, sau đó áp dụng toán tử reduce cho tất cả các value có cùng key, để có thể kết hợp dữ liệu dẫn xuất một cách hợp lý. Việc sử dụng mô hình hướng chức năng với map và reduce cho phép chúng ta song song hóa dễ dàng các tính toán lớn và cho phép tái thực thi với cơ chế chủ đạo trong việc chịu lỗi. Đóng góp chủ yếu của công trình này là tạo ra một giao diện đơn giản, mạnh mẽ cho phép thực hiện tự động các công việc song song hóa và tính toán phân tán trên phạm vi lớn, kết hợp với việc triển khai giao diện này để đạt được hiệu năng tính toán cao trên cụm lớn các máy tính phổ thông. Phần 2 mô tả mô hình lập trình cơ bản và đưa ra một vài ví dụ. Phần 3 mô tả việc cài đặt giao diện MapReduce thích hợp với môi trường tính toán dựa trên cụm. Phần 4 mô tả một vài tinh chỉnh khá hữu ích của mô hình lập trình. Phần 5 chứa các kết quả đo hiệu năng của việc triển khai ứng với các công việc khác nhau. Phần 6 mô tả việc sử dụng MapReduce trong Google, bao gồm những kinh nghiệm của chúng tôi trong việc sử dụng nó làm công cụ viết lại trong hệ thống đánh chỉ mục. Phần 7 thảo luận về các công trình liên quan và công việc trong tương lai.
  • 2. 2 Mô hình lập trình Trong phương pháp tình toán này, ta đưa vào một tập hợp các cặp key/value đầu vào, và kết quả là một tập key/value đầu ra. Người sử dụng MapReduce chỉ cần viết 2 hàm: Map và Reduce. Người dùng viết hàm Map nhận đầu vào là một cặp key/value và tạo ra một tập hợp các cặp key/- value tạm thời. Thư viện MapReduce sẽ nhóm tất cả những cặp key/value tạm thời mà có key giống nhau sau đó chuyển cho hàm Reduce. Trong hàm Reduce người dùng sẽ viết mã để xử lý đầu vào là một key và một danh sách các value của key đó, và tạo ra một tập các value với số lượng phần tử ít hơn. Thông thường là không hoặc một value được tạo ra từ hàm Reduce. Danh sách các value tạm thời được gửi đến hàm Reduce thông qua một vòng lặp. Điều đó cho phép chúng có thể xử lý một danh sách value có kích thước lớn hơn bộ nhớ vật lý. 2.1 Ví dụ Một ví dụ điển hỉnh áp dụng MapReduce đó là bài toán đếm số từ xuất hiện trong một số lượng lớn các văn bản. Được thể hiện bằng mã giả dưới đây: map(String key, String value): // key: document name // value: document contents for each word w in value: EmitIntermediate(w, "1"); reduce(String key, Iterator values): // key: a word // value: a list of counts int result = 0; for each v in values: result += ParseInt(v); Emit(AsString(result)); Hàm Map đưa ra mỗi từ với số lần xuất hiện của từ đó (trong ví dụ trên là ‘1’). Hàm Reduce thực hiện việc tính tổng số lần xuất hiện của mỗi từ. Thêm vào đó, người dùng viết mã để thêm vào một vài đặc tả như là tên của tệp đầu vào, đầu ra và các tham số tùy chỉnh (như tham số - số máy thực hiện map, số máy thực hiện reduce). Sau đó người dùng gọi đến hàm MapReduce, truyền vào đó những đối tượng cụ thể (là những đối tượng mapreduce đã tạo trước đó). Mã của người dùng được liên kết với thư viện MapReduce. Phụ lục A chứa đầy đủ mã chương trình cho ví dụ này. 2.2 Kiểu dữ liệu Đoạn mã giả trong ví dụ trước sử dụng kiểu xâu trong đầu vào và đầu ra. Tuy nhiên người dùng có thể sử dụng bất kỳ kiểu dữ liệu nào cho hàm map và reduce theo mẫu sau: map (k1, v1) → list(k2, v2) reduce (k2, list(v2)) → list(v2) Lưu ý: 1. k1, k2, v1, v2 là các kiểu dữ liệu, chẳng hạn như String, Integer, Object ... hay bất cứ kiểu dữ liệu nào do người dùng định nghĩa. 2. Các cặp key/value đầu vào và đầu ra trong MapReduce không thuộc cùng lĩnh vực. Như trong ví dụ trước, đầu vào là các cặp Document- Name/DocumentContent đầu ra là cặp Word/- count. Mặt khác, các cặp key/value tạm thời có cùng lĩnh vực với các cặp key/value đầu ra. 3. Đầu ra của hàm reduce thuộc kiểu list(v2) nhưng đó chưa phải kết quả cuối cùng của toàn bộ quá trình MapReduce. Kết quả cuối cùng mà người dùng nhận được là các cặp key/value với kiểu là (k2, list(v2)) với list(v2) là các kết quả được trả về bởi hàm reduce. 2.3 Các ví dụ khác Sau đây là một vài ví dụ về các chương trình thú vị có thể dễ dàng thực hiện bằng MapReduce. Grep phân tán: cho phép người dùng nhập vào một mẫu (pattern), hệ thống tìm trong tập các văn bản và trả về các dòng (line) khớp với mẫu đã cho. Hàm map nhận đầu vào là một cặp pattern/line đầu ra là cặp pattern/line nếu line khớp (match) với patten. Hàm reduce đơn giản chi cần trả về danh sách các list(line) mà nó nhận được. Đếm số lượt truy cập trên một URL: Khi người dùng truy cập vào một trang nào đó, url của trang đó sẽ được ghi vào một file log. Hàm map nhận đầu vào là các file log và trả về <URL,1>. Hàm reduce tính tổng các value của cùng một URL và trả về cặp <URL,total count>. Đồ thị web-link ngược: Thông thường một trang web chứa các link trỏ đến các trang web khác. Trong một số trường hợp ví dụ như để tính PageRank của một trang web ta cần biết có những trang web nào trỏ đến nó. Hàm map nhận đầu vào là một cặp (source, list(target)) trả về các cặp (target, source). Hàm reduce chỉ cần trả về list(source) mà nó nhận được từ đầu vào. Term-Vector cho văn bản: Một term vector là một danh sách các cặp từ/tần suất xuất hiện của từ của một hay nhiều văn bản. Hàm map nhận đầu vào là (url, content) trả về một tập ((url, word), 1), hàm reduce tính tổng các value và trả về số frequency cho mỗi từ xuất hiện trong 1 văn bản. Kết quả ta được ((url, word), frequency). Tiếp tục thực hiện MapReduce, hàm map trả về (url,
  • 3. (word, frequency)) và hàm reduce trả về danh sách value mà nó nhận được từ đầu vào. Chỉ mục ngược: Là một cấu trúc dữ liệu lưu trữ từ và danh sách id của các văn bản chứa từ đó: (word, list(docId)). Hàm map nhận đầu vào là (docId, content) trả về một tập các cặp (word, docId), hàm reduce lọc bỏ những docId trùng lặp vả trả về các docId cho mỗi từ. Sắp xếp phân tán: Hàm map trích từ khóa từ mỗi bản ghi và trả về các cặp (key/record). Hàm reduce trả về những cặp không đổi. Việc tính toán dựa trên hàm chia được mô tả trong phần 4.1 và hàm sắp xếp mô tả trong phần 4.2. 3 Triển khai Có nhiều cách để triển khai thuật toán MapReduce, lựa chọn cách nào là phụ thuộc vào môi trường cụ thể. Ví dụ một cách triển khai có thể phù họp với một hệ thống máy tính chia sẻ bộ nhớ cỡ nhỏ hay một hệ thống lớn cho phép chia sẻ bộ nhớ không đồng bộ trên nhiều vi xử lý cho đến một hệ thống máy tính lớn được kết nối thông qua mạng. Trong phần này mô tả một cách triển khai trên môi trường tính toán được sử dụng bởi Google: nhiều cụm máy tính phố thông được kết nối với nhau thông qua mạng Ethernet. 1. Máy tính với cấu hình CPU 2 nhân x86, 2-4 GB Ram, chạy Linux. 2. Phần cứng mạng từ 100 Mb/s đến 1Gb/s giữa các tầng máy tính, và giữa các máy tính với nhau. 3. Mỗi cụm chứa từ hàng trăm đến hàng ngàn máy tính do đó khả năng chúng bị lỗi là hoàn toán có thể. 4. Hệ thống lưu trữ được cung cấp bởi những đĩa cứng phổ thông, gắn trực tiếp trên mỗi máy tính. Một hệ thống file phân tán được phát triển nội bộ được sử dụng để quản lý dữ liệu trên các đĩa cứng này. Hệ thống file sử dụng các bản sao để mang lại khả năng sẵn sàng và độ tin cậy cao trên một phần cứng không đáng tin cậy. 5. Người sử dụng đưa công việc của mình lên hệ thống điều phối. Mỗi công việc bao gồm một tập các tác vụ, và nó được hệ thống điều phối gửi đến cho những máy tính đang sẵn sàng trên cụm. 3.1 Tổng quan quá trình thực thi Hàm Map được thực thi phân tán trên nhiều máy tính bằng cách chia tự động dữ liệu đầu vào thành một tập M mảnh. Các mảnh này có thể được xử lý song song bởi nhiều máy tính. Hàm Reduce cũng được thực thi phân tán bằng cách chia không gian key tạm thời (Không gian key: là tập tất cả các key, trong bài toán wordcount không gian key chính là tập các từ được tạo ra từ hàm map) thành R phần bằng cách sử dụng hàm hàm chia (chẳng hạn như hash(key) mod R). Số lượng các phần (R) có thể tùy chỉnh được bởi người dùng. Hình 1 cho thấy sơ đồ luồng hoạt động của MapReduce được cài đặt bởi Google. Khi người sử dụng gọi MapReduce, quá trình thực hiện như sau: 1. Thư viện MapReduce được sử dụng trong chương trình đầu tiên sẽ chia nhỏ dữ liệu đầu vào thành M mảnh thông thường có kích thước từ 16-64 MB (có thể tùy biến được bởi người sử dụng). Sau đó chương trình sẽ được tải lên các máy tính đang sẵn sàng trên cụm và bắt đầu thực thi. 2. Một máy tính trong số chúng sẽ được chọn làm master. Các máy còn lại là worker, chúng sẽ nhận tác vụ từ master. Sẽ có M tác vụ map và R tác vụ reduce cần thực hiện. Master chọn các worker đang rảnh rỗi để giao cho mỗi worker một tác vụ map hoặc reduce. 3. Một worker khi nhận tác vụ map sẽ đọc dữ liệu trong mảnh tương ứng. Nó thực thi hàm Map (được định nghĩa bởi người dùng) với đầu vào là một cặp key/value được lấy ra từ dữ liệu vừa đọc. Các cặp key/value tạm thời trả về từ hàm Map sẽ được lưu trên bộ nhớ tạm. 4. Theo chu kỳ, các cặp key/value tạm thời sẽ được ghi ra đĩa của map worker và được chia thành R phần bằng cách sử dụng hàm chia. Thông tin về vị trí của các cặp key/value tạm thời trên đĩa được gửi về cho master, sau đó master sẽ chuyển những thông tin này cho reduce worker. 5. Reduce worker nhận được những thông tin này sẽ sử dụng lời gọi từ xa để đọc dữ liệu tạm thời nằm trên ổ đĩa của các map worker. Sau khi có đủ dữ liệu nó sẽ sắp xếp chúng theo key để gom lại những key giống nhau. Việc sắp xếp là cần thiết bởi sẽ có nhiều key được chuyển đến một tác vụ reduce. Nếu dữ liệu quá lớn không thể xử lý trên bộ nhớ nó sẽ thực hiện việc sắp xếp ngoài. 6. Sau khi sắp xếp, với mỗi một key và một tập value cùng key, reduce worker sẽ gọi một hàm Reduce (được định nghĩa bởi người dùng) để xử lý. Kết quả của hàm Reduce sẽ được tổng hợp vào một file tương ứng với tác vụ reduce. 7. Sau khi tất cả các tác vụ map và reduce đã đươc thực hiện xong, master sẽ kết thúc chương trình MapReduce và trả điều khiển lại cho chương trình của người dùng.
  • 4. Hình 1: Quá trình thực thi Sau khi hoàn tất, kết quả thực thi của MapReduce được lưu trên R file (Mỗi tác vụ reduce sinh ra một file). Người dùng không cần phải gộp R file này thành một, những file này thường sẽ làm đầu vào cho một quá trình MapReduce khác hoặc được sử dụng trong các ứng dụng phân tán mà cần dữ liệu đầu vào được chia thành nhiều file. 3.2 Cấu trúc dữ liệu trong master Master cần duy trì một vài cấu trúc dữ liệu. Với mỗi một tác vụ map và reduce, nó sẽ lưu giữ trạng thái (chưa thực hiện, đang thực hiện hay hoàn thành), và định danh của máy worker (trừ tác vụ chưa thực hiện). Thông tin vị trí của các cặp key/value tạm thời được chuyển từ tác vụ map sang tác vụ reduce thông qua master. Vì vậy với mỗi tác vụ map được hoàn thành, master sẽ lưu trữ địa chỉ và kích thước của R phần dữ liệu từ mỗi tác vụ map. Những thông tin này sau đó được gửi đến cho các worker đang làm tác vụ reduce. 3.3 Khả năng chịu lỗi Thuật toán MapReduce được thiết kế để giúp xử lý lượng dữ liệu rất lớn trên hàng trăm tới hàng ngàn máy tính, nó phải có khả nằng xử lý khi một vài máy tính trong số đó gặp sự cố. Worker bị lỗi Master thường xuyên liên lạc với các worker. Nếu nó không nhận được trả lời từ worker sau một khoảng thời gian nào đó, master sẽ đánh dấu worker đó bị lỗi. Tất cả các tác vụ map đã hoàn thành bởi worker này sẽ được đặt lại trạng thái chưa thực hiện, và vì thế chúng có thể được thực hiện lại bởi một worker khác. Thông thường bất kỳ một tác vụ map hay reduce nào đang được thực hiện mà worker gặp lỗi đều phải thực hiện lại. Những tác vụ map đã hoàn thành phải thực hiện lại bởi vì dữ liệu key/value tạm thời chỉ được lưu trên đĩa địa phương của máy đang gặp lỗi nên không thể truy cập được. Những tác vụ reduce không cần thực hiện lại vì dữ liệu đầu ra của chúng được lưu trên hệ thống file toàn cục (có các bản sao trên các máy khác). Khi một tác vụ map đã được thực hiện lần đầu bởi worker A sau đó được thực hiện lại bởi worker B (vì A bị lỗi), tất cả các worker thực thi tác vụ reduce sẽ được thông báo về việc thực hiện lại này. Bất kỳ tác vụ reduce nào chưa đọc được dữ liệu từ A sẽ đọc dữ liệu từ B. MapReduce có khả năng co giãn (mở rộng hoặc thu hep) khi một số máy tính gặp sự cố. Ví dụ, trong một quá trình thực thi MapReduce, mạng cần được bảo trì trên một cluster đang chạy khiến cho 80 máy không thể liên lạc được trong vài phút. Master của MapReduce sẽ yêu cầu thực thi lại công việc đã hoàn thành bởi các worker đó, và tiếp tục thực hiện các công việc tiếp theo cho đến khi hoàn thành quá trình
  • 5. MapReduce. Master bị lỗi Có thể định kỳ ghi lại những cấu trúc dữ liệu của master như được mô tả ở trên một cách dễ dàng. Nếu master gặp sự cố, một master khác có thể khởi động từ bản sao lưu dữ liệu gần nhất của master. Tuy nhiên, do chỉ có một master nên nếu nó gặp sự cố thì chương trình MapReduce sẽ không thể hoàn thành. Người dùng có thể kiểm tra lại trạng thái và khởi động lại chương trình nếu muốn. Ngữ nghĩa của chương trình khi gặp lỗi Kết quả của chương trình MapReduce và một chương trình chạy tuần tự tương ứng nếu không có lỗi phải giống nhau trên cùng dữ liệu đầu vào. Chương trình MapReduce dựa trên kết quả của mỗi tiến trình map, reduce để đảm bảo điều kiện trên. Mỗi tiến trình khi thực hiện tác vụ sẽ ghi kết quả của chúng ra các file tạm thời. Một tiến trình reduce chỉ tạo ra một file, và một tiến trình map tạo ra R file (mỗi file cho một tiến trình reduce). Khi tiến trình map hoàn tất worker gửi thông báo kèm với tên của R file tạm này về cho master. Nếu master nhận được thông báo hoàn thành của một tiến trình map đã hoàn thành trước đó rồi, nó sẽ bỏ qua nó. Nếu không nó sẽ ghi lại tên của R file vào cấu trúc dữ liệu của master. Khi một tiến trình reduce hoàn thành, reduce worker tự động đổi tên các file tạm của nó thành file output cuối cùng. Nếu cùng tác vụ reduce được thực hiện trên nhiều máy khác nhau, sẽ tạo ra nhiều file output giống nhau. Hệ thống file sẽ đảm bảo dữ liệu cuối cùng chỉ được tạo ra bởi một máy tính. Một cách tổng quát, nếu quy trình thực hiện map và reduce đã được xác định thì ngữ nghĩa của chương trình MapReduce tương đương với một chương trình được thực hiện tuần tự. Điều này giúp cho lập trình viên có thể dễ dàng hiểu được hành vi chương trình của họ. Nếu quá trình thực hiện map và reduce là không xác định, chúng tôi cung cấp ngữ nghĩa yếu hơn nhưng vẫn đảm bảo tính hợp lý. Trong thực tế đầu ra của tác vụ reduce R1 chưa xác định là tương đương với đầu ra của tác vụ R1 mà được thực hiện tuần tự. Tuy nhiên đầu ra của một tác vụ reduce R2 khác có thể không đúng với đầu ra khi thực hiện tuần tự trong một chương trình không xác định. Xem xét tác vụ map M và hai tác vụ reduce R1, R2. Cả R1 và R2 đều cần đầu vào từ kết quả của M, nhưng R1, R2 có thể đọc kết quả của M từ những lần thực thi khác nhau nên sẽ không đảm bảo được ngữ nghĩa của chương trình. 3.4 Truy cập địa phương Băng thông mạng là tài nguyên khó có thể cải thiện, nhưng có thể tìm cách để sử dụng nó một cách hợp lý. Dữ liệu lưu trên hệ thống file phân tán thực chất được lưu trên đĩa cứng của các máy tính trên cụm. Hệ thống file chia nhỏ mỗi file thành các block 64 MB và lưu một vài bản sao (thường là 3) của mỗi block trên các máy tính khác nhau. Master trong chương trình MapReduce lấy thông tin vị trí của các file input, nó sẽ điều phối sao cho các map worker có thể lấy được dữ liệu input của nó ngay trên đĩa địa phương (của chính map worker đó) hoặc có thể lấy được dữ liệu ở gần đó (thường trong cùng switch mạng). Nếu dữ liệu được chia nhỏ và lưu trữ hợp lý trên các máy tính, việc điều phối có thể giúp đọc được toàn bộ dữ liệu một cách địa phương mà không tiêu tốn băng thông mạng, ngay cả trong nhưng chương trình đòi hỏi tính toán lớn. 3.5 Chi tiết tác vụ Giai đoạn map được chia thành M phần và reduce được chia thành R phần như đã mô tả ở trên. Ý tưởng là M và R có thể rất lớn hơn so với số worker. Mỗi worker có thể đảm nhận nhiều tác vụ khác nhau cho phép cân bằng tải một cách linh hoạt, đồng thời tăng tốc độ khôi phục khi một worker bị lỗi: nhiều tác vụ map có thể hoàn thành bằng cách thực hiện trên tất cả các máy tính. Giới hạn về độ lớn của M và R trong thực tế là bao nhiêu? Như đã mô tả ở trên master cần phải thực hiện O(M + R) điều phối và lưu trữ O(M ∗ R) trạng thái trên bộ nhớ. (Kích thước bộ nhớ là có hạn nhưng tuy nhiên O(M ∗ R) trạng thái thường chỉ chiếm khoảng 1 byte cho mỗi cặp tác vụ map/re- duce.) Thêm vào đó, R là số thường được quy định bởi người dùng bởi vì đầu ra của mỗi tác vụ reduce sẽ là một mảnh của dữ liệu đầu ra. Trong thực tế, việc chọn M sao cho mỗi tác vụ chỉ cần xử lý một lượng dữ liệu trong khoảng từ 16-64MB từ dữ liệu đầu vào (đem lại hiệu quả cao nhất do có thể tối ưu địa phương như được mô tả ở trên). Trong khi đó R lại được đề nghị là một số không quá lớn so với số lượng máy worker. Thông thường với tính toán MapReduce chọn M = 200, 000 và R = 5, 000 khi chạy trên 2, 000 máy worker. 3.6 Tác vụ dự phòng Một trong những nguyên nhân thường thấy làm tăng thời gian thực thi của MapReduce là “Straggler”: một máy tính mà cần nhiều thời gian một cách bất thường để xử lý một tác vụ map hoặc reduce trong quá trình tính toán. Straggler xuất hiện có thể do hỏng hóc. Ví dụ, trên một máy tính với ổ địa kém có thể xảy ra lỗi làm giảm tốc độ đọc từ 30 MB/s xuống còn 1 MB/s. Hệ thống điều phối cụm có thể phải điều phối tác vụ khác cho máy tính này. Có một vài biện pháp để làm giảm bớt ảnh hưởng của Straggler. Khi một chương trình MapReduce sắp kết thúc, master điều phối thực thi tác vụ hỗ trợ đối với những tác vụ còn đang thực hiện. Một tác vụ
  • 6. được đánh dấu là hoàn tất khi việc thực thi chính tắc hoặc hỗ trợ hoàn tất. Cách làm này làm tiêu tốn thêm tài nguyên tính toán nhưng không quá vài phần trăm. Như trong ví dụ về giải thuật sắp xếp sẽ đươc nói tới ở phần 5.3 mất nhiều thời gian hơn 44% khi tác vụ hỗ trợ bị tắt. 4 Các tinh chỉnh Mặc dù chỉ cần viết các hàm Map và Reduce là đủ cho hầu hết các yêu cầu, xong người dùng vẫn có thể có các tinh chỉnh hữu ích khác. Chúng được mô tả trong phần này. 4.1 Hàm phân chia Những người dùng MapReduce xác định số lượng các tác vụ reduce (chính là số lượng các tập tin đầu ra) mà họ mong muốn (R). Dữ liệu được phân chia trên các tác vụ này bằng cách sử dụng một hàm phân chia trên các key trung gian. Hàm phân chia mặc định là hàm băm (ví dụ: “hash (key) mod R”). Điều này khiến cho các phần dữ liệu được phân chia khá cân bằng. Tuy nhiên, trong một số trường hợp, việc phân chia dữ liệu bằng một số hàm phân chia khác sẽ mang lại kết quả tốt hơn. Ví dụ, đôi khi các key đầu ra là các URL , chúng ta muốn với tất cả các url trong cùng một host đều cùng được xử lý trên một máy và kết quả của chúng nằm trong cùng file đầu ra. Để hỗ trợ các tình huống này, người sử dụng thư viện MapReduce có thể đưa ra hàm phân chia đặc biệt. Ví dụ, sử dụng “hash (Hostname (urlkey)) mod R” là hàm phân chia, như vậy thì tất cả các URL từ cùng một host sẽ có các kết quả khi thực hiện hàm reduce đều trong một tập tin đầu ra. 4.2 Đảm bảo thứ tự Chúng tôi đảm bảo rằng trong một phần dữ liệu nhất định, các cặp key/value trung gian được xử lý theo thứ tự tăng dần của key. Việc này giúp dễ dàng tạo ra một phần dữ liệu đầu ra đã được sắp xếp. Điều này hữu ích khi tệp tin đầu ra cần hỗ trợ cho việc tra cứu tìm kiếm theo key, hoặc khi người dùng các tập tin đầu ra cảm thấy hữu ích khi có trong tay dữ liệu đã được sắp xếp. 4.3 Hàm Combiner Trong một số trường hợp, có sự lặp lại đáng kể các key trung gian được tạo ra bởi các tác vụ Map, đồng thời hàm Reduce do người dùng viết lại có tính chất giao hoán và kết hợp. Một ví dụ điển hình cho điều này là bài toán đếm từ trong phần 2.1. Vì tần số của từ có xu hướng tuân theo phân bố Zipf, mỗi tác vụ Map sẽ tạo ra hàng trăm hoặc hàng nghìn bản ghi có dạng <the, 1>. Tất cả các bản ghi này sẽ được gửi qua mạng tới một tác vụ reduce và sau đó được cộng lại bởi hàm Reduce để tạo ra một số, như vậy hiệu năng của hệ thống sẽ giảm. Do đó, chúng tôi cho phép người dùng chỉ định một hàm Combiner tùy chọn để có thể kết hợp một số phần dữ liệu này trước khi nó được gửi qua mạng. Hàm Combiner được thực hiện trên các máy thực hiện tác vụ Map. Thông thường, nó chính là đoạn mã nguồn của hàm reduce. Sự khác biệt duy nhất giữa hàm reduce và hàm combiner là cách mà thư viện MapReduce xử lý đầu ra của chúng. Đầu ra của một hàm reduce được ghi vào tập tin đầu ra cuối cùng (final output), còn đầu ra của một hàm combiner được ghi vào một tập tin trung gian để gửi đến một tác vụ reduce. Việc kết hợp một số phần dữ liệu ở ngay trên máy thực hiện tác vụ map trước khi gửi qua mạng sẽ tăng tốc độ đáng kể cho nhiều hoạt động MapReduce. Phụ lục A chứa một ví dụ sử dụng hàm combiner. 4.4 Các kiểu đầu vào và đầu ra Thư viện MapReduce hỗ trợ việc đọc dữ liệu đầu vào theo nhiều định dạng khác nhau. Ví dụ, đầu vào dạng "text" xử lý mỗi dòng như một cặp key/value: key chính là độ lệch của dòng trong tệp và value là nội dung của dòng. Một định dạng khác được hỗ trợ lưu trữ một chuỗi các cặp key/value được sắp xếp theo key. Mỗi kiểu đầu vào được cài đặt để biết cách tự phân chia nó thành các khoảng phù hợp để xử lý bằng các tác vụ map riêng biệt (ví dụ: với dữ liệu text, việc chia tách khoảng đảm bảo biên phân chia chỉ xuất hiện ở ranh giới các dòng - như vậy các dòng sẽ được xử lý như một cặp key/value). Người dùng có thể tự thêm hỗ trợ cho một kiểu đầu vào mới bằng cách cung cấp một cài đặt giao diện reader đơn giản. Tuy vậy, phần lớn người dùng chỉ cần sử dụng các kiểu đầu vào đã được thư viện MapReduce hỗ trợ là đã đủ cho yêu cầu của mình. Một reader không nhất thiết phải đọc dữ liệu từ một tập tin.Các reader có thể đọc dữ liệu là các bản ghi từ một cơ sở dữ liệu, hoặc từ các cấu trúc dữ liệu được ánh xạ trong bộ nhớ. Tương tự như vậy, chúng tôi cũng hỗ trợ một tập các định dạng dữ liệu đầu ra khác nhau, và cũng rất dễ dàng cho người dùng khi muốn thêm hỗ trợ cho các kiểu đầu ra mới. 4.5 Side-effects Trong một số trường hợp, người sử dụng MapReduce thấy có ích khi tạo ra các tập tin phụ như đầu ra bổ sung từ các hoạt động map/reduce. Chúng tôi dựa vào những người viết ứng dụng (application writer) tạo ra các hiệu ứng lề duy nhất và không đổi như thế. Thông thường ứng dụng viết vào một tập tin tạm thời và atomically đổi tên tập tin này một khi nó đã được tạo ra đầy đủ. Chúng tôi không cung cấp hỗ trợ cho các commit hai pha nguyên tố (atomic two-phase com- mits) của nhiều tệp đầu ra được tạo ra bởi cùng một tác vụ nhất định. Do đó, các tác vụ tạo ra nhiều tệp đầu
  • 7. ra với các yêu cầu nhất quán về các tệp tin chéo nên được xác định. Hạn chế này không phải là một vấn đề quá lớn trong thực tế. 4.6 Bỏ qua các bản ghi tồi Đôi khi có lỗi trong mã nguồn của người dùng làm cho hàm Map hoặc Reduce xảy ra sự cố và dừng trên một số bản ghi. Những lỗi như vậy ngăn cản hoạt động MapReduce hoàn thành. Cách đối phó thông thường là sửa lỗi, nhưng đôi khi điều này là không khả thi. Có thể lỗi này nằm trong thư viện của bên thứ ba mà mã nguồn không có. Ngoài ra, đôi khi có thể chấp nhận việc bỏ qua một số bản ghi, ví dụ như khi thực hiện phân tích thống kê trên một bộ dữ liệu lớn. Chúng tôi cung cấp một chế độ thực thi tùy chọn, nhờ đó thư viện MapReduce phát hiện bản ghi nào gây ra các sự cố và bỏ qua các bản ghi này để tiếp tục thực hiện quá trình xử lý. Mỗi worker được cài đặt một trình xử lý tín hiệu nhận các vi phạm phân đoạn và lỗi bus. Trước khi gọi tác vụ Map hay Reduce của người dùng, thư viện MapReduce lưu trữ số thứ tự tham số trong một biến toàn cục. Nếu chương trình của người dùng tạo ra một tín hiệu, trình xử lý tín hiệu sẽ gửi một gói tin UDP "last gasp" có chứa số thứ tự cho MapReduce master. Khi master nhìn thấy nhiều hơn một lỗi trên một bản ghi cụ thể, master sẽ báo rằng bản ghi nên được bỏ qua khi nó chạy lại các tác vụ Map/Reduce tương ứng. 4.7 Thực thi cục bộ Gỡ các lỗi trong các hàm Map/Reduce có thể rất phức tạp, vì việc tính toán xảy ra trong một hệ thống phân tán, thường là trên vài ngàn máy, mà các quyết định giao việc gì cho worker nào thì được thực hiện tự động bởi master. Để giúp thuận lợi cho việc gỡ lỗi, lập hồ sơ, và thử nghiệm quy mô nhỏ, chúng tôi đã phát triển một cơ chế thực thi khác của thư viện MapReduce là thực hiện tuần tự tất cả công việc của một hoạt động MapReduce trên máy địa phương (local). Quyền kiểm soát chúng được cung cấp cho người dùng, nên việc tính toán có thể được giới hạn cho các tác vụ map cụ thể. Người dùng gọi chương trình của họ bằng một cờ đặc biệt và sau đó có thể dễ dàng sử dụng bất kỳ công cụ gỡ lỗi hoặc thử nghiệm nào mong muốn (ví dụ: gdb). 4.8 Thông tin trạng thái Master chạy một máy chủ HTTP ở bên trong và xuất ra một tập các trang trạng thái cho con người. Các trang này hiển thị các trạng thái của tiến trình đang tính toán, chẳng hạn như số lượng tác vụ đã hoàn thành, số lượng tác vụ đang thực thi, các byte đầu vào, các byte của dữ liệu trung gian, các byte đầu ra, tốc độ xử lý, vv. Các trang cũng chứa liên kết đến lỗi tiêu chuẩn và các tập tin đầu ra tiêu chuẩn được tạo ra bởi mỗi tác vụ. Người dùng có thể sử dụng các thông tin này để dự đoán việc tính toán sẽ mất bao lâu, và liệu có nên thêm nhiều tài nguyên tính toán hay không. Các thông tin này cũng có thể được sử dụng để chỉ ra khi nào tính toán chậm hơn nhiều so với dự kiến. Ngoài ra, ở mức cao hơn, các trang trạng thái cho biết worker nào đã bị lỗi và các tác vụ map và reduce nào đang được xử lý trên worker đó khi bị lỗi. Thông tin này khá hữu ích khi muốn tìm kiếm lỗi trong chương trình của người dùng. 4.9 Bộ đếm Thư viện MapReduce cung cấp một công cụ bộ đếm để tính các biến cố/sự cố của các sự kiện khác nhau. Ví dụ: chương trình của người dùng có thể muốn đếm tổng số từ đã được xử lý hoặc số tài liệu của Đức đã được lập chỉ mục, v.v. Để sử dụng bộ đếm này, chương trình của người dùng tạo một đối tượng bộ đếm được đặt tên và sau đó tăng bộ đếm một cách hợp lý trong hàm Map/Reduce . Ví dụ: Counter* uppercase; uppercase = GetCounter("uppercase"); map(String name, String contents): for each word w in contents: if (IsCapitalized(w)): uppercase->Increment(); EmitIntermediate(w, "1"); Các giá trị của (bộ đếm) từ các máy worker riêng lẻ được định kỳ lan truyền đến master (piggybacked trên ping response). Master tổng hợp giá trị bộ đếm từ các tác vụ map và reduce thành công, rồi trả lại chúng cho chương trình của người dùng khi hoạt động MapReduce hoàn tất. Các giá trị bộ đếm hiện tại cũng được hiển thị trên trang trạng thái của master để con người có thể xem tiến trình tính toán trực tiếp . Khi tổng hợp giá trị bộ đếm, Master sẽ loại bỏ việc thực thi trùng lặp của cùng một tác vụ map/reduce để tránh đếm hai lần. (Sự thực hiện trùng lặp có thể phát sinh từ việc chúng ta sử dụng các tác vụ sao lưu và từ việc chạy lại các tác vụ do lỗi.) Một số giá trị bộ đếm được tự động duy trì bởi thư viện MapReduce, chẳng hạn như số lượng cặp key/value đầu vào đã được xử lý và số lượng cặp key/value đã được tạo ra. Nhiều người dùng thấy rằng, công cụ bộ đếm này hữu ích khi muốn kiểm tra nhanh hành vi của hoạt động MapReduce. Ví dụ, trong một số hoạt động MapReduce, người dùng có thể muốn đảm bảo rằng số lượng các cặp đầu ra được tạo ra chính xác bằng số cặp đầu vào được xử lý, hoặc rằng phần tài liệu Đức đã được xử lý nằm trong một phần cho phép của tổng số tài liệu được xử lý.
  • 8. 5 Hiệu năng Trong phần này chúng tôi sẽ đo hiệu năng của mô hình MapReduce trên hai bài toán tính toán chạy trên một cụm lớn các máy. Một bài toán tính toán sẽ thực hiện tìm kiếm trên xấp xỉ một tetabyte dữ liệu để tìm ra một kiểu mẫu cụ thể nào đó. Một bài toán khác là thực hiện công việc sắp xêp trên xấp xỉ một tetabyte dữ liệu. Hai chương trình trên, mỗi chương trình là tiêu biểu cho một tập con rộng lớn của các chương trình trong thực tế mà được viết bởi người lập trình MapReduce. Một bài toán thực hiện việc trộn dữ liệu từ một thể hiện dữ liệu với những thể hiện khác. Một lớp bài toán khác là trích rút dữ liệu phù hợp từ một lượng lớn dữ liệu. 5.1 Cấu hình cụm máy tính Tất cả các chương trình được thực thi trên một cụm chứa khoảng 1800 máy. Mỗi máy có hai vi xử lý Intel Xeon 2GHz với công nghệ HyperThreading, 4GB bộ nhớ chính, hai ổ cứng 160GB IDE, và một đường truyền Ethernet tốc độ một gigabit. Các máy được sắp xếp tạo thành một mạng chuyển mạch hình cây hai cấp với xấp xỉ 100-200 Gbps băng thông tại nút gốc. Tất cả các máy trong cùng một phạm vi định danh nên thời gian truyền thông giữa hai máy bất kì là nhỏ hơn một phần nghìn giây. Một phần của bộ nhớ chính, khoảng từ 1-1.5GB được giữ lại để phục vụ cho những tác vụ khác trong cụm. Các chương trình được chạy vào chiều cuối tuần nên các chíp xử lý, ổ cứng, đường truyền mạng là hầu như rảnh rỗi. 5.2 Grep Chương trình duyệt qua mười tỉ bản ghi, mỗi bản ghi có kích thước 100 bytes, tìm kiếm mẫu 3 kí tự tương đối ít xuất hiện(những mẫu xuất hiện trong 92,337 bản ghi). Đầu vào được chia ra thành từng mảnh, mỗi mảnh xấp xỉ khoảng 64MB( M=15000). Toàn bộ dữ liệu đầu ra được đặt vào một tệp(R=1) Biểu đồ 2 biểu diễn quá trình thực thi tính toán theo thời gian. Trục Y biểu diễn tốc độ dữ liệu đầu vào được duyệt qua. Tốc độ tăng dần theo số lượng máy được phân công tính toán, và cao nhất là 30 GB/s khi 1764 máy được phân công tác vụ.Khi tác vụ Map kết thúc, tốc độ này bắt đầu giảm và xuống đến 0 sau khoảng 80 giây. Toàn bộ quá trình tính toán khoảng 150 giây từ khi bắt đầu đến khi kết thúc. Thời gian này đã bao gồm quả chi phí khởi động. Tổng chi phí bao gồm thời gian truyền chương trình đến cho các máy tính toán, thời gian trễ do việc tương tác với GFS để mở tệp dữ liệu và lấy về thông tin cần thiết. Hình 2: Tốc độ truyền dữ liệu theo thời gian 5.3 Sắp xếp Chương trình sắp xếp thực hiện sắp xếp 10 tỉ bản ghi, mỗi bản ghi có kích thước 100 byte(xấp xỉ một tetabyte dữ liệu). Chương trình này được mô hình theo tiêu chuẩn TeraSort [10]. Chương trình chứa ít hơn 50 dòng mã. Hàm Map gồm 3 dòng mã, thực hiện trích rút ra 10-byte key sắp xếp từ một dòng kí tự và sau đó đưa ra một key và dòng kí tự gốc như một cặp key/value. Chúng tôi sử dụng một hàm đã xây dựng Identity như là hàm Reduce. Hàm này sẽ chuyển cặp cặp key/value không bị thay đổi gì như là cặp key/value đầu ra. Kết quả được sắp xếp cuối cùng được ghi ra một tập hợp dưới dạng tệp GFS sao lưu thành hai bản sao. Như trước đó, dữ liệu đầu vào được chia thành các phần 64MB(M=15000). Chúng tôi cũng chia tệp được sắp xếp thành 4000 tệp(M=4000). Hàm phân chia sử dụng các byte đầu của key để tách các key thành từng phần trong số các phần R. Hàm phân mảnh cho bài toán TeraSort được xây dựng dựa trên thông tin phân bố của các khóa. Trong các chương trình sắp xếp thông thường, chúng tôi cần thêm một toán tử MapReduce để lấy mẫu key và sử dung phân bố của key để tính ra các điểm phân chia cho lượt sắp xếp cuối cùng. Biểu đồ 3 (a) thể hiện quá trình thực thi thông thường của chương trình sắp xếp. Biểu đồ trên cùng phía trên trái chỉ ra tốc độ đọc dữ liệu đầu vào. Tốc độ đạt mức cao nhất khoảng 13GB/s và sau đó nhanh chóng giảm bởi vì tác vụ Map đã xong trước khoảng thời gian 200 giây. Chú ý là tốc độ đọc dữ liệu là nhỏ hơn so với bài toán grep. Nguyên nhân chính là bởi vì tác vụ Map dành hầu hết thời gian cho việc ghi các kết quả đầu ra trung gian ra ổ cứng cục bộ. Trong khi đó đầu ra trong bài toán grep có kích thước bé hơn rất nhiều. Biểu đồ bên trái ở giữa thể hiện tỉ lệ dữ liệu được gửi từ các tác vụ Map đến các tác vụ Reduce. Qúa trình trộn dữ liệu diễn ra ngay sau khi tác vụ Map đầu tiên hoàn thành. Trong biểu đồ, gò đầu tiên là tập các tác vụ Reduce đầu tiên, xấp xỉ khoảng 1700 tác vụ(toàn bộ tác vụ Reduce được phân cho 1700 máy, mỗi máy thực hiện nhiều nhất một tác vụ Reduce tại một thời điểm). Xấp xỉ khoảng 300 giây cho việc tính toán, một vài trong số các tác vụ
  • 9. Hình 3: Tỉ lệ truyền dữ liệu theo thời gian cho các giao đoạn của quá trình tính toán Reduce đầu tiên hoàn thành và chúng ta bắt đầu thực hiện việc trộn dữ liệu cho các tác vụ Reduce còn lại. Toàn bộ quá trình trộn tốn khoảng 600 giây. Biểu đồ dưới cùng bên trái thể hiện tỉ lệ dữ liệu sau khi được sắp xếp và được tác vụ Reduce ghi ra tệp đầu ra. Có một khoảng trễ giữa khoảng thời gian trộn đầu tiên và quá trình ghi là do các máy cần tốn thời gian cho việc trộn các kết quả trung gian. Qúa trình ghi tiếp tục với tỉ lệ 2-4 GB/s trong một khoảng thời gian. Toàn bộ quá trình ghi kết thúc trong khoảng 850 giây. Bao gồm cả tổng chi phí khởi động, quá trình thực hiện trong 891 giây. Kết quả này cũng tương tự với kết quả tốt nhất được báo cáo hiện tại 1057 giây cho điểm chẩm TeraSort. Một vài điều chú ý: tỉ lệ trong quá trình đầu vào cao hơn tỉ lệ trong quá trình trộn và quá trình xuất ra lý do là bởi việc tối ưu cục bộ của chúng tôi - tất cả dữ liệu được đọc từ các ổ cứng cục bộ và bỏ qua những giới hạn tương đối trong băng thông mạng. Tỉ lệ trộn là cao hơn tỉ lệ trong quá trình xuất ra là bởi vì quá trình xuất ra, chúng tôi viết ra thêm hai bản sao lưu cho dữ liệu đã được sắp xếp(chúng tôi tạo ra hai bản sao cho kết quả đầu ra vì lý do tin cậy và sẵn sàng của thông tin). Chúng tôi viết hai bản sao bởi đó là kĩ thuật cho tính tin cậy và tính sẵn sàng của dữ liệu cho các hệ thống tệp dữ liệu cơ bản. Băng thông mạng cho việc ghi dữ liệu có thể được giảm nếu như hệ thống tệp cơ bản sử dụng "mã hóa xóa bỏ" thay vì sao chép lại. 5.4 Ảnh hưởng của quá trình sao lưu tác vụ Trong biểu đồ 3 (b), chúng tôi đưa ra quá trình thực thi chương trình sắp xếp nhưng bỏ qua tác vụ sao lưu tác vụ. Luồng thực thi là giống như đã đưa ra ở biểu đồ 3 (a), ngoại trừ là có một khoảng dài phía cuối hầu như rất ít khi có sự xuất hiện của hoạt động ghi. Sau 960 giây, tất cả ngoại trừ còn lại 5 tác vụ Reduce đã hoàn thành. Tuy nghiên, những tác vụ Reduce chạy chậm này không kết thúc đến 300 giây sau. Toàn bộ quá trình tính toán mất 1283 giây, tăng 40% trong tổng thời gian. 5.5 Vấn đề máy tính toán lỗi Trong biểu đồ 3 (c), chúng tôi thể hiện quá trình thực thi của chương trình sắp xếp, tại đó chúng tôi cố ý tắt đi 200 trong sô 1746 tiến trình làm việc trong một vài phút khi tính toán. Ngay lập tức, bộ lập lịch trên cụm khởi động lại một tiếng trình làm việc mới tại máy này(bởi vì chỉ có tiến trình bị ngừng, còn các máy vẫn hoạt động tốt). Những lần kết thúc máy làm việc toán thể hiện như tỉ lệ đầu vào âm bởi vì một vài tác vụ Map đã hoàn thành trước đó biến mất (bởi vì những tác vụ Map tương ứng với máy làm việc cũng bị kết thúc theo). Việc thực thi lại các tác vụ Map lặp lại rất nhanh chóng. Toàn bộ quá trình tính toán hoàn thiện trong 933 giây bao gồm cả tổng chi phí khởi động (chỉ tăng 5% so với thời gian thực thi thông thường).
  • 10. 6 Thử nghiệm Chúng tôi viết phiên bản đầu tiên cho thư viện MapReduce vào tháng 2 năm 2003 và tạo ra những cải thiện đáng kể vào tháng 8 năm 2003, bao gồm cả việc tối ưu hóa địa phương, cân bằng tải động của quá trình thực thi trong các máy. Thời điểm này, chúng tôi vô cùng ngạc nhiên về tính ứng dụng rộng rãi của thư viện MapReduce đối với các công việc chúng tôi đang làm. Nó được sử dụng trong nhiều lĩnh vực của Google, bao gồm: • vấn đề học máy trên phạm vi lớn, • vấn đề phân cụm cho Google News và các sản phẩm của Froogle, • trích rút ra dữ liệu được sử dụng tạo ra báo cáo về các câu truy xuất thường xuyên (ví dụ: Google Zeitgeis), • trích rút ra những thuộc tính của trang web cho những thí nghiệm và tính nămg mới (ví dụ: trích rút ra vị trí địa lý từ tập các trang web for việc tìm kiếm theo địa điểm), và • tính toán đồ thị trên phạm vi lớn. Hình 4: Số lượng ví dụ theo thời gian Bảng 1: MapReduce Job chạy trong tháng 8 năm 2004 Số lượng job 29423 thời gian trung bình hoàn thiện job 634 giây số ngày máy được sử dụng 79186 Dữ liệu đọc 3288TB Dữ liệu trung gian tạo ra 758TB Dữ liệu ghi ra 193TB Số worker trung bình trên job 157 Số worker trung bình chết trên job 1.2 Số tác vụ map trên job 3351 Số tác vụ reduce trên job 55 Triển khai riêng tác vụ Map 395 Triển khai riêng tác vụ Reduce 269 Triển khai kết hợp Map/Reduce 426 Biểu đồ 4 cho thấy sự tăng trưởng nhanh chóng về số lượng chương trình MapReduce riêng rẽ được ghi lại bởi hệ thống quản lý mã nguồn qua thời gian, từ con số 0 vào đầu năm 2003 đến gần 900 chương trình vào cuối tháng 9 nằm 2004. MapReduce đã rất thành công bởi vì nó có cho phép viết một chương trình đơn giản và chạy một cách hiệu quả trên hàng nghìn máy trong một khóa học nửa giờ, đẩy nhanh quá trình phát triển và mô hình lặp. Hơn nữa, nó cho phép người lập trình chưa có kinh nghiệm về hệ thống phân tán hay song song có thể khai thác một số lượng lớn các tài nguyên một cách hiệu quả. Tại điểm kết thúc của mỗi công việc, MapReduce thống kê về những tài nguyên tính toán được sử dụng bởi công việc. Trong bảng 1, chúng tôi đưa ra thống kê cho một tập con các công việc MapReduce chạy tại Google vào tháng 8 năm 2014. 6.1 Đánh chỉ mục trên phạm vi rộng Một trong số những sử dụng quan trọng của MapRe- duce cho đến nay của chúng tôi là việc viết lại hệ thống tạo ra chỉ mục, hệ thống mà tạo ra các cấu trúc dữ liệu được sử dụng cho dịch vụ tìm kiếm trang web của Google. Hệ thống đánh chỉ mục nhận đầu vào là một tập lớn tài liệu, những tài liệu này được lấy về thông qua hệ thống thu thâp của chúng tôi, và được lưu trữ như một tập các tệp GFS. Nội dung thô của các dữ liệu này là hơn 20 terabytes. Qúa trình đánh chỉ mục thực hiện như một chuỗi từ 5 đến 10 toán tử MapReduce. Việc sử dụng MapRe- duce (thay vì truyền thông phân tán tự cung tự cấp trong các phiên bản trước của hệ thống đánh chỉ mục) thu được những lợi ích sau: • Các câu lệnh đánh chỉ mục đơn giản hơn, ngắn hơn và dễ hiểu hơn, bởi vì những câu lệnh cho việc vượt qua lỗi, phân tán, song song là ẩn đi trong thư viện MapReduce. Ví dụ, kích thước của một pha trong tính toán giảm từ xấp xỉ 3800 dòng code khi viết bởi ngôn ngữ C++ xuống còn xấp xỉ 700 dòng khi viết bởi MapRe- duce. • Hiệu năng của thư viện MapReduce là đủ khả năg để chúng ta có thể giữ những việc tính toán
  • 11. không liên quan đến nhau theo lý thuyết độc lập với nhau, thay vì trộn chúng lại với nhau để tránh những việc dư thừa đối với dữ liệu. Ví dụ, một thay đổi có thể tốn một vài tháng đối với hệ thống cũ nhưng chỉ mất vài ngày để thực hiện trên hệ thống mới. • Qúa trình đánh chỉ mục trở nên dễ dàng hơn nhiều để hoạt động, bởi vì hầu hết các vấn đề gây ra bởi việc hỏng máy, máy hoạt động chậm, trục trặc về mạng đã được xử lý một cách tự động bởi thư viện MapReduce mà không cần sự can thiệp của chương trình nào. Thêm nữa, nó dễ dàng cải thiện hiệu năng của quá trình đánh chỉ mục bằng cách thêm máy mới vào cùm máy đánh chỉ mục. 7 Các công trình liên quan Nhiều hệ thống đã cung cấp các mô hình lập trình giới hạn (restricted programming models) và sử dụng các giới hạn để song song hóa tự động các tính toán. Ví dụ, một hàm liên kết có thể tính toán trên các tiền tố của một mảng N phần tử trong khoảng thời gian log N trên N bộ xử lý bằng cách sử dụng tính toán tiền tố song song (parallel prefix compu- tations) [6, 9, 13]. MapReduce được coi là phép đơn giản hóa và làm sạch các mô hình trên dựa vào kinh nghiệm làm việc với các tính toán cỡ lớn trong thực tế. Quan trọng hơn, chúng tôi cung cấp một phép cài đặt có khả năng chịu lỗi có thể mở rộng lên tới hàng nghìn bộ xử lý. Trong khi đó, hầu hết các hệ thống xử lý song song hiện có chỉ được cài đặt trên phạm vi nhỏ và đẩy các chi tiết về xử lý sự cố, thất bại cho các lập trình viên. Lập trình đồng bộ theo đống (Bulk Synchronous Programming) [17] và một vài MPI nguyên thủy [11] cung cấp cách nhìn trừu tượng ở mức cao hơn giúp cho các lập trình viên dễ dàng viết các chương trình song song. Điểm khác biệt chủ đạo giữa những hệ thống đó và MapReduce là ở chỗ, MapReduce khai thác mô hình lập trình giới hạn để song song hóa chương trình một cách tự động và cung cấp khả năng chịu lỗi trong suốt. Bộ tối ưu hóa cục bộ được bắt nguồn từ các kỹ thuật như các đĩa kích hoạt [12, 15], tại đó các tính toán dùng để xử lý các thành phần gần với đĩa cục bộ, để giảm thiểu số lượng dữ liệu được gửi thông qua cổng I/O của mạng. Chúng tôi chạy trên các bộ xử lý phổ thông, trong đó một số lượng nhỏ đĩa được kết nối trực tiếp thay vì chạy trực tiếp trên các bộ xử lý điều khiển đĩa, nhưng về cách tiếp cận tổng quát thì là tương tự. Cơ chế tác vụ dự phòng giống với cơ chế lập lịch tích cực (eager scheduling) được sử dụng trong Hệ thống Charlotte [3]. Một trong những điều thiếu sót của việc lập lịch tích cực đơn giản là nếu một tác vụ nhất định gây lỗi lặp đi lặp lại, toàn bộ tính toán không thể hoàn thành. Chúng tôi đã khắc phục một vài trường hợp của vấn đề này với cơ chế bỏ qua các bản ghi lỗi. Phép cài đặt MapReduce dựa trên hệ thống quản lý cụm nằm bên trong chịu trách nhiệm việc phân tán và thực thi các tác vụ người dùng trên một tập lớn các máy cùng chia sẻ. Tuy đây không phải là mục tiêu của bài báo này, tinh thần của hệ thống quản lý cụm giống với các hệ thống khác như Condor [16]. Khả năng sắp xếp là một phần của thư viện MapReduce, tương tự trong tính toán với NOW- Sort [1]. Các máy nguồn (máy thực thi map) phân nhỏ dữ liệu để sắp xếp và gửi đến một trong R máy thực thi reduce. Mỗi máy thực thi reduce sắp xếp dữ liệu một cách cục bộ (trong bộ nhớ nếu có thể). NOW-Sort không có các hàm Map và Reduce có thể được định nghĩa bởi người dùng, điều làm cho thư viện của chúng ta được áp dụng rộng rãi. River [2] cung cấp mô hình lập trình tại đó các tiến trình giao tiếp với nhau bằng cách gửi dữ liệu qua các hàng đợi phân tán. Giống với MapReduce, hệ thống River cung cấp hiệu năng với mặt bằng chung tốt, mặc dù có sự xuất hiện của các yếu tố không đồng nhất do phần cứng không đồng nhất hoặc do nhiễu loạn của hệ thống. River đạt được điều này do lập lịch trên đĩa kỹ lưỡng và chuyển giao trên mạng để có được thời gian hoàn thành mức cân bằng. MapReduce có cách tiếp cận khác. Bằng cách giới hạn mô hình lập trình, framework MapReduce có thể phân nhỏ vấn đề thành số lượng lớn các tác vụ được làm mịn. Các tác vụ này được lập lịch động trên các máy sẵn sàng do đó các tác vụ được xử lý nhanh. Mô hình lập trình có giới hạn đồng thời cho phép ta lập lịch việc thực thi các tác vụ dư thừa gần với đoạn cuối, giúp giảm đáng kể thời gian hoàn thành với sự xuất hiện của các yếu tố không đồng nhất (như các máy làm việc chậm hoặc bị nghẽn). BAD-FS [5] có mô hình lập trình rất khác so với MapReduce, khác với MapReduce, mục tiêu của việc thực thi bao trùm trên mạng diện rộng. Tuy vậy, có hai điểm tương đồng như sau. (1) Cả hai hệ thống đều sử dụng việc thực thi dư thừa để phục hồi mất mất dữ liệu gây ra bởi các sự cố. (2) Cả hai đều sử dụng lập lịch mức địa phương để giảm thiểu lượng dữ liệu gửi qua các liên kết dễ tắc nghẽn trong mạng. TACC [7] là một hệ thống được thiết kế để đơn giản hóa việc xây dựng các dịch vụ mạng có tính sẵn sàng cao. Giống với MapReduce, nó dựa trên cơ chế tái thực thi để thực hiện tính năng chịu lỗi. 8 Kết luận Mô hình lập trình MapReduce đã được sử dụng thành công tại Google cho nhiều mục đích. Chúng tôi coi đây là thành công vì một số lý do. Đầu tiên, mô hình này dễ sử dụng, thậm chí với các lập trình viên chưa có kinh nghiệm với hệ thống song song và phân tán, vì nó ẩn đi các chi tiết về song song hóa, chịu lỗi, tối ưu hóa cục bộ và cân bằng tải. Thứ hai, số lượng lớn các vấn đề đa dạng được diễn đạt
  • 12. dễ dàng thông qua MapReduce. Ví dụ, MapReduce được áp dụng cho thế hệ dữ liệu dành cho các sản phẩm của Google bao gồm dịch vụ tìm kiếm trên web, sắp xếp, khai phá dữ liệu, học máy, và nhiều hệ thống khác. Thứ ba, chúng tôi đã phát triển việc triển khai MapReduce lên tới phạm vi các cụm máy lớn gồm hàng nghìn máy. Việc triển khai này tận dụng hiệu quả tài nguyên máy và do đó, phù hợp với nhiều mục đích sử dụng với lượng lớn các vấn đề tính toán tại Google. Chúng tôi đã ghi nhận được một vài điều từ công trình này. Đầu tiên, giới hạn mô hình lập trình giúp việc song song hóa, tính toán phân tán và chịu lỗi dễ dàng hơn. Thứ hai, băng thông mạng là tài nguyên găng. Một vài phép tối ưu hóa trong hệ thống có tác vụ giảm thiểu khối lượng dữ liệu gửi qua mạng: Tối ưu hóa cục bộ cho phép chúng ta đọc dữ liệu từ các đĩa cục bộ, và viết các bản sao của dữ liệu trung gian lên đĩa cục bộ để tiết kiệm băng thông mạng. Thứ ba, các phép thực thi dư thừa có thể được sử dụng để giảm thiểu các tác động của máy xử lý chậm, xử lý sự cố máy và mất mát dữ liệu. Lời cảm ơn Josh Levenberg đã giúp đỡ chúng tôi rất nhiều trong việc xem xét và mở rộng MapReduce API mức người dùng với nhiều tính năng mới dựa trên kinh nghiệm của mình trong việc sử dụng MapReduce cùng các đề xuất của cộng sự trong việc nâng cao hiệu năng. MapReduce đọc đầu vào và viết đầu ra tại Google File System [8]. Chúng tôi dành lời cảm ơn tới Mo- hit Aron, Howard Gobioff, Markus Gutschke, David Kramer, Shun-Tak Leung, và Josh Redstone đã dành công sức của mình trong việc phát triển GFS. Chúng tôi đồng thời muốn cảm ơn Percy Liang và Olcan Sercinoglu vì đã phát triển hệ thống quản lý cụm mà MapReduce sử dụng. Mike Burrows, Wilson Hsieh, Josh Levenberg, Sharon Perl, Rob Pike, và Debby Wallach đã dành những nhận xét hữu ích về những bản thảo trước đây của bài báo này. Những người đánh giá ẩn danh OSDI, và người hướng dẫn của chúng tôi, Eric Brewer đã đưa ra nhiều góp ý quý báu về những khía cạnh mà bài báo này cần cải thiện. Cuối cùng, chúng tôi chân thành cảm ơn tất cả những người dùng của MapReduce trong tổ chức kỹ thuật của Google đã đưa ra những phản hồi, góp ý và báo cáo lỗi hữu ích. Các tham chiếu [1] Andrea C. Arpaci-Dusseau, Remzi H. Arpaci- Dusseau, David E. Culler, Joseph M. Hellerstein, and David A. Patterson. High-performance sorting on networks of work-stations. In Proceedings of the 1997 ACM SIGMOD International Conference on Management of Data, Tucson, Arizona, May 1997. [2] Remzi H. Arpaci-Dusseau, Eric Anderson, Noah Treuhaft, David E. Culler, Joseph M. Heller- stein, David Patterson, and Kathy Yelick. Cluster I/O with River: Making the fast case common. In Proceedings of the Sixth Workshop on Input/Out- put in Parallel and Distributed Systems (IOPADS ’99), pages 10–22, Atlanta, Georgia, May 1999. [3] Arash Baratloo, Mehmet Karaul, Zvi Kedem, and Peter Wyckoff. Charlotte: Metacomputing on the web. In Proceedings of the 9th International Conference on Parallel and Distributed Computing Systems, 1996. [4] Luiz A. Barroso, Jeffrey Dean, and Urs H¨olzle. Web search for a planet: The Google cluster archi- tecture. IEEE Micro, 23(2):22–28, April 2003 [5] John Bent, Douglas Thain, Andrea C.Arpaci- Dusseau, Remzi H. Arpaci-Dusseau, and Miron Livny. Explicit control in a batch-aware distributed file system. In Proceedings of the 1st USENIX Sym- posium on Networked Systems Design and Imple- mentation NSDI, March 2004. [6] Guy E. Blelloch. Scans as primitive parallel operations. IEEE Transactions on Computers, C- 38(11), November 1989 [7] Armando Fox, Steven D. Gribble, Yatin Chawathe, Eric A. Brewer, and Paul Gauthier. Cluster-based scalable network services. In Proceed- ings of the 16th ACM Symposium on Operating System Principles, pages 78–91, Saint-Malo, France, 1997. [8] Sanjay Ghemawat, Howard Gobioff, and Shun- Tak Leung. The Google file system. In 19th Sympo- sium on Operating Systems Principles, pages 29–43, Lake George, New York, 2003. [9] S. Gorlatch. Systematic efficient parallelization of scan and other list homomorphisms. In L. Bouge, P. Fraigniaud, A. Mignotte, and Y. Robert, editors, Euro-Par’96. Parallel Processing, Lecture Notes in Computer Science 1124, pages 401–408. Springer- Verlag, 1996. [10] Jim Gray.Sort benchmark home page. http://research.microsoft.com/barc/SortBenchmark/. [11] William Gropp, Ewing Lusk, and Anthony Skjellum. Using MPI: Portable Parallel Program- ming with the Message-Passing Interface. MIT Press, Cambridge, MA, 1999. [12] L. Huston, R. Sukthankar, R. Wick- remesinghe, M. Satyanarayanan, G. R. Ganger, E. Riedel, and A. Ailamaki. Diamond: A storage ar- chitecture for early discard in interactive search. In Proceedings of the 2004 USENIX File and Storage Technologies FAST Conference, April 2004. [13] Richard E. Ladner and Michael J. Fischer. Parallel prefix computation. Journal of the ACM, 27(4):831–838, 1980. [14] Michael O. Rabin. Efficient dispersal of infor- mation for security, load balancing and fault toler- ance. Journal of the ACM, 36(2):335–348, 1989. [15] Erik Riedel, Christos Faloutsos, Garth A. Gibson, and David Nagle. Active disks for large-scale
  • 13. data processing. IEEE Computer, pages 68–74, June 2001. [16] Douglas Thain, Todd Tannenbaum, and Miron Livny. Distributed computing in practice: The Condor experience. Concurrency and Compu- tation: Practice and Experience, 2004. [17] L. G. Valiant. A bridging model for par- allel computation. Communications of the ACM, 33(8):103–111, 1997. [18] Jim Wyllie. Spsort: How to sort a terabyte quickly. http://alme1.almaden.ibm.com/cs/spsort.pdf. Phụ lục A: Word Frequency Đoạn này chứa 1 ví dụ đếm số lần xuất hiện của các từ trong một tập các file đầu vào được chỉ định trong dòng lệnh. #include "mapreduce/mapreduce.h" // User’s map function class WordCounter : public Mapper { public: virtual void Map(const MapInput& input) { const string& text = input.value(); const int n = text.size(); for (int i = 0; i < n; ) { // Skip past leading whitespace while ((i < n) && isspace(text[i])) i++; // Find word end int start = i; while ((i < n) && !isspace(text[i])) i++; if (start < i) Emit(text.substr(start,i-start),"1"); } } }; REGISTER_MAPPER(WordCounter); // User’s reduce function class Adder : public Reducer { virtual void Reduce(ReduceInput* input) { // Iterate over all entries with the // same key and add the values int64 value = 0; while (!input->done()) { value += StringToInt(input->value()); input->NextValue(); } // Emit sum for input->key() Emit(IntToString(value)); } }; REGISTER_REDUCER(Adder); int main(int argc, char** argv) { ParseCommandLineFlags(argc, argv); MapReduceSpecification spec; // Store list of input files into "spec" for (int i = 1; i < argc; i++) { MapReduceInput* input = spec.add_input(); input->set_format("text"); input->set_filepattern(argv[i]); input->set_mapper_class("WordCounter"); } // Specify the output files: // /gfs/test/freq-00000-of-00100 // /gfs/test/freq-00001-of-00100 // ... MapReduceOutput* out = spec.output(); out->set_filebase("/gfs/test/freq"); out->set_num_tasks(100); out->set_format("text"); out->set_reducer_class("Adder"); // Optional: do partial sums within map // tasks to save network bandwidth out->set_combiner_class("Adder"); // Tuning parameters: use at most 2000 // machines and 100 MB of memory per task spec.set_machines(2000); spec.set_map_megabytes(100); spec.set_reduce_megabytes(100); // Now run it MapReduceResult result; if (!MapReduce(spec, &result)) abort(); // Done: ’result’ structure contains info // about counters, time taken, number of // machines used, etc. return 0; }