Hadoop distributed file system (HDFS)

Tiền đề và mục tiêu

Một ứng dụng HDFS có thể có hàng nghìn máy chia nhau lưu dữ liệu, trong khi lỗi phần cứng là thường gặp, nên đòi hỏi HDFS phải phát hiện và khắc phục lỗi nhanh và tự động.

Ứng dụng chạy trên DHFS không giống các ứng dụng khác ở chỗ cần streaming access. HDFS chú trọng lượng truy xuất cao (high throughput), xử lí dữ liệu theo nhóm và không hoàn toàn tuân thủ POSIX.

HDFS hỗ trợ tập tin lớn, có thể từ GB đến TB. 1 HDFS có thể xử lí hàng chục triệu tập tin.

Files của ứng dụng trên HDFS tuân thủ write-once-read-many, để đảm bào tính nhất quán (coherency) và lượng truy xuất cao.

Vì lượng dữ liệu rất lớn nên phần tính toán sẽ được di chuyển về gần nơi dữ liệu được lưu để giảm lưu lượng đường truyền.

HDFS được thiết kế để có thể di chuyển từ nền này (platform) này sang nền khác .

Kết cấu

HDFS có kết cấu master/slave. Một nhóm HDFS (HDFS cluster) gồm 1 NameNode để quản lí file system namespace và điều tiết clients truy xuất files, cùng nhiều DataNode lưu dữ liệu. 1 file được chia ra thành các blocks lưu trên nhiều node. NameNode xử lí những việc như mở, đóng, đổi tên file và thư mục, biết được block nào trên DataNode nào để chỉ cho clients đọc và lấy dữ liệu đúng chỗ (cũng có nghĩa là truy xuất dữ liệu thực sự không hề thông qua NameNode). DataNodes cũng phụ trách việc tạo, xoá và sao blocks theo lệnh của NameNode.

NameNode và DataNode được chạy trên các máy GNU/Linux thông thường. HDFS được viết bằng Java nên chạy được trên nhiều loại máy. Thông thường mỗi máy trong nhóm (cluster) chạy 1 DataNode.

NameNode dùng Editlog lưu những thay đổi của metadata và lưu toàn bộ file system namespace vào file FsImage (các metadata là dạng compact, chiếm ít dung lượng, nên NameNode cần 4GB là lưu thoải mái). Khi khởi động, NameNode đọc ra FsImage và Editlog, dựa vào Editlog để sửa FsImage trong bộ nhớ, sau đó lưu FsImage mới lại và xóa Editlog cũ. Quá trình này gọi là checkpoint. HDFS còn có SecondaryNamenode làm nhiệm vụ copy định kì FsImage và Editlog từ NameNode, kết hợp  tạo thành FsImage mới trả về cho NameNode, NameNode sẽ update lại FsImage và xóa Editlog cũ đi.

Các cơ chế bảo đảm độ tin cậy

Sao dữ liệu

Như đã nói, file được lưu trữ thành các block (có cùng độ lớn, trừ block cuối) trên các máy khác nhau. Việc sao lưu là để đảm bảo tính chịu lỗi. Độ lớn block (mặc định 64MB) và số bản sao (mặc định 3) đều có thể thiết lập được. Nhớ rằng File trong HDFS là write-once.

Các DataNode sẽ gởi nhịp tim (Heartbeat) và báo cáo Block (Blockreport) về cho NameNode theo định kì. Nhận được nhịp tim, NameNode sẽ biết được DataNode hoạt động bình thường, còn báo cáo Block, bao gồm danh sách tất cả các block tên DataNode đó, sẽ giúp cho NameNode ra quyết định (truy xuất dữ liệu hoặc sao thêm nếu có block không đủ bản sao).

Để tăng độ tin cậy (reliability), tính sẵn sàng (availability) và tối ưu đường truyền, HDFS lưu các bản sao của các block theo kiểu rack-aware. Cụ thể nếu số bản sao là 3 thì có 2 bản sao lưu trên 2 nodes thuộc cùng 1 rack, bản sao còn lại lưu trên node thuộc rack khác. NameNode sẽ xác định DataNode nào thuộc rack nào. Nhớ rằng, lỗi của rack ít hơn rất nhiều so với lỗi của node và giao tiếp giữa các rack khác nhau thì phải qua các switch, tốn thời gian. Cách làm này cho phép đọc dữ liệu song song từ các node khác nhau, nhưng lại “mệt” khi ghi dữ liệu.

Chế độ an toàn (Safemode)

Khi khởi động NameNode sẽ vào trạng thái safemode, dựa trên Heartbeat và Blockreport mà các DataNode gởi về. Block nào được sao đủ số lượng thì xem là an toàn. Nếu có đủ 1 tỉ lệ nhất định (thiết lập được) các block an toàn, NameNode sẽ thoát khỏi safemode sau 30s. Sau đó, những block nào chưa được sao ra đủ sẽ được sao thêm.

Kiểm tra nhịp tim

Nếu NameNode không nhận được Heartbeat gởi định kì về, thì xem như DataNode đó đã chết (dead), sẽ không cho tham gia các I/O, tất cả dữ liệu trên dead node sẽ vô hiệu. Node chết có thể làm một số block không đủ bản sao, NameNode luôn kiểm tra điều này và sao thêm khi cần.

Tính toàn vẹn (integrity)của dữ liệu

Do nhiều nguyên nhân, dữ liệu lấy ra từ DataNode có thể bị hư, HDFS client software sẽ tiến hành checksum nội dung của file. Khi tạo file, HDFS sẽ tính ra checksum của từng block, và lưu thành file ẩn riêng biệt. Checksum của dữ liệu lấy từ DataNode sẽ được so sánh với file ẩn này, nếu không giống thì xem như dữ liệu đã hư, cần phải lấy từ DataNode khác.

Thu hồi không gian

Khi file bị xóa, thực chất sẽ được di chuyển vào thư mục /trash, sau một thời gian nhất định (mặc định 6 tiếng, có thể thiết lập) thì mới bị xóa hoàn toàn. /trash chỉ lưu bản sao cuối cùng và có thể khôi phục nhanh chóng khi lệnh xóa bị hủy.

Đĩa lưu metadata bị lỗi

FsImage và Editlog là cấu trúc dữ liệu trung tâm, nếu xảy ra lỗi có thể dẫn đến HDFS ngưng hoạt động. Có thể thiết lập NameNode để lưu các cấu trúc này thành nhiều bản sao, sửa bản chính phải đảm bảo đồng thời sửa bản sao. Điều này có làm giảm tốc độ của NameNode chút ít nhưng cũng chấp nhận được. Trong trường hợp NameNode (duy nhất) bị sự cố thì cần phải thủ công xử lí.

Biện pháp nâng cao tính năng

Chọn bản sao gần chương trình nhất để giảm lưu lượng truyền và thời gian

Nếu không gian trống trên 1 DataNode giảm xuống mức độ nhất định, dữ liệu trên DataNode đó sẽ được di chuyển sang các node khác. File có nhiều yêu cầu truy xuất sẽ được sao ra thêm trên các node phù hợp. Tạm thời các tính năng này chưa có.

Khi client yêu cầu tạo file, HDFS client sẽ lưu tạm đến khi độ lớn vượt qua 1 block thì mới liên lạc với NameNode. NameNode thêm tên file vào file system, cấp cho 1 block rồi đem node ID với block ID thông báo client, client tự đem file lưu vào block đã chỉ định.

Khi viết dữ liệu vào HDFS, client gởi block đã lưu tạm sang DataNode đầu tiên (trong danh sách được NameNode chỉ định) theo từng khối nhỏ 4KB, DataNode này vừa lưu dữ liệu vừa đem dữ liệu gởi sang DataNode thứ 2, và cứ như thế đến node cuối cùng.

Cổng giao tiếp

Giao tiếp với HDFS có thể thông qua DFSShell (dùng từng dòng lệnh), Java API hoặc trình duyệt web.

By dongquangphuong Posted in HDFS, IT