Xử lý tệp tin nhỏ trong Hadoop

1. Vấn đề phát sinh

HDFS không phải là giải pháp tối ưu cho việc lưu trữ các tệp tin có kích thước nhỏ. Lý do là mỗi tệp tin, dù nhỏ, cũng chiếm ít nhất một block, và thông tin metadata của mỗi block đều được lưu trong bộ nhớ của NameNode. Khi số lượng tệp tin nhỏ tăng lên, bộ nhớ NameNode sẽ bị tiêu tốn đáng kể. Dưới đây là mô phỏng một kịch bản với nhiều tệp nhỏ.

2. Giới thiệu về Archive

Hadoop Archives là một giải pháp hiệu quả để xử lý vấn đề này. Nó cho phép gộp nhiều tệp tin nhỏ vào một tệp lưu trữ duy nhất. Sau khi được đóng gói, người dùng vẫn có thể truy cập từng tệp tin một cách minh bạch mà không cần giải nén toàn bộ.

3. Cách tạo Archive

Cú pháp: hadoop archive -archiveName tên -p <thư mục cha> <nguồn>* <đích>

Giải thích các tham số:
- -archiveName: Tên của tệp lưu trữ sẽ được tạo, mở rộng phải là *.har.
- -p: Chỉ định đường dẫn tương đối của các tệp tin nguồn.
  Ví dụ: -p /foo/bar a/b/c e/f/g, trong đó /foo/bar là thư mục cha chung của a/b/c và e/f/g. Đường dẫn đầy đủ sẽ là /foo/bar/a/b/c và /foo/bar/e/f/g.

Ví dụ thực tế:

Giả sử cần lưu trữ tất cả các tệp trong thư mục /smallfile:
hadoop archive -archiveName test.har -p /smallfile /outputdir

Kết quả: Một tệp lưu trữ có tên test.har sẽ được tạo trong thư mục /outputdir.
Lưu ý: Quá trình đóng gói này sử dụng MapReduce, do đó cần có YARN cluster đang chạy.

4. Cấu trúc của Archive sau khi tạo

Sau khi thực hiện lệnh, kiểm tra nội dung:
hadoop fs -ls /outputdir/test.har

Kết quả hiển thị bao gồm:
- Hai tệp chỉ mục (index)
- Một hoặc nhiều tệp part (trong ví dụ chỉ có một tệp part-0)
- Một tệp đánh dấu hoàn thành

Tệp part là nơi chứa nội dung của các tệp gốc. Các tệp chỉ mục giúp định vị và truy xuất từng tệp tin cụ thể bên trong tệp part.
Ví dụ: Ba tệp nhỏ 1.txt (nội dung "1"), 2.txt (nội dung "2"), 3.txt (nội dung "3") sau khi đóng gói sẽ nằm trong một tệp part-0 duy nhất.

5. Truy xuất nội dung gốc bằng giao thức HAR

Khi sử dụng giao thức mặc định hdfs://, bạn chỉ thấy cấu trúc của tệp lưu trữ (các tệp chỉ mục, part). 
Để xem lại các tệp gốc như trước khi đóng gói, sử dụng giao thức riêng của HAR:

Cú pháp URI: har://tên-máy-chủ:cổng/đường-dẫn-archive/tệp-trong-archive
Ví dụ: har://hdfs-namenode:9000/outputdir/test.har/1.txt

Giao thức này sẽ ẩn các tệp chỉ mục và part, chỉ hiển thị các tệp gốc.

6. Giải nén Archive

Giải nén tuần tự:
hadoop fs -cp har:///outputdir/test.har/* /smallfile1

Giải nén song song (sử dụng DistCp cho các archive lớn):
hadoop distcp har:///outputdir/test.har/* /smallfile2

DistCp giúp tăng tốc quá trình giải nén khi xử lý các tệp lưu trữ có kích thước lớn.

7. Những điểm cần lưu ý khi sử dụng Archive

  • Hadoop archive là một định dạng lưu trữ đặc biệt, xuất hiện như một thư mục trong HDFS với phần mở rộng *.har.
  • Quá trình tạo archive chạy dưới dạng một tác vụ Map/Reduce, do đó cần cluster Hadoop hoạt động.
  • Dung lượng đĩa cần thiết để tạo archive tương đương với tổng dung lượng của các tệp nguồn.
  • Archive không hỗ trợ nén, mặc dù bề ngoài có thể trông giống như đã được nén.
  • Một khi đã tạo, archive không thể thay đổi nội dung. Để cập nhật, cần tạo archive mới. Thông thường, archive được tạo định kỳ (hàng ngày hoặc hàng tuần).
  • Tệp tin gốc không bị xóa hoặc thay đổi khi tạo archive.

8. Phương pháp thay thế khác

Sử dụng Sequence File để gộp tệp nhỏ:
Có thể viết một chương trình đọc tất cả các tệp nhỏ và ghi chúng vào một Sequence File duy nhất. 
Trong Sequence File, tên tệp gốc được dùng làm khóa (key), và nội dung tệp là giá trị (value). 
Điều này giúp giảm số lượng tệp nhỏ trong HDFS.

Thẻ: hadoop hdfs MapReduce Sequence File yarn

Đăng vào ngày 14 tháng 6 lúc 05:19