Quản lý siêu dữ liệu trong HDFS (FSImage, Edits, CheckPoint)

Mục lục
  • 1 - Siêu dữ liệu của NameNode
    • 1.1 FSImage - Bản sao lưu siêu dữ liệu
    • 1.2 Kiểm tra tệp FSImage
    • 1.3 Edits - Nhật ký hoạt động
    • 1.4 Xem nội dung tệp Edits
  • 2 - Quy trình khởi động NameNode
  • 3 - Quá trình CheckPoint
    • 3.1 Lý do thực hiện CheckPoint
    • 3.2 Quy trình CheckPoint
  • 4 - SecondaryNameNode hỗ trợ quản lý FSImage và Edits
    • 4.1 Cấu hình liên quan đến quản lý siêu dữ liệu
    • 4.2 Luồng hoạt động quản lý siêu dữ liệu
  • Tài liệu tham khảo
  • Bản quyền

1 - Siêu dữ liệu của NameNode

Các hoạt động và trạng thái toàn bộ cụm được lưu trữ trong siêu dữ liệu, mà được lưu dưới dạng các tệp FSImage và Edits.

Giải thích: Nếu siêu dữ liệu được lưu trữ trên đĩa của NameNode, việc truy cập ngẫu nhiên thường xuyên sẽ làm giảm hiệu suất và ảnh hưởng đến khả năng phục vụ yêu cầu từ client. Vì vậy, siêu dữ liệu được giữ trong bộ nhớ. Tuy nhiên, nếu chỉ lưu trong RAM, khi máy bị mất điện, dữ liệu sẽ bị mất hoàn toàn khiến cụm không thể hoạt động. Để giải quyết điều này, một bản sao lưu FSImage được lưu trên đĩa.

Khi siêu dữ liệu trong bộ nhớ được cập nhật, nếu đồng thời cập nhật FSImage, hiệu suất sẽ kém. Nếu không cập nhật FSImage, thì có thể xảy ra tình trạng mất dữ liệu sau khi NameNode tắt nguồn. Do đó, ta sử dụng tệp Edits với cơ chế chỉ thêm vào cuối (append-only), giúp tối ưu hiệu suất. Mỗi khi có thay đổi trên siêu dữ liệu, nó sẽ được ghi vào bộ nhớ và thêm vào tệp Edits. Khi NameNode khởi động lại, hệ thống sẽ phục hồi siêu dữ liệu từ FSImage và Edits.

Các tệp này phục vụ mục đích: Khôi phục trạng thái cụm khi khởi động lại.

Khi chạy lệnh định dạng đầu tiên (hdfs namenode -format), sẽ tạo ra các tệp fsimage và edits.

Khi khởi động lần thứ hai, NameNode sẽ khôi phục dữ liệu bằng cách:

  1. Nạp fsimage vào bộ nhớ để tạo bản sao hệ thống tập tin
  2. Áp dụng tất cả các giao dịch từ edits (sau txid của fsimage) lên bản sao này

Vị trí lưu trữ các tệp này được cấu hình trong tệp hdfs-site.xml:

<property>
    <name>dfs.namenode.name.dir</name>    
    <value>file:/Users/healchow/data/hadoop/namenode</value>
</property>
<property>
     <name>dfs.namenode.edits.dir</name>
     <value>file:/Users/healchow/data/hadoop/namenode/edits</value>
</property>

1.1 FSImage - Bản sao lưu siêu dữ liệu

  1. FSImage là bản sao của siêu dữ liệu NameNode, thường được gọi là điểm kiểm tra (checkpoint image).
  2. FSImage chứa toàn bộ siêu dữ liệu từ lần kiểm tra trước đến thời điểm hiện tại.
  3. FSImage lưu trữ thông tin về tất cả các file và thư mục trong DataNodes:
    • Đối với file: block, vị trí block trên DataNode, thời gian sửa đổi, thời gian truy cập...
    • Đối với thư mục: thời gian sửa đổi, quyền truy cập (quyền người dùng, nhóm sở hữu)...
  4. Theo mặc định, hệ thống lưu 2 bản FSImage, điều chỉnh qua thuộc tính dfs.namenode.num.checkpoints.retained.
  5. FSImage trong bộ nhớ phục vụ cho việc đọc từ client, còn Edits chỉ đóng vai trò phục hồi dữ liệu.

1.2 Kiểm tra tệp FSImage

Tên tệp FSImage có dạng fsimage_${end_txid}, trong đó ${end_txid} là ID giao dịch cuối cùng trong tệp.

Để xem nội dung tệp:

# Chạy lệnh sau để xem hướng dẫn:
hdfs oiv

# Ví dụ:
cd ~/bigdata/data/hadoop/namenode
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml

1.3 Edits - Nhật ký hoạt động

  1. Mọi thao tác ghi của client lên HDFS đều được ghi vào tệp Edits – chứa các thay đổi thực tế kể từ lần kiểm tra cuối cùng.
  2. Khi ghi thành công, Edits sẽ được cập nhật và bộ nhớ cũng được đồng bộ.
  3. Edits tăng dần kích thước, gây chậm khi khởi động lại. Hệ thống sẽ hợp nhất Edits với FSImage khi đạt ngưỡng nhất định.
  4. Mỗi hoạt động trong Edits được gọi là một giao dịch, có ID giao dịch nguyên thủy.

1.4 Xem nội dung tệp Edits

Edits được chia thành nhiều đoạn gọi là Segment:

  • Segment đang viết có tên edits_inprogress_${start_txid}
  • Segment đã hoàn thành có tên edits_${start_txid}-${end_txid}

Xem nội dung:

# Hiển thị hướng dẫn:
hdfs oev

# Ví dụ:
cd ~/data/hadoop/namenode
hdfs oev -i edits_0000000000000000865-0000000000000000866 -p XML -o myedit.xml

2 - Quy trình khởi động NameNode

  1. Loading FSImage: Đọc bản sao FSImage mới nhất từ tệp.
  2. Loading Edits: Áp dụng tất cả các giao dịch từ Edits sau txid của FSImage.
  3. CheckPoint: Ghi trạng thái hiện tại vào điểm kiểm tra mới (fsimage.ckpt_txid).
  4. Safe mode: Chờ các DataNode báo cáo trạng thái block, sau đó thoát khỏi chế độ an toàn.

3 - Quá trình CheckPoint

3.1 Lý do thực hiện CheckPoint

Mỗi thao tác ghi đều được lưu vào Edits. Trong môi trường lớn, số lượng thao tác cao sẽ khiến Edits trở nên rất lớn, có thể chiếm hết dung lượng đĩa. Ngoài ra, khởi động NameNode đòi hỏi phải áp dụng lại toàn bộ Edits, gây chậm.

Do đó, CheckPoint giúp hợp nhất siêu dữ liệu định kỳ.

3.2 Quy trình CheckPoint

Quá trình này hợp nhất FSImage và Edits để tạo ra một FSImage mới.

Khi khởi động, NameNode sẽ không cần áp dụng toàn bộ Edits mà chỉ cần nạp FSImage mới và áp dụng Edits chưa hợp nhất.

Lưu ý: Việc tạo FSImage mới tốn nhiều tài nguyên I/O và bộ nhớ. Để giảm thiểu ảnh hưởng, quá trình này nên được thực hiện trên máy khác như SecondaryNameNode hoặc StandbyNameNode.

4 - SecondaryNameNode hỗ trợ quản lý FSImage và Edits

Giải thích: Nếu Edits luôn được mở rộng, nó sẽ rất lớn và mất thời gian phục hồi khi bị lỗi. Việc xử lý trực tiếp trên NameNode làm giảm hiệu suất. Vì vậy, SecondaryNameNode được đưa vào để thực hiện hợp nhất FSImage và Edits.

4.1 Cấu hình liên quan đến quản lý siêu dữ liệu

SecondaryNameNode được chỉ định trong tệp conf/masters.

Cấu hình trong hdfs-site.xml:

<property>
  <name>dfs.http.address</name>
  <value>host:50070</value>
</property>

Các điều kiện kích hoạt CheckPoint:

<!-- Thời gian giữa hai lần CheckPoint (giây) -->
<property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600s</value>
</property>

<!-- Số lượng giao dịch tích lũy trước khi CheckPoint -->
<property>
    <name>dfs.namenode.checkpoint.txns</name>
    <value>1000000</value>
</property>

<!-- Thời gian kiểm tra số giao dịch chưa được lưu (giây) -->
<property>
    <name>dfs.namenode.checkpoint.check.period</name>
    <value>60s</value>
</property>

<!-- Kích thước tối đa của tệp Edits (byte) -->
<property>
    <name>fs.checkpoint.size</name>
    <value>67108864</value>
</property>

4.2 Luồng hoạt động quản lý siêu dữ liệu

Khi bất kỳ điều kiện nào thỏa mãn, SecondaryNameNode sẽ thực hiện hợp nhất:

  1. Thông báo cho NameNode tạm dừng Edits và chuyển ghi vào tệp edits.new.
  2. SecondaryNameNode tải FSImage và Edits từ NameNode thông qua HTTP GET.
  3. Hợp nhất FSImage và Edits, tạo FSImage mới có tên fsimage.ckpt.
  4. Gửi FSImage mới về NameNode qua HTTP POST.
  5. NameNode thay thế fsimage cũ bằng fsimage.ckpt, xóa Edits cũ và đổi tên edits.new thành edits, cập nhật fstime.

Qua đó, tránh tình trạng Edits tăng vô hạn và rút ngắn thời gian khởi động.

Thẻ: hdfs NameNode FSImage Edits checkpoint

Đăng vào ngày 19 tháng 7 lúc 08:57