Local Aggregation

Một phần của tài liệu XỬ lý dữ LIỆU PHÂN tán với MAPREDUCE và xây DỰNG ỨNG DỤNG MINH họa (Trang 33 - 40)

3 Thiết kế thuật toán cho MapReduce

3.1 Local Aggregation

Trong việc xử lý dữ liệu lớn, một phần quan trọng nhất của sự đồng bộ hóa là việc trao đổi các kết quả trung gian từ các tiến trình tạo ra nó đến các tiến trình sẽ sử dụng nó. Trong môi trƣờng xử lý song song thì các kết quả trung gian này phải đƣợc truyền qua mạng. Hơn nữa, trong Hadoop các kết quả trung gian đƣợc ghi vào đĩa cục bộ trƣớc khi đƣợc gửi qua mạng. Vì độ trễ của mạng và đĩa cao hơn nhiều so với các phép toán khác nên việc giảm số lƣợng các kết quả trung gian sẽ làm tăng tính hiệu quả của thuật toán. Trong MapReduce, việc gộp cục bộ các kết quả trung gian là một trong các cách giúp cho thuật toán nhanh hơn. Thông qua việc sử dụng Combiner và khả năng bảo toàn trạng thái giữa các đầu vào, ta có thể giảm một lƣợng lớn các cặp key-value dùng cho pha shuffle and sort giữa các Mapper và Reducer.

33 Hình 10 mô tả việc tạo đối tƣợng và bản toàn trạng thái trong Hadoop, một đối tƣợng Mapper và Reducer đƣợc tạo ra tƣơng ứng với một task, hàm Configure đƣợc chạy lúc khởi tạo đối tƣợng, hàm map/reduce chạy tƣơng ứng với mỗi cặp key-value, hàm close đƣợc chạy khi hủy đối tƣợng. Trạng thái (state) của đối tƣợng đƣợc bảo toàn qua các lần gọi hàm map/reduce.

Combiner và In-Mapper combining 3.1.1

Để minh họa các kỹ thuật khác nhau của hàm gộp cục bộ. Ta sử dụng ví dụ là chƣơng trình Wordcount:

Input: Tập các văn bản

Output: Các từ và số lƣợng của chúng trong tập các văn bản

Chương trình Wordcount cơ bản:

Hình 11. Tiến trình hoạt động của chương trình WordCount

Class MAPPER

Method MAP(docid a, doc d) For all term t in doc d do

EMIT(term t, count 1) Class REDUCER

Method REDUCE(term t, counts [C1, C2, …]) Sum ← 0

For all count c in counts [C1, C2, …] do Sum ← Sum + c

34 Mapper đƣa lên các key-value trung gian ứng với mỗi từ nó tìm thấy với key là từ đó và value là 1, Reducer tổng các giá trị trung gian để đƣa ra kết quả cuối cùng.

Word Count: Version 1 (Reducer vẫn giữ nguyên)

Class MAPPER

Method MAP(docid a, doc d)

H ← new ASSOCIATIVEARRAY For all term t in doc d do

H{t} ← H{t} + 1 >Đếm số lượng tổng cộng một tài liệu

For all term t in H do EMIT(term t, count H{t})

Thuật toán này cải thiện hơn so với chƣơng trình wordcount cơ bản, sử dụng một mảng kết hợp để đếm số lƣợng các từ trong một tài liệu sau đó mới đƣa lên các từ và số lƣợng của các từ đó trong mảng. Dễ thấy cách này sẽ làm giảm đi số lƣợng các key-value trung gian.

Word Count: Version 2

Class MAPPER Method INITIALIZE

H ← new ASSOCIATIVEARRAY >bảo toàn trạng thái giữa các cặp

key/value

Method MAP(docid a, doc d) For all term t in doc d do

H{t} ← H{t} + 1 >Đếm số lượng tổng cộng trên nhiều tài liệu

Method CLOSE

For all term t in H do EMIT(term t, H{t})

Cũng với ý tƣởng trên, thuật toán này dựa vào sự bảo toàn trạng thái của đối tƣợng Mapper để khởi tạo một mảng kết hợp bên ngoài hàm map, sau đó dùng mảng này để đếm số từ giữa nhiều tài liệu trong một map task. Đến khi tất cả hàm Map đã xử lý hết dữ liệu trung gian thì hàm CLOSE sẽ đƣợc gọi, lúc này ta gửi cặp key-value tƣơng tứng với các phần tử trong mảng kết hợp. Với kĩ thuật này, ta đang sử dụng chức năng của hàm Combiner trực tiếp ở trong Mapper. Ta không cần phải chạy các Combiner khác, vì tất cả khả năng gộp cục bộ đã đƣợc chỉ rõ. Mẫu thiết kế này trong MapReduce thƣờng đƣợc gọi là “In-Mapper Combining”. Có 2 lợi ích khi sử dụng mẫu thiết kế này:

35 Thứ nhất, nó điều khiển đƣợc khi nào việc gộp cục bộ xảy ra và chính xác xảy ra nhƣ thế nào. Ngƣợc lại, ý nghĩa của hàm Combiner không đƣợc chỉ rõ trong MapReduce. Ví dụ: Hadoop không bảo đảm hoặc Combiner đƣợc thực hiện bao nhiêu lần hoặc có thể không thực hiện lần nào. Combiner đƣợc xem là một tối ƣu hóa trong execution framework, có thể sử dụng hoặc không, có thể đƣợc gọi không hoặc nhiều lần. Trong nhiều trƣờng hợp, sự không chắc chắn này không chấp nhận đƣợc, chính vì thế nhiều lập trình viên tự viết hàm gộp trong Mapper.

Thứ hai, In-Mapper Combining sẽ hiệu quả hơn các Combiner thực sự. Combiner làm giảm số lƣợng các key-value trung gian trong pha shuffle and sort nhƣng không làm giảm số lƣợng các key-value tạo ra trong pha map, việc này làm tạo ra nhiều việc tạo và hủy đối tƣợng. Ngƣợc lại, trong In-Mapper Combining chỉ tạo các cặp key- value cần thiết cho pha shuffle and sort.

Tuy nhiên, trong mẫu In-Mapper Combining cũng có hạn chế. Nó làm mất đi ý tƣởng ban đầu của MapReduce vì có bảo toàn trạng thái giữa các cặp key-value. Bảo toàn trạng thái giữa các dữ liệu đầu vào, có nghĩa thuật toán có thể phụ thuộc vào thứ tự của các cặp key-value, dẫn đến có thể xảy ra các lỗi về thứ tự. Thứ hai, khi dữ liệu quá lớn thì có thể làm cho dữ liệu trung gian không thể chứa đủ trong bộ nhớ dẫn đến vấn đề về bộ nhớ. Giải pháp là giới hạn kích thƣớc của Block và thƣờng xuyên hủy các cấu trúc dữ liệu không dùng tới trong bộ nhớ.

Sự chính xác của thuật toán trong Local Aggregation 3.1.2

Mặc dù Combiner có thể làm giảm thời gian chạy của chƣơng trình nhƣng cũng cần cẩn thận khi sử dụng chúng. Vì Combiner trong Hadoop đƣợc xem là các tối ƣu phụ nên sự chính xác của thuật toán không thể phụ thuộc vào sự tính toán trên Combiner hoặc phụ thuộc vào nó. Trong các chƣơng trình MapReduce, kiểu dữ liệu đầu vào trong Reducer phải cùng kiểu dữ liệu đầu ra của Mapper, vì thế kiểu dữ liệu đầu vào và đầu ra của Combiner phải cùng kiểu với dữ liệu đầu ra của Mapper. Trong trƣờng hợp kiểu dữ liệu đầu vào và đầu ra của Reducer giống nhau thì Reducer có thể dùng nhƣ Combiner.

Ví dụ: Computing the Mean (Tính giá trị trung bình)

Input: Tập dữ liệu với input key kiểu string và input value kiểu integer. Output: Giá trị trung bình ứng với mỗi key.

Computing the Mean: Version 1

Class MAPPER

Method MAP(string t, integer r) EMIT(string t, integer r) Class REDUCER

36

Method REDUCE(string t, integers [r1, r2, …]) Sum ← 0

Cnt ← 0

For all integer r in integers [r1, r2, …]) do Sum ← Sum + r

Cnt ← Cnt + 1

ravg ← Sum/Cnt

EMIT(string t, integer ravg)

Thuật toán này không thể sử dụng combiner nhƣ reducer vì trung bình của các giá trị trung bình cục bộ không bằng trung bình của toàn bộ các giá trị.

Ví dụ: ((3+4)/2 + (8+9+10)/3)/2 = 6.25 (3 + 4 + 8 + 9 + 10)/5 = 6.8

Dễ thấy trong ví dụ trên, hai cách tính toán cho ra hai kết quả khác nhau.

Computing the Mean: Version 2

Class MAPPER

Method MAP(string t, integer r) EMIT(string t, integer r) Class COMBINER

Method COMBINE(string t, integers [r1, r2, …]) Sum ← 0

Cnt ← 0

For all integer r in integers [r1, r2, …]) do Sum ← Sum + r

Cnt ← Cnt + 1

EMIT(string t, pair(Sum,Cnt) >Sum và Count riêng phần

Class REDUCER

Method REDUCE(string t, pairs [(s1,c1), (s2,c2), …]) Sum ← 0

Cnt ← 0

For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s

Cnt ← Cnt + c

37

EMIT(string t, integer ravg)

Thuật toán này không chính xác vì sự khác nhau về kiểu dữ liệu của key-value giữa Combiner và Reducer (nếu Combiner không đƣợc gọi lần nào thì sẽ sai).

Computing the Mean: Version 3

Class MAPPER

Method MAP(string t, integer r) EMIT(string t, pair(r,1)) Class COMBINER

Method COMBINE(string t, pairs [(s1,c1), (s2,c2), …])) Sum ← 0

Cnt ← 0

For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s

Cnt ← Cnt + c

EMIT(string t, pair(Sum,Cnt) >Sum và Count riêng phần

Class REDUCER

Method REDUCE(string t, pairs [(s1,c1), (s2,c2), …]) Sum ← 0

Cnt ← 0

For all pair(s,c) in pairs [(s1,c1), (s2,c2), …] do Sum ← Sum + s

Cnt ← Cnt + c

ravg ← Sum/Cnt

EMIT(string t, integer ravg)

38

Computing the Mean: Version 4

Thuật toán sử dung In-Mapper combining

Class MAPPER

Method INITIALIZE

S ← new ASSOCIATIVEARRAY C ← new ASSOCIATIVEARRAY Method MAP(string t, integer r) S{t} ← S{t} + r

C{t} ← C{t} + 1 Method CLOSE

For all term t in S do

EMIT(term t, pair (S{t}, C{t}))

3.2 Secondary Sorting

MapReduce sắp xếp các cặp key-value theo keys trong pha Shuffle and Sort, sẽ rất thuận tiện nếu việc tính toán ở reducer dựa vào thứ tự sắp xếp. Tuy nhiên, làm cách nào để ngoài sắp xếp theo key, ta sắp theo theo value nữa? MapReduce của Google có tính năng secondary đƣợc xây dựng sẵn để đảm bảo các values đƣợc sắp xếp khi đến Reducer. Tuy nhiên, Hadoop chƣa có tính năng này. Có 2 cách để dùng secondary sort trong Hadoop: một là lƣu tạm trong bộ nhớ sau đó sắp xếp, tuy nhiên cách này sẽ bị giới hạn khi dữ liệu trong bộ nhớ quá lớn. Cách thứ hai là sử dụng mẫu thiết kế Value- to-key tạo nên các composite key (khóa kết hợp) (k,v1).

39

Một phần của tài liệu XỬ lý dữ LIỆU PHÂN tán với MAPREDUCE và xây DỰNG ỨNG DỤNG MINH họa (Trang 33 - 40)

Tải bản đầy đủ (PDF)

(87 trang)