I. Giới Thiệu MapReduce Hadoop
Đặc điểm quan trọng của các hệ thống phân tán là khối lượng lớn dữ liệu mà chúng dự kiến sẽ xử lý. Có rất nhiều loại dữ liệu được tạo ra liên tục mỗi ngày (Video, hình ảnh, âm thanh, ..) và được đăng tải lên mạng xã hội. Amazon và eBay thường xuyên xử lý lượng lớn dữ liệu khổng lồ ở khắp nơi trên thế giới. Các công cụ tìm kiếm Google, Yahoo và Bing thường xuyên thu thập dữ liệu lớn để xử lý các truy vấn của người dùng từ khắp nơi trên thế giới. Do đó các công cụ xử lý dữ liệu song song khổng lồ đã hình thành và trở nên không thể thiếu đối với các phản hồi nhanh chóng. Để thu thập khối lượng lớn dữ liệu, vào khoản 2004-2007 Google đã phát minh ra MapReduce, sau đó Yahoo đã đưa nó vào dự án mã nguồn mở Hadoop, về cơ bản Hadoop có thể hiểu là một hệ điều hành cho phép các chương trình MapReduce chạy trên các cụm máy tính.
II.
Cách thức hoạt động
1.
MapReduce
Các thuật toán MapReduce khai thác hiệu quả tính song song được tích hợp sẵn trong nhiều bài toán dữ liệu lớn hoặc quy mô lớn. Người ta bắt đầu với 2 hoạt động cơ bản dùng hàm
Map
và hàm
Reduce
. Hàm Map được áp dụng một chức năng cụ thể cho tất cả trong List và thực thi chúng một cách song song. Mỗi Process or Thread được giao một nhiệm vụ như vậy. Hàm Reduce làm nhiệm vụ tổng hợp kết quả Output từ hàm Map và tổng hợp lại thành kết quả cuối cùng (Aggregate).
2.
Hadoop
Hadoop là một open-source cung cấp infrastructure mà MapReduce cần, Hadoop sử dụng kiến trúc Master-Slave. Một nút chính (Master node hoặc NameNode) nhận một công việc từ người dùng, dữ liệu đầu vào được chia thành nhiều mẫu và được lưu trữ trong hệ thống phấn tán Hadoop (Hadoop distribution file system (HDFS)). Về mặt vật lý, dữ liệu được nằm rải rác trên lượng lớn các nút trong hệ thống. Master node chỉ định các thành phần công việc cho các nút phụ (Slave node hoặc DataNodes). Mỗi Slave giúp lưu trữ tại chỗ và có khả năng tính toán để giải quyết problem. Khi các nút Slave hoàn thành công việc, nó trả kết quả về cho Master. Master sẽ chạy reduce để tổng hợp các mẫu và đưa ra kết quả. Thậm chí nếu cần thì Slave có thể chia thêm mẫu cho các Slave khác.
III.
Các loại MapReduce
Hàm
map
và
reduce
có dạng chung như sau:
map: (K1, V1) → list(K2, V2)
reduce: (K2, list(V2)) → list(K3, V3)
Nhìn chung, hàm map input (key và value types) và map output (key và value types) là khác type nhau. Tuy nhiên hàm reduce input và map output phải giống type nhau, mặc dù reduce out có thể khác type.
Nếu có hàm
combiner
được sử dụng thì type giống như hàm reduce
map: (K1, V1) → list(K2, V2)
combiner: (K2, list(V2)) → list(K2, V2)
reduce: (K2, list(V2)) → list(K3, V3)
Hàm
partition
hoạt động giữa key và value types và trả về index phân vùng dữ liệu.
partition: (K2, V2) → integer
IV.
Các tính năng của MapReduce
1.
Counter
Thường có những điều bạn muốn biết về dữ liệu bạn đang phân tích bằng thiết bị ngoại vi đang thực thi. Ví dụ: nếu bạn đang đếm các bản ghi không hợp lệ và phát hiện ra rằng tỷ lệ các bản ghi không hợp lệ trong toàn bộ tập dữ liệu rất cao, bạn có thể được nhắc kiểm tra lý do tại sao rất nhiều bản ghi được đánh dấu là không hợp lệ - có lẽ có lỗi trong phần chương trình phát hiện các bản ghi không hợp lệ?
Hoặc nếu dữ liệu có chất lượng kém và thực sự có rất nhiều bản ghi không hợp lệ, sau khi phát hiện ra điều này, bạn có thể quyết định tăng kích thước của tập dữ liệu để số lượng bản ghi tốt đủ lớn để phân tích có ý nghĩa.
Bộ đếm là một kênh hữu ích để thu thập số liệu thống kê về công việc: để kiểm soát chất lượng hoặc cho thống kê cấp ứng dụng
2.
Sorting
Khả năng sắp xếp dữ liệu là trọng tâm của MapReduce. Ngay cả khi ứng dụng của bạn không quan tâm đến việc sắp xếp, nó có thể sử dụng giai đoạn sắp xếp mà MapReduce cung cấp để sắp xếp dữ liệu của nó. Sắp xếp dữ liệu Avro được đề cập riêng, trong Sắp xếp bằng cách sử dụng Avro MapReduce.
- Partial sort
- Total sort
3.
Joins
MapReduce cho phép joins lượng lớn dữ liệu giữa các datasets, nhưng việc viết code từ đầu sẽ khá phức tạp. Do đó chúng ta có thể sử dụng các framework như là Pig, Hive, Cascading, Cruc, or Spark
- Map-Side-Join
- Reduce-Side-join
4.
Side data distribution
Side data cho phép định nghĩa read-only nhằm mục đích cho việc xử lý tập dữ liệu chính, giúp cung cấp tất cả dữ liệu cho Map hoặc Reduce một cách hiệu quả và thuận tiện nhất.
IV.
Ví dụ
Khai triển Partial sorting trên Hadoop dùng code JAVA