Đánh giá hiệu năng của apache hadoop

Tiếp theo loạt bài viết về Hadoop, trong bài viết này mình sẽ cùng các bạn tìm hiểu kĩ hơn về HDFS, một cấu trúc lưu trữ file mà theo mình là rất hay và có tính ứng dụng cao trong hệ thống phân tán. Chúng ta sẽ cùng tìm hiểu theo những thông tin dưới đây.

1, HDFS là gì ?

HDFS là viết tắt của Hadoop Distributed Files System được hiểu nôm na là hệ thống lưu trữ file phân tán của Hadoop.

2, Kiến trúc của HDFS ?

Đánh giá hiệu năng của apache hadoop

Đối với 1 client bên ngoài, HDFS chỉ như một hệ thống file có cấu trúc thứ bậc truyền thống. File có thể được tạo, xóa, di chuyển, đổi tên… Nhưng để đạt được các mục tiêu của mình, HDFS sử dụng kiến trúc master/slave được xây dựng từ các node đặc biệt sau:

  • NameNode (chỉ có 1 node duy nhất): là máy chủ trung tâm quản lí thông tin về hệ thống file và điều hướng truy xuất dữ liệu cho client.
  • DataNode: là các khối lưu trữ dữ liệu trong HDFS.

File lưu trữ trong HDFS được chia thành các block (khối), mỗi block được nhân bản ra nhiều DataNode khác nhau. Kích thước của block (mặc định là 64MB) và số lượng nhân bản được xác định bởi client khi file được tạo ra. Mọi thao tác với file được điều khiển bỏi NameNode, mọi giao tiếp HDFS giữ các Node đều thông qua giao thức TCP/IP.

3, NameNode

NameNode thực chất là một tiến trình chạy trên một máy chủ riêng biệt trong một cụm máy HDFS. Nó có trách nhiệm quản lí tên miền không gian hệ thống tập tin và kiểm soát truy cập của client bên ngoài. NameNode thiết lập bản đồ các khối tập tin được nhân bản trên các DataNode, thông thường với hệ thống nhân bản là 3, một nhân bản sẽ được lưu trên một Node khác nhưng cùng rack và nhân bản còn lại sẽ được lưu trên một Node khác trên rack khác.

Các thao tác I/O thực chất không đi qua NameNode và chỉ có các siêu dữ liệu chỉ ra thông tin của file và các block của nó trên DataNode. Khi Client gửi yêu cầu tạo file, NameNode phản hồi với IP của DataNode sẽ nhận khối block, và NameNode sẽ thông báo cho các DataNode xác định khác sẽ nhận nhân bản của block đó.

NameNode lưu mọi thông tin về hệ thống tệp tin trong file FsImage. Tệp tin này cùng với bản ghi về tất cả các thao tác trong hệ thống (hay còn gọi là EditLog) được lưu trong hệ thống file của hệ điều hành mà NameNode được cài đặt. File FsImage và EditLog cũng được nhân bản để đề phòng trường hợp xảy ra lỗi trên NameNode.

4, DataNode.

DataNode cũng là một tiến trình cài đặt trên một máy riêng biệt trong cụm máy HDFS (nếu chỉ có 1 máy thì DataNode và NameNode cùng được cài trên máy đó). Một cụm máy Hadoop có một NameNode duy nhất nhưng có thể có hàng ngàn DataNode. Các DataNode thường được sắp xếp vào rack và kết nối thông qua switch. Hadoop giả định rằng băng thông trong nội bộ các rack sẽ lớn hơn băng thông giữa các rack với nhau (kiểu trong cùng rack thì tương tác với nhau nhanh hơn).

DataNode đáp ứng yêu cầu đọc ghi dữ liệu từ client và các lệnh tạo, xóa, nhân bản Block từ NameNode. NameNode thường xuyên gửi 1 bản tin kiểm tra định kỳ (heartbeat message) đến các DataNode để xác định DataNode còn sử dụng được không. Nếu DataNode không có phản hồi, NameNode sẽ tiến hành khôi phục nhân bản các block ở DataNode đó trên các DataNode khác còn hoạt động.

5, Nhân bản dữ liệu.

HDFS được thiết kế để lưu trữ các file cực lớn một cách tin cậy trên nhiều máy trong một cụm máy chủ lớn. Nó chia file thành một chuỗi các block, tất cả các block có kích thước bằng nhau trừ block cuối cùng. Các block này được nhân bản để chống lỗi theo hệ thóng nhân bản được cấu hình. Các file trong HDFS được ghi một lần duy nhất và không thể thay đổi.

NameNode thực hiện mọi thao tác đều dựa vào các nhân bản của block. Nó định kỳ nhận heartbeat từ các DataNode để xác định tính sẵn sàng của DataNode và báo cáo BlockReport về các block được lưu trên DataNode đó.

Đánh giá hiệu năng của apache hadoop

a, Phương thức nhân bản.

Phương pháp nhân bản của HDFS dựa trên kĩ thuật Hadoop Rack Awareness. Trong hầu hết các trường hợp với hệ số nhân bản là 3, HDFS đặt một nhân bản ở một DataNode khác cùng rack, và một ở một DataNode khác khác rack.

Tỉ lệ toàn bộ 1 rack bị fail thấp hơn nhiều so với 1 Node bị fail. Khi DataNode bị fail, NameNode sẽ khôi phục các block bị mất cân bằng cách nhân bản trên các DataNodes trên cùng rack để có tốc độ cao nhất (băng thông lớn hơn). Nếu toàn bộ rack bị fail thì vẫn có nhân bản của block trên các rack khác.

b, Lựa chọn nhân bản

Để giảm thiểu việc tiêu thụ băng thông và độ trễ đọc dữ liệu, HDFS cố gắng tìm nhân bản mà gần nhất với NameNode. Nếu tồn tại một nhân bản trên cùng rack với NamdeNode yêu cầu, nhân bản đó sẽ được ưu tiên chọn để thỏa mãn yêu cầu. Nếu HDFS trải rộng trên Data Center, những nhân bản trên cùng Data Center sẽ được ưu tiên hơn các nhân bản ở Data Center khác.

6, Khả năng chống lỗi.

Mục tiêu chính của HDFS là lưu trữ dữ liệu một cách tin cậy ngay khi có lỗi xảy ra. Có 3 loại lỗi thường gặp: NameNode bị lỗi, DataNode bị lỗi và phân mảnh mạng.

  • Data Disk Failure, Heartbeat and Re-replication.
    • Mỗi DataNode đều gửi heartbeat đến NameNode một cách định kì. Phân mảnh mạng xảy ra khi một số DataNode mất kết nối với NameNode. NameNode phát hiện ra nhờ sự vắng mặt của hearbeat, NameNode sẽ tiến hành đánh dấu các DataNode này và đưa nó về trạng thái “dead” và ngừng chuyển tiếp các yêu cầu I/O tới chúng.
    • Mọi dữ liệu lưu ở Datanode hỏng đều không được sử dụng cho NameNode nữa và làm cho số lượng nhân bản của nhiều block bị nhỏ hơn hệ số nhân bản. NameNode kiểm tra các block định kì và tiến hành nhân bản cho các block bị thiếu nhân bản. Việc tái nhân bản này có thể bị gây ra bởi nhiều nguyên nhân khác nhau: Datanode bị lỗi, một nhân bản bị lỗi, hệ số nhân bản tăng lên…
  • Cluster Rebalancing.
    • Kiến trúc của DataNode tương tích với mô hình tái cân bằng dữ liệu. Mô hình này sẽ tự động di chuyển dữ liệu từ một DataNode sang DataNode khác khi dung lượng trống của nó rơi xuống ngưỡng cấu hình.
  • Data Integrity.
    • Trên thực tế có khả năng dữ liệu nhận được từ một DataNode bị hỏng, có thể do lỗi thiết bị, lỗi kết nối mạng hay lỗi phần mềm. HDFS client thực hiện kiểm tra checksum trên từng block và ghi vào nhiều file. Các file này được lưu ẩn trên cùng hệ thống HDFS. Khi client nhận dữ liệu nó sẽ kiểm tra với thông tin checksum gắn với dữ liệu đó. Nếu không khớp, client sẽ yêu cầu NameNode gửi lại nhân bản của block đó trên một DataNode khác.
  • Metadata Disk Failure.
    • FsImage (lưu thông tin về hệ thống tập tin) và Edit Log (lưu lại giao tác trong hệ thống) là cấu trúc dữ liệu trung tâm của toàn bộ HDFS, nếu những file này bị lỗi thì có thể dẫn đến toàn bộ dữ hệ thống HDFS không hoạt động được. Vì lí do này, NameNode được cấu hình để hỗ trợ duy trì nhiều phiên bản sao chép của FsImage và EditLog. Thông tin cập nhật vào một phiên bản sẽ đồng bộ sang tất cả các phiên bản khác.
    • Việc đồng bộ nhiều phiên bản có thể làm giảm hiệu năng xử lí của NameNode, nhưng mức giảm này là chấp nhận được vì hệ thống nặng về xử lí dữ liệu lớn chứ không nặng về xử lí siêu dữ liệu. Khi NameNode khởi động lại, nó sẽ chọn phiên bản đồng nhất cuối cùng để sử dụng.
    • Do chỉ có một NameNode nên nó trở thành DeadNode của hệ thống (single point of fail). Khi NameNode bị lỗi, cần khắc phục bằng tay chứ chưa có cơ chết tự đọng chống lỗi cho NameNode (…đang xem xét lại…)

7, Thu hồi vùng nhớ

  • Xóa file và khôi phục file đã xóa
    • khi một file bị xóa, nó sẽ không bị xóa ngay mà thay vào đó nó sẽ bị đổi tên và di chuyển vào thư mục trash. File có thể được khôi phục bất cứ lúc nào khi file vẫn còn tồn tại trong trash. Sau khi hết thời gian ở trong trash, HSFS sẽ tự động xóa file đó khỏi hệ thống. Việc xóa file sẽ giải phóng vùng nhớ liên kết tới file. Sẽ có một khoảng thời gian trễ từ lúc người dùng xóa file cho đến khi bộ nhớ trống của HDFS được tăng lên.
  • Giảm hệ số nhân bản:
    • Khi hệ số nhân bản giảm, NameNode sẽ xác định những nhân bản thừa để thực hiện xóa bỏ. Thông tin này nhận được từ các bản tin của DataNode. DataNode sẽ thực hiện xóa bỏ block và giải phóng vùng nhớ tương ứng. Tuy nhiên vẫn có độ trễ giữa thời gian xóa và thời gian vùng nhớ trống được tăng lên.

Đến đây là kết thúc những chia sẻ của mình về HDFS, trong phần tiếp theo của loại bài này, mình và các bạn sẽ cùng tìm hiểu về thuật toán xương sống của Hadoop là Map-Reduce. Hãy đón chờ ở part3 nhé.