1.3. Hệ thống file phân tán
1.3.4. Nhiệm vụ của Secondary NameNode
Hình 1.7. Kiến trúc HDFS đầy đủ
Secondary NameNode (SNN) là một tiến trình nền (daemon) để hỗ trợ cho việc
datanode daemon
Linux file system
…
slave node
datanode daemon
Linux file system
…
slave node
datanode daemon
Linux file system
…
slave node nam
enode
job submission node
namenode daemon jobtracker
tasktracker tasktracker tasktracker
theo dõi trạng thái của HDFS cluster. Cũng như NameNode, mỗi cluster cũng có một SNN và thường chạy trên một server riêng. Không có DataNode hoặc TaskTracker nào chạy trên server này. Điểm khác của SNN so với NameNode là nó không nhận và lưu lại sự thay đổi thời gian thực của HDFS. Thay vào đó, nó liên hệ trực tiếp với NameNode để lưu lại trạng thái của HDFS sau một khoảng thời gian do người dùng cấu hình.
Như đã nói ở trên, NameNode là một yếu điểm của Hadoop cluster và SNN giúp giảm thiểu thời gian lỗi và mất dữ liệu. Tuy nhiên, khi một NameNode gặp sự cố, thì cần có con người can thiệp và cấu hình lại cluster để SNN có thể trở thành NameNode.
CHƯƠNG 2
THUẬT TOÁN XỬ LÝ DỮ LIỆU VĂN BẢN VỚI MapReduce
2.1. Thiết kế thuật toán MapReduce cơ bản
Phần lớn sức mạnh của MapReduce đến từ sự đơn giản: để chuẩn bị cho dữ liệu đầu vào, lập trình viên chỉ cần cài đặt mapper và reducer, hoặc thêm partioner và combiner. Tất cả phần thực thi được xử lý trong suốt bởi Execution framework – trên các clusters từ một đến hàng nghìn node, trên các tập dữ liệu từ gigabytes đến petabytes.
Tuy nhiên, nó cũng có nghĩa là bất cứ thuật toán nào người lập trình muốn phát triển cũng phải được diễn tả theo một cách nghiêm ngặt theo các thành phần đã được định nghĩa sẵn. Điều đó có nghĩa không phải bất kỳ thuật toán nào cũng có thể chuyển sang mô hình lập trình này. Mục đích của chương này là cung cấp, chủ yếu qua các ví dụ để thiết kế thuật toán cho MapReduce.
Đồng bộ hóa có lẽ là phần khó nhất của việc thiết kế thuật toán cho MapReduce (và các thuật toán song song hoặc phân tán nói chung). Trong các bài toán xử lý song song, các tiến trình trong các node khác nhau trong một cụm tại một thời điểm nào đó phải dồn lại với nhau, ví dụ: phân tán các kết quả từng phần từ các nodes tạo ra chúng đến các nodes sẽ sử dụng chúng. Với một MapReduce Job, chỉ có một lần đồng bộ hóa trên toàn cluster – giai đoạn sort và shuffle, lúc mà các cặp key-value trung gian được copy từ mapper đến reducer và gộp theo key. Ngoài lúc đó, mapper và reducer chạy độc lập và không có cơ chế liên lạc trực tiếp giữa chúng. Hơn nữa, người lập trình có rất ít sự điều khiển trên nhiều khía cạnh của sự thực thi, ví dụ:
Chỉ định Node cho một Mapper hoặc Reducer cụ thể.
Chỉ định thời gian bắt đầu và kết thúc của Mapper hoặc Reducer. Chỉ định Mapper sẽ xử lý cặp key-value cụ thể.
Chỉ định Reducer sẽ xử lý các cặp key-value trung gian.
Tuy nhiên, lập trình viên cũng có một số kĩ thuật để điều khiển việc thực thi và quản lý dòng dữ liệu trong MapReduce. Bao gồm:
Khả năng xây dựng các cấu trúc dữ liệu phức tạp dùng làm keys và values để lưu trữ và giao tiếp các kết quả từng phần.
Khả năng thực thi các đoạn mã của người dùng lúc bắt đầu và kết thúc map và reduce task.
Khả năng bảo toàn trạng thái giữa các mapper và reducer qua nhiều khóa đầu vào hoặc trung gian.
Khả năng điều khiển thứ tự sắp xếp của các keys trung gian, do đó có thể biết được thứ tự các key mà reducer sẽ nhận.
Khả năng điều khiển phân mảnh không gian khóa, do đó có thể biết được thứ tự tập khóa mà một reducer nào đó sẽ nhận.
Một MapReduce Job không thể biểu diễn tất cả các thuật toán. Người lập trình thường phải phân tích thuật toán phức tạp thành một chuỗi các jobs, yêu cầu chuỗi các dữ liệu liên tục, vì thế đầu ra của một job trở thành đầu vào của job kế tiếp. Nhiều thuật toán thường có bản chất lặp đi lặp lại, đòi hỏi sự thực thi lặp đi lặp lại để đạt được một ngưỡng hội tụ cần thiết.
Chương này sẽ giải thích các kĩ thuật khác nhau để điều khiển sự thực thi lệnh và dòng dữ liệu có thể được áp dụng để thiết kế thuật toán trong MapReduce.