MapReduce [22, 30, 68] là một mô hình lập trình cho phép xử lý khối dữ liệu lớn bằng cách chia công việc thành các nhiệm vụ độc lập, thực hiện các tác vụ song song thông qua các cụm máy tính (cluster) và tự động thu thập kết quả trên nhiều cụm để trả về một kết quả. Lợi thế lớn nhất của một
chương trình được thực hiện bằng MapReduce là nó chạy trên bất kỳ nút (node) nào trong trung tâm xử lý (một, hàng trăm hay hàng nghìn nút) mà không quan tâm đến mã lệnh của chương trình. Lập trình MapReduce là việc tạo ra hai hàm map() và reduce(), mỗi hàm được thực hiện song song trên các nút tính toán.
❼ Giai đoạn đầu của MapReduce là giai đoạn map: MapReduce sẽ tự động phân chia dữ liệu đầu vào cho các nút tính toán trong trung tâm dữ liệu. Mỗi nút tính toán đều chạy một hàm map() với mục đích là chia nhỏ dữ liệu. Trong giai đoạn map, hàm map() xử lý đầu vào là các cặp khóa-giá trị (key-value), tạo ra các cặp khóa-giá trị trung gian và được chuyển thành đầu vào cho giai đoạn Reduce.
❼ Giai đoạn thứ hai là giai đoạn Reduce: Giai đoạn này tổng hợp và xử lý các dữ liệu trung gian từ giai đoạn map. Reduce cũng được thực hiện trên các nút tính toán, mỗi nút đều nhận một khoá, tuỳ thuộc vào giá trị ở giai đoạn map mà chia sẻ các khoá này cho các nút xử lý, sau đó tổng hợp lại thành một giá trị cho mỗi khoá.
Quá trình thực hiện tiến trình của MapReduce được mô tả như sau: ❼ Giai đoạn Map: <k1, v1> → <k2, v2>
❼ Giai đoạn Reduce: <k2, v2> → <k3, v3>
Trong đó <ki, vi>, 1≤ i ≤ 3là các cặp khoá-giá trị do người dùng xác định trước khi thực hiện MapReduce. Một tập dữ liệu được truyền đến hàm map() dưới dạng các cặp <k1, v1>. Hàm map() xử lý các cặp <k1, v1> và xuất kết quả trung gian ở dạng cặp <k2, v2>. Kết quả trung gian <k2, v2> được tính toán lại trong hàm reduce(), đưa ra kết quả cuối cùng ở dạng <k3, v3>.
Mô hình lập trình MapReduce có thể dùng để xử lý dữ liệu lớn trên các nền tảng khác nhau, trong đó nó là một trong những thành phần chính của Apache Hadoop, ngoài ra nó có thể tương thích trên nền tảng Apache Spark.
Map Bắt đầu Bộ nhớ đệm Phân mảnh Trộn trên đĩa Các hàm map khác Reduce Trộn Trộn Kết thúc
Hình 1.5: Tiến trình xử lý của MapReduce [87]
❼ Apache Hadoop là một dự án phần mềm mã nguồn mở cho phép xử lý phân tán các tập dữ liệu lớn trên các cụm máy tính bằng các mô hình lập trình đơn giản. Hadoop cung cấp một dịch vụ có khả năng tính toán lớn trên các cụm máy tính với mỗi máy tính có khả năng chịu lỗi cao. Nó được thiết kế để có thể mở rộng quy mô từ vài máy đến hàng ngàn máy chủ, mỗi máy cung cấp khả năng tính toán và lưu trữ cục bộ. Thay vì dựa vào phần cứng để thực hiện các công việc xử lý thì các thư viện được thiết kế để có khả năng tính toán, phát hiện và xử lý các lỗi ở lớp ứng dụng. Hadoop thực hiện xử lý dữ liệu từ hệ thống tệp tin HDFS (Hadoop Distributed File System). HDFS gồm hai thành phần chính là "namenode" và "datanodes" với mục đích là quản lý các công việc đọc/ghi dữ liệu.
❼ Apache Spark cũng là một hệ thống xử lý dữ liệu lớn và tính toán nhanh. Nó cung cấp các API cấp cao trong các ngôn ngữ lập trình và công cụ được tối ưu hỗ trợ các mô hình thực thi chung. Nó cũng hỗ trợ một bộ công cụ cấp cao bao gồm Spark SQL cho SQL và xử lý dữ liệu có cấu trúc, MLlib để học máy, GraphX để xử lý đồ thị và Spark Streaming. Sự khác biệt chính giữa Hadoop và Spark là ở cách tiếp cận xử lý và lưu trữ: Spark thực hiện xử lý dữ liệu trên bộ nhớ RAM, trong khi Hadoop phải đọc và ghi vào ổ cứng. Do đó, tốc độ xử lý của Spark có thể nhanh hơn tới 100 lần so với Hadoop. Tuy nhiên, Hadoop có thể thực hiện xử lý tính toán
với các tập dữ liệu lớn hơn nhiều so với Spark. Trong trường hợp dữ liệu kết quả trả về lớn hơn dung lượng RAM, Hadoop có thể vượt trội hơn Spark. Mặt khác, do cần nhiều bộ nhớ RAM để xử lý, nên Spark tốn nhiều chi phí đầu tư hơn so với Hadoop. Bên cạnh đó, vì Hadoop xử lý các bộ dữ liệu lớn được phân bố giữa các nút tạo thành một cụm các máy chủ nên người dùng không phải mua và bảo trì các thiết bị chuyên dụng đắt tiền. Hadoop lập chỉ mục và theo dõi trạng thái dữ liệu, giúp xử lý và phân tích hiệu quả hơn. Spark là một công cụ xử lý dữ liệu mà cho phép thực hiện các hoạt động khác nhau trên các bộ dữ liệu phân tán, nhưng không cung cấp cơ chế lưu trữ phân tán của chúng. Tuỳ thuộc vào mục đích sử dụng cụ thể mà người dùng có sự lựa chọn đúng đắn. Spark thích hợp với các chương trình tính toán xử lý dữ liệu theo thời gian thực, còn Hadoop phù hợp với các dữ liệu lớn về mặt dung lượng. Hadoop xử lý tuyến tính các bộ dữ liệu khổng lồ, trong khi Spark mang lại hiệu suất nhanh, xử lý lặp, xử lý đồ thị, học máy... Đối với trường hợp thực hiện đổi khoá cho toàn bộ CSDL thì chương trình sẽ thực thi trên các bảng của CSDL. Do dung lượng các bảng của CSDL lớn và không cần xử lý theo thời gian thực nên DO chỉ cần dùng nền tảng Hadoop để giảm chi phí đầu tư hoặc thuê các hệ thống máy chủ.