Giới thiệu
Tính năng Apache HBase Medium Object Storage (MOB) được giới thiệu bởi HBASE-11339. Tính năng này cải thiện quyền truy cập đọc và ghi độ trễ thấp cho các giá trị có kích thước vừa phải (lý tưởng là từ 100K đến 10MB dựa trên kết quả thử nghiệm của chúng tôi), làm cho nó rất phù hợp để lưu trữ tài liệu, hình ảnh và các đối tượng có kích thước vừa phải khác [1]. Tính năng Apache HBase MOB đạt được cải tiến này bằng cách tách các đường dẫn IO cho các tham chiếu tệp và đối tượng MOB, áp dụng các chính sách nén khác nhau cho MOB và do đó giảm sự khuếch đại ghi do các giao dịch của HBase tạo ra. Các đối tượng MOB được lưu trữ trong một vùng đặc biệt, được gọi là vùng MOB. Các đối tượng MOB cho một bảng được lưu trữ trong vùng MOB dưới dạng tệp MOB, có nghĩa là sẽ có rất nhiều tệp MOB trong vùng này. Vui lòng xem Hình 1 từ [1] để biết kiến trúc Apache HBase MOB.
Hình 1 Kiến trúc Apache HBase MOB
Ban đầu, các tệp MOB tương đối nhỏ (ít hơn 1 hoặc 2 khối HDFS). Để cải thiện hiệu quả Apache HDFS, các tệp MOB được hợp nhất định kỳ thành các tệp lớn hơn thông qua một hoạt động được gọi là MOB compaction , không phụ thuộc vào quá trình đầm thông thường. Phiên bản đầu tiên của MOB compaction ghi lại nhiều tệp MOB từ một ngày cụ thể thành các tệp MOB lớn hơn cho ngày đó. Hãy sử dụng danh sách tệp mẫu bên dưới để làm rõ hơn điều này. Bảng t1 có hai vùng (r1, r2), nó có một họ cột (f1) và MOB được kích hoạt. Bạn có thể thấy rằng có hai tiền tố; D279186428a75016b17e4df5ea43d080 tương ứng với giá trị băm của khóa bắt đầu cho vùng r1 và D41d8cd98f00b204e9800998ecf8427e cho giá trị băm của khóa bắt đầu cho vùng r2. Đối với vùng r1, có hai tệp MOB mỗi tệp vào ngày 1/1/2016 và 1/2/2016 và đối với vùng r2, có 3 tệp MOB vào ngày 1/1/2016 trong vùng MOB, đó là / hbase / data / mobdir / data / default / t1 / 78e317a6e78a0fceb27b9fa0cb9dcf5b / f1.
>ls /hbase/data/mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1
D279186428a75016b17e4df5ea43d080 20160101 f9d9713ab2fb4a8b825485f6a8acfcd5
D279186428a75016b17e4df5ea43d080 20160101 af7713ab2fbf4a8abc5135f6a8467ca8
D279186428a75016b17e4df5ea43d080 20160102 9013ab2fceda8b825485f6a8acfcd515
D279186428a75016b17e4df5ea43d080 20160102 9a7978013ab2fceda8b825485f6a8acf
D41d8cd98f00b204e9800998ecf8427e 20160101 fc94af623c2345f1b241887721e32a48
D41d8cd98f00b204e9800998ecf8427e 20160101 d0954af623c2345f1b241887721e3259
D41d8cd98f00b204e9800998ecf8427e 20160101 439adf4af623c2345f1b241887721e32
Sau khi nén MOB, hai tệp MOB vào ngày 1/1/2016 và 1/2/2016 cho vùng r1 được nén thành một tệp cho mỗi ngày. Ba tệp MOB vào ngày 1/1/2016 cho vùng r2 được nén thành một tệp.
D279186428a75016b17e4df5ea43d080 20160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d080 20160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998ecf8427e 20160101 d9cb0954af623c2345f1b241887721e3
Vì chỉ các tệp MOB trong cùng một ngày cho một khu vực có thể được nén lại với nhau, giới hạn tối thiểu của các tệp MOB trong thư mục khu vực MOB duy nhất cho một họ cụ thể trong một năm sẽ là 365 x số vùng. Với 1000 khu vực, trong 10 năm, sẽ có 365 x 1000 x 10, 3,65 triệu tệp sau khi nén MOB và nó tiếp tục phát triển! Thật không may, Apache HDFS có giới hạn về bộ nhớ đối với số lượng tệp trong một thư mục [2]. Sau khi số lượng tệp MOB vượt quá giới hạn HDFS này, bảng MOB không thể ghi được nữa. Số tệp tối đa mặc định trong một thư mục cho Apache HDFS là 1 triệu. Đối với 1.000 khu vực, nó sẽ đạt đến giới hạn này trong khoảng 3 năm. Với nhiều vùng hơn, nó sẽ đạt đến giới hạn nhanh hơn.
HBASE-16981 giới thiệu các chính sách tổng hợp phân vùng nén MOB hàng tuần và hàng tháng để cải thiện vấn đề chia tỷ lệ số lượng tệp MOB này theo hệ số tương ứng là 7 hoặc ~ 30.
Thiết kế chính sách phân vùng nén MOB hàng tuần và hàng tháng (HBASE-16981)
Ý tưởng cơ bản của HBASE-16981 là thu gọn các tệp MOB trong một tuần dương lịch hoặc một tháng dương lịch thành ít tệp hơn, lớn hơn. Tuần theo lịch được xác định bởi ISO 8601, nó bắt đầu vào Thứ Hai và kết thúc vào Chủ Nhật. Thông thường, với chính sách hàng tuần, sau khi nén MOB sẽ có một tệp mỗi tuần cho mỗi khu vực; với chính sách hàng tháng, sau khi nén MOB sẽ có một tệp mỗi tháng cho mỗi khu vực. Số lượng tệp MOB trong thư mục khu vực MOB cho một gia đình cụ thể trong một năm sẽ giảm xuống còn 52 x số vùng với chính sách hàng tuần và 12 x số vùng với chính sách hàng tháng. Điều này làm giảm đáng kể số lượng tệp MOB sau khi nén.
Cách tiếp cận được đề xuất ban đầu
Khi nén MOB xảy ra, HBase master sẽ chọn và tổng hợp các tệp MOB trong vòng một tháng hoặc một tuần dương lịch thành ít tệp hơn, lớn hơn. Tùy thuộc vào tần suất nén MOB xảy ra, có thể các tệp được nén nhiều lần. Ví dụ:giả sử hoạt động nén MOB diễn ra hàng ngày với chính sách tổng hợp hàng tháng. Vào ngày đầu tiên, MOB compaction sẽ nén tất cả các tệp của ngày đầu tiên thành một tệp. Vào ngày thứ 2, MOB compaction sẽ nén tệp từ ngày 1 và các tệp từ ngày 2 thành một tệp mới; Vào ngày 3, MOB compaction sẽ nén các tệp từ ngày 2 và các tệp từ ngày 3 thành một tệp mới, nó tiếp tục diễn ra cho đến ngày cuối cùng của tháng. Trong trường hợp này, các tệp từ ngày đầu tiên được nén hơn 30 lần và do đó khuếch đại lượng IO ghi lớn hơn 30 lần.
Mục tiêu thiết kế của Apache HBase MOB là giảm sự khuếch đại ghi do MOB compaction tạo ra. Cách tiếp cận ngây thơ này đánh bại mục tiêu thiết kế.
Cách tiếp cận được triển khai cuối cùng
Để khắc phục sự thiếu sót của phương pháp đề xuất ban đầu, nén MOB theo giai đoạn được áp dụng cho các chính sách mới hàng tuần và hàng tháng trong HBASE-16981. Hình 2 cho thấy cách nó hoạt động với chính sách hàng tháng, nó hoạt động tương tự đối với chính sách hàng tuần.
Hình 2 Phân loại nén MOB với chính sách hàng tháng
Như Hình 2 cho thấy, nén MOB xảy ra vào ngày 15/11/2016. Các tệp trong tuần lịch hiện tại được nén dựa trên phân vùng hàng ngày với ngưỡng MOB đã định cấu hình. Trong Hình 2, các tệp cho ngày 14/11/2016 được nén lại với nhau và các tệp cho ngày 15/11/2016 được nén lại với nhau. Các tệp trong các tuần lịch trước của tháng hiện tại được nén dựa trên phân vùng hàng tuần với ngưỡng hàng tuần (đã định cấu hình-MOB-ngưỡng x 7). Trong Hình 2, các tệp từ 11/1/2016 đến 11/6/2016 được nén lại với nhau và các tệp từ 11/7/2016 đến 13/11/2016 được nén lại với nhau. Các tệp trong những tháng qua được nén dựa trên phân vùng hàng tháng với ngưỡng hàng tháng (đã định cấu hình-MOB-ngưỡng x 28). Trong Hình 2, các tệp từ 10/1/2016 đến 31/10/2016 được nén lại với nhau. Như mọi người có thể nhận thấy, tuần dương lịch đầu tiên của tháng 11 năm 2016 là từ 31/10/2016 đến 11/6/2016. Vì 31/10/2016 là trong tháng trước, các tệp cho ngày đó được nén dựa trên phân vùng hàng tháng, điều này chỉ còn 6 ngày cho phân vùng hàng tuần (11/1/2016 ~ 11/6/2016). Sau khi nén, có 5 tệp nếu ngưỡng nén MOB và kích thước lô nén MOB được định cấu hình thích hợp.
Với thiết kế này, các tệp MOB trải qua các giao dịch 2 giai đoạn hoặc 3 giai đoạn. Ở mỗi giai đoạn, phân vùng hàng ngày, phân vùng hàng tuần hoặc phân vùng hàng tháng được áp dụng với ngưỡng nén MOB tăng dần. Tệp MOB được nén nhiều nhất 3 lần bình thường với chính sách hàng tháng và nhiều nhất 2 lần bình thường với chính sách hàng tuần trong thời gian tồn tại.
Để biết thêm chi tiết về thiết kế, vui lòng xem [3].
Cách sử dụng
Theo mặc định, chính sách phân vùng nén MOB là hàng ngày. Để áp dụng chính sách hàng tuần hoặc hàng tháng, có một thuộc tính mới MOB_COMPACT_PARTITION_POLICY được thêm vào nhóm cột MOB. Người dùng có thể đặt thuộc tính này khi tạo bảng từ vỏ HBase.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
Người dùng cũng có thể thay đổi MOB_COMPACT_PARTITION_POLICY của bảng hiện có từ vỏ HBase.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Nếu chính sách thay đổi từ hàng ngày sang hàng tuần hoặc hàng tháng hoặc từ hàng tuần sang hàng tháng, lần nén MOB tiếp theo sẽ biên dịch lại các tệp MOB đã được nén với chính sách trước đó. Nếu chính sách thay đổi từ hàng tháng hoặc hàng tuần thành hàng ngày hoặc từ hàng tháng sang hàng tuần, các tệp MOB đã được nén với chính sách trước đó sẽ không được phản hồi lại với chính sách mới.
Kết luận
HBASE-16981 giải quyết vấn đề chia tỷ lệ số tệp với Apache HBase MOB. Nó sẽ có sẵn trong bản phát hành Apache HBase 2.0.0. CDH hỗ trợ Apache HBase MOB trong CDH 5.4.0+. HBASE-16981 đã được backported và sẽ có sẵn trong CDH 5.11.0.
Lời cảm ơn
Đặc biệt cảm ơn Jingcheng Du và Anoop Sam John đã giúp đỡ trong việc thiết kế và đánh giá HBASE-16981, Jonathan Hsieh và Sean Busbey đã đánh giá blog.
Tài liệu tham khảo
[1] https://clouderatemp.wpengine.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/
[2] https://clouderatemp.wpengine.com/blog/2009/02/the-small-files-problem/
[3] https://issues.apache.org/jira/browse/HBASE-16981