Chào các bạn,
Như ở bài viết trước, mình đã trình bày với các bạn những điều cơ bản nhất về HDFS, và giờ với bài viết này mình sẽ trình bày với các bạn về Kiến trúc của HDFS.
Mục lục
I. Cơ chế Master – Slave
Như mình đã trình bày nhiều lần, HDFS sẽ chia nhỏ file của bạn thành các phần và lưu trữ chúng tại các máy trong cụm, và việc lưu trữ file sẽ tuân theo cơ chế Master – Slave.
Master – Slave ám chỉ mô hình có 1 ông chủ (master) cầm đầu một đám nô lệ (slave). Ông chủ sẽ không tham gia trực tiếp vào công việc, mà chỉ nắm giữ các đầu mục việc và thông tin của các nô lệ. Công việc chính của ông chủ là quản lý, giám sát để đám nô lệ để chúng làm việc đúng cách và đem lại hiệu quả.
Thật không ngờ máy tính cũng giai cấp
Cụ thể cơ chế master – slave được thể hiện trong HDFS bằng việc trong một cụm máy, sẽ chỉ bao gồm một máy duy nhất được gọi là là Namenode (Master) và các máy còn lại gọi là Datanode (Slave). Trong đó:
- Datanode sẽ là nơi lưu trữ các file dữ liệu mà bạn đưa vào.
- Namenode là nơi lưu địa chỉ của file đó được chia và lưu trên các datanode nào.

Ví dụ mình có một file 1TB, khi đưa vào HDFS để lưu trữ thì nó được chia thành 3 mảnh:
- 3 mảnh này sẽ chỉ được lưu ở datanode, namenode không lưu dữ liệu này.
- Namenode sẽ lưu địa chỉ có 3 mảnh được lưu trữ, ví dụ như mảnh 1 được lưu trữ ở datanode 1, mảnh 2 được lưu trữ ở datanode 2,…
Có một lưu ý rằng, chúng ta có thể cấu hình để một máy vừa là namenode lại vừa là datanode, nhưng trong thực tế thì không ai làm như vậy cả.
Không chỉ lưu lại địa chỉ lưu trữ file ở các datanode, namenode còn có nhiều vai trò hơn thế, chi tiết mình sẽ trình bày ở phần dưới đây.
II. Vai trò của Namenode, Datanode và Secondary namenode
2.1 Namenode
Qua cơ chế master – slave, vai trò của namenode cũng đã được thể hiện phần nào. Nhưng mình sẽ trình bày chi tiết hơn về vai trò của namenode trong phần này. Cụ thể:
- Namenode là đầu mối truy cập và thực hiện các thao tác với file từ phía client.
- Namenode có nhiệm vụ duy trì và quản lý các datanode.
- Namenode là nơi lưu trữ và cập nhật các metadata, ví dụ như địa chỉ của các block trên datanode, quyền truy cập của client,.. Có 2 loại file metadata:
- FsImage: Là nơi lưu trữ trạng thái của các file system namespace (từ này hơi khó để dịch) kể từ khi namenode được khởi động.
- EditLogs: Là nơi lưu lại quá sửa đổi của các file system.
- Nó luôn lắng nghe và theo dõi các datanode để đảm bảo là chúng vẫn “còn sống”.
- Namenode còn là nơi điều khiển sự cân bằng về dung lượng lưu trữ của các datanode, quản lý lượng truy cập tới các datanode.
Bạn thấy vai trò của namenode có quan trọng không? Mặt khác trong một Hadoop cluster thì tại một thời điểm sẽ chỉ có một namenode hoạt động, vì vậy namenode đòi hỏi tính sẵn sàng cực cao, nếu namenode chết là cả cluster sẽ chết – và đây là một điểm yếu chí mạng của Hadoop cluster. Tuy nhiên, chúng ta sẽ có cách để khắc phục điểm yếu này và mình sẽ trình bày tới bạn trong các bài viết tiếp theo.
2.2 Datanode
Datanode chính là các máy slave trong kiến trúc của HDFS, nó có các vai trò và chức năng sau:
- Là nơi lưu trữ dữ liệu, khi dữ liệu được đưa vào HDFS.
- Là nơi chạy các tiến trình xử lý dữ liệu (các job).
- Gửi dữ liệu định kỳ về tình trạng “sức khỏe” tới datanode, mặc định là cứ 3s nó sẽ gửi một lần.
Không giống như namenode, datanode không yêu cầu tính sẵn sàng cao, bởi trong một hadoop cluster thì thường có nhiều datanode. Vì vậy mà các máy datanode chỉ cần chạy trên các phần cứng thông thường, và dễ dàng bổ sung thêm datanode với chi phí rẻ.
2.3 Secondary namenode
Secondary namenode giống như một node phụ chạy cùng máy với namenode. Có thể coi secondary namenode như một “trợ lý” của namenode vậy. Có nhiều hiểu lầm rằng secondary namenode là một node “dự phòng” của namenode, nhưng không phải vậy, secondary node vai trò và nhiệm vụ rõ ràng:
- Nó thường xuyên đọc các file, các metadata được lưu trên RAM của datanode và ghi vào ổ cứng.
- Nó liên đọc nội dung trong Editlogs và cập nhật vào FsImage, để chuẩn bị cho lần khởi động tiếp theo của namenode.
- Nó liên tục kiểm tra tính chính xác của các tệp tin lưu trên các datanode.
III. Block là gì?
Dữ liệu được đưa vào trong HDFS sẽ được chia nhỏ thành nhiều mảnh và nằm rải rác khắp nơi trong các datanode, mỗi mảnh dữ liệu như vậy được gọi là một block. Việc dữ liệu được chia làm bao nhiêu block và mỗi block nằm ở datanode nào sẽ được lưu ở metadata namenode.
Trong HDFS, mỗi block có dung lượng tối đa là 128M (có thể cấu hình được để điều chỉnh lại). Nghĩa là nếu bạn có một file example.txt nặng 514M, thì khi đưa vào trong HDFS, nó sẽ được chia làm 5 block, với 4 block đầu tiên mỗi block nặng 128M và block cuối cùng nặng 2M.

Có một câu hỏi đặt ra là Tại sao Block trong HDFS có dung lượng cao tới vậy – 128M, trong khi block file system của Linux chỉ là 4KB?
Câu trả lời là: Big data là những tập dữ liệu rất lớn, đơn vị thuộc tầm Terabytes hay Petabytes. Vậy nếu kích thước của block mà nhỏ tầm 4KB thì một file dữ liệu đưa vào HDFS sẽ bị chia thành rất nhiều các block, điều này cũng là cho các file metadata ở namenode phình to hơn. Và đương nhiên điều này khiến việc quản lý metada khó khăn hơn, điều mà không ai muốn.
IV. Cơ chế quản lý các bản sao
Một trong những đặc trưng của HDFS là có độ tin cậy cao và khả năng phục hồi sau lỗi tốt. Vậy HDFS đã làm thế nào để có được đăng trưng này? Giờ mình sẽ chỉ cho các bạn nhé.
Dữ liệu sau khi được chia thành các block, ngoài việc được lưu rải rác trên khắp các datanode, các block còn được nhân bản thành nhiều phiên bản khác nhau và lưu tại các datanode khác nhau. Bạn có thể xem hình ảnh dưới đây để hiểu rõ hơn.

Để mình giải thích hình ảnh trên cho bạn nghe nhé. Chúng ta có 4 datanode và 5 block, trong đó:
- Block 1 được lưu tại node 1, node 2, node 4.
- Block 2 được lưu tại node 2, node 3, node 4
- Block 3 được lưu tại node 1, node 3, node 4
- Block 4 được lưu tại node 1, node 2, node 3
- Block 5 được lưu tại node 1, node 2, node 4
Giả sử node 1 gặp sự cố, thì các dữ liệu mà node đang lưu (block 1, 3, 4, 5) vẫn có lấy được từ các node khác. Điều này tương tự các node khác.
Bằng cơ chế “Quản lý các bản sao” mà HDFS có cách sắp xếp và nhân bản các block để hạn chế tối đa việc mất mát dữ liệu khi có datanode gặp sự cố.
Mặc định HDFS sẽ tạo ra 3 bản sao cho mỗi block, nhưng bạn cũng có thể cấu hình lại thông tin này. Việc nhân bản ra càng nhiều sẽ càng làm giảm rủi ro mất mát dữ liệu, nhưng đừng quên rằng nó cũng sẽ chiếm nhiều bộ nhớ hơn.
V. Tổng kết
Lại là một bài viết tràn ngập lý thuyết mà đọc xong có vẻ … chẳng hiểu gì và cũng chẳng giúp ích gì nhiều. Thật ra mình cũng từng vậy đấy, nhưng cứ đọc, đọng lại được trong đầu tý nào thì đọng, cái quan trọng nhất là mình cứ “biết nó là thế đã” còn nó quan trọng hay không thì sau này mới biết được. Nhưng mình tiết lộ luôn nhé, mình cảm thấy những kiến thức lý thuyết này rất bổ ích cho việc thực hành sau này đấy. Mấy nữa học tới đoạn thực hành với code, thử xem bạn có cảm giác giống mình không nhé.
Tóm tắt lại thì bài này có một số điều cần chú ý như sau:
- Hadoop cluster hoạt động theo cơ chế master – slave.
- Một Hadoop cluster bao gồm 1 namenode và n datanode. Vì vậy namenode cần tính sẵn sàng cao, còn datanode thì không cần đề cao tính sẵn sàng.
- Namenode không phải là nơi trực tiếp lưu dữ liệu, mà chỉ là nơi lưu các metadata. Dữ liệu thực tế được chia thành các block và lưu tại các datanode.
- Các block sẽ được nhân bản và lưu trữ tại nhiều datanode khác nhau.
Chào tạm biệt, hẹn gặp lại ở bài viết kế tiếp.
- Giới thiệu series tìm hiểu Big data cơ bản
- Big data là gì
- Giới thiệu về Apache Hadoop
- Tìm hiểu về hệ thống phân tán
- Hướng dẫn cài đặt Hadoop cluster trên Ubuntu18.04
- Tìm hiểu về HDFS
- Kiến trúc HDFS
- Một số command line tương tác với HDFS
- Tương tác với HDFS thông qua restful api với WebHDFS
- … Còn nữa… mình đang viết