HBase
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> HBase

Apache HBase I / O - HFile

Giới thiệu

Apache HBase là trình quản lý lưu trữ mã nguồn mở, được phân phối, có phiên bản Hadoop rất phù hợp cho ngẫu nhiên , đọc / ghi trong thời gian thực truy cập.

Đợi chút? truy cập đọc / ghi ngẫu nhiên, thời gian thực?
Làm thế nào điều đó có thể? Hadoop không phải chỉ là một hệ thống xử lý hàng loạt, đọc / ghi tuần tự?

Vâng, chúng ta đang nói về điều tương tự và trong vài đoạn tiếp theo, tôi sẽ giải thích cho bạn cách HBase đạt được I / O ngẫu nhiên, cách nó lưu trữ dữ liệu và sự phát triển của định dạng HFile của HBase.

Các định dạng tệp I / O Apache Hadoop

Hadoop đi kèm với định dạng tệp SequenceFile [1] mà bạn có thể sử dụng để nối thêm các cặp khóa / giá trị của mình nhưng do khả năng chỉ bổ sung hdfs, định dạng tệp không thể cho phép sửa đổi hoặc xóa giá trị đã chèn. Thao tác duy nhất được phép là chắp thêm và nếu bạn muốn tra cứu một khóa được chỉ định, bạn phải đọc qua tệp cho đến khi tìm thấy khóa của mình.

Như bạn có thể thấy, bạn buộc phải tuân theo mô hình đọc / ghi tuần tự… nhưng làm cách nào để có thể xây dựng hệ thống truy cập đọc / ghi ngẫu nhiên, có độ trễ thấp như HBase?

Để giúp bạn giải quyết vấn đề này, Hadoop có một định dạng tệp khác, được gọi là MapFile [1], một phần mở rộng của SequenceFile. MapFile, trên thực tế, là một thư mục chứa hai SequenceFiles:tệp dữ liệu “/ data” và tệp chỉ mục “/ index”. MapFile cho phép bạn thêm các cặp khóa / giá trị đã được sắp xếp và mọi N khóa (trong đó N là khoảng có thể định cấu hình) nó lưu trữ khóa và phần bù trong chỉ mục. Điều này cho phép tra cứu khá nhanh, vì thay vì quét tất cả các bản ghi, bạn quét chỉ mục có ít mục nhập hơn. Khi bạn đã tìm thấy khối của mình, bạn có thể chuyển sang tệp dữ liệu thực.

MapFile rất hay vì bạn có thể tra cứu các cặp khóa / giá trị một cách nhanh chóng nhưng vẫn còn hai vấn đề:

  • Làm cách nào để xóa hoặc thay thế khóa / giá trị?
  • Khi dữ liệu đầu vào của tôi không được sắp xếp, tôi không thể sử dụng MapFile.

HBase &MapFile

Khóa HBase bao gồm:khóa hàng, họ cột, định tính cột, dấu thời gian và một loại.

Để giải quyết vấn đề xóa các cặp khóa / giá trị, ý tưởng là sử dụng trường “loại” để đánh dấu khóa là đã xóa (điểm đánh dấu bia mộ). Việc giải quyết vấn đề thay thế các cặp khóa / giá trị chỉ là việc chọn dấu thời gian sau (giá trị chính xác nằm gần cuối tệp, chỉ nối thêm có nghĩa là được chèn lần cuối gần cuối).

Để giải quyết vấn đề khóa "không theo thứ tự", chúng tôi giữ các khóa-giá trị được thêm cuối cùng trong bộ nhớ. Khi bạn đã đạt đến một ngưỡng, HBase sẽ chuyển nó vào MapFile. Bằng cách này, bạn sẽ thêm các khóa / giá trị được sắp xếp vào MapFile.

HBase thực hiện chính xác điều này [2]:khi bạn thêm một giá trị với table.put (), khóa / giá trị của bạn sẽ được thêm vào MemStore (về cơ bản thì MemStore là một Bản đồ ConcurrentSkipListM được sắp xếp). Khi đạt đến ngưỡng cho mỗi kho lưu trữ (hbase.hregion.memstore.flush.size) hoặc Máy chủ khu vực đang sử dụng quá nhiều bộ nhớ cho các kho lưu trữ (hbase.regionserver.global.memstore.upperLimit), dữ liệu được xóa trên đĩa dưới dạng MapFile mới .

Kết quả của mỗi lần gửi là một MapFile mới, và điều này có nghĩa là để tìm được khóa, bạn phải tìm kiếm trong nhiều tệp. Điều này chiếm nhiều tài nguyên hơn và có thể chậm hơn.

Mỗi lần nhận hoặc quét được phát hành, HBase sẽ quét qua từng tệp để tìm kết quả, để tránh nhảy xung quanh quá nhiều tệp, có một chuỗi sẽ phát hiện khi bạn đã đạt đến một số tệp nhất định (hbase.hstore.compaction . max). Sau đó, nó cố gắng hợp nhất chúng lại với nhau trong một quá trình được gọi là nén, về cơ bản tạo ra một tệp lớn mới do kết quả của việc hợp nhất tệp.

HBase có hai kiểu nén:một kiểu gọi là “nén nhỏ” chỉ hợp nhất hai hoặc nhiều tệp nhỏ thành một, và kiểu kia gọi là “nén lớn” chọn tất cả các tệp trong vùng, hợp nhất chúng và thực hiện một số thao tác dọn dẹp. Trong một lần nén lớn, các khóa / giá trị đã xóa sẽ bị xóa, tệp mới này không chứa các điểm đánh dấu bia mộ và tất cả các khóa / giá trị trùng lặp (các thao tác thay thế giá trị) sẽ bị xóa.

Lên đến phiên bản 0.20, HBase đã sử dụng định dạng MapFile để lưu trữ dữ liệu nhưng trong 0.20, MapFile dành riêng cho HBase mới được giới thiệu (HBASE-61).

HFile v1

Trong HBase 0.20, MapFile được thay thế bằng HFile:một triển khai tệp bản đồ cụ thể cho HBase. Ý tưởng này khá giống với MapFile, nhưng nó bổ sung thêm nhiều tính năng hơn là chỉ một tệp khóa / giá trị đơn thuần. Các tính năng như hỗ trợ siêu dữ liệu và chỉ mục hiện được giữ trong cùng một tệp.

Các khối dữ liệu chứa khóa / giá trị thực tế dưới dạng MapFile. Đối với mỗi "hoạt động đóng khối", khóa đầu tiên được thêm vào chỉ mục và chỉ mục được ghi trên HFile đóng.

Định dạng HFile cũng bổ sung thêm hai loại khối “siêu dữ liệu” bổ sung:Meta và FileInfo. Hai khối khóa / giá trị này được ghi khi đóng tệp.

Khối Meta được thiết kế để giữ một lượng lớn dữ liệu với khóa của nó dưới dạng Chuỗi, trong khi FileInfo là Bản đồ đơn giản được ưu tiên cho thông tin nhỏ có khóa và giá trị đều là mảng byte. Regionserver’s StoreFile sử dụng Meta-Blocks để lưu trữ Bộ lọc Bloom và FileInfo cho Max SequenceId, Khóa nén chính và thông tin Timerange. Thông tin này hữu ích để tránh đọc tệp nếu không có khả năng là khóa hiện diện (Bộ lọc Bloom), nếu tệp quá cũ (Max SequenceId) hoặc nếu tệp quá mới (Khoảng thời gian) để chứa những gì chúng ta đang tìm cho.

HFile v2

Trong HBase 0.92, định dạng HFile đã được thay đổi một chút (HBASE-3857) để cải thiện hiệu suất khi lượng lớn dữ liệu được lưu trữ. Một trong những vấn đề chính với HFile v1 là bạn cần tải tất cả các chỉ mục nguyên khối và Bộ lọc Bloom lớn trong bộ nhớ, và để giải quyết vấn đề này, v2 giới thiệu các chỉ mục nhiều cấp và Bộ lọc Bloom cấp khối. Do đó, HFile v2 có cải thiện tốc độ, bộ nhớ và sử dụng bộ đệm.

Tính năng chính của v2 này là "khối nội tuyến", ý tưởng là phá vỡ chỉ mục và Bộ lọc Bloom trên mỗi khối, thay vì có toàn bộ chỉ mục và Bộ lọc Bloom của toàn bộ tệp trong bộ nhớ. Bằng cách này, bạn có thể lưu trữ ram chỉ những gì bạn cần.

Vì chỉ mục được chuyển đến cấp khối, khi đó bạn sẽ có chỉ mục nhiều cấp, nghĩa là mỗi khối có chỉ mục riêng (chỉ mục lá). Khóa cuối cùng của mỗi khối được giữ để tạo trung gian / chỉ mục làm cho cây b + chỉ mục đa cấp giống như vậy.

Tiêu đề khối bây giờ chứa một số thông tin:Trường “Block Magic” được thay thế bằng trường “Block Type” mô tả nội dung của khối “Data”, Leaf-Index, Bloom, Metadata, Root-Index, v.v. Ngoài ra ba các trường (kích thước được nén / không nén và khối bù đắp trước) đã được thêm vào để cho phép tìm kiếm lùi và tiến nhanh.

Mã hóa khối dữ liệu

Vì các khóa được sắp xếp và thường rất giống nhau, nên có thể thiết kế nén tốt hơn so với những gì mà thuật toán mục đích chung có thể làm.

HBASE-4218 đã cố gắng giải quyết vấn đề này và trong HBase 0.94, bạn có thể chọn giữa một số thuật toán khác nhau:Mã hóa tiền tố và mã hóa khác biệt.

Ý tưởng chính của Mã hóa tiền tố là chỉ lưu trữ tiền tố chung một lần, vì các hàng được sắp xếp và phần đầu thường giống nhau.

Mã hóa khác biệt đẩy khái niệm này đi xa hơn. Thay vì coi khóa là một chuỗi byte không rõ ràng, Bộ mã hóa khác biệt chia từng trường khóa để nén từng phần theo cách tốt hơn. Đây là họ cột được lưu trữ một lần. Nếu độ dài khóa, độ dài giá trị và kiểu giống với hàng trước đó, trường sẽ bị bỏ qua. Ngoài ra, để tăng khả năng nén, dấu thời gian được lưu trữ sẽ được lưu trữ dưới dạng Khác biệt so với dấu trước đó.

Lưu ý rằng tính năng này bị tắt theo mặc định vì quá trình ghi và quét chậm hơn nhưng nhiều dữ liệu được lưu vào bộ nhớ đệm hơn. Để bật tính năng này, bạn có thể đặt DATA_BLOCK_ENCODING =PREFIX | QUÁN ĂN | FAST_DIFF trong thông tin bảng.

HFile v3

HBASE-5313 chứa đề xuất tái cấu trúc bố cục HFile để cải thiện khả năng nén:

  • Gói tất cả các khóa lại với nhau ở đầu khối và tất cả giá trị lại với nhau ở cuối khối. Bằng cách này, bạn có thể sử dụng hai thuật toán khác nhau để nén khóa và giá trị.
  • Nén dấu thời gian bằng cách sử dụng XOR với giá trị đầu tiên và sử dụng VInt thay vì dài.

Ngoài ra, định dạng cột hoặc mã hóa cột đang được điều tra, hãy xem AVRO-806 để biết định dạng tệp cột của Doug Cắt.

Như bạn có thể thấy xu hướng trong quá trình phát triển là nhận thức rõ hơn về những gì tệp chứa, để có được khả năng nén tốt hơn hoặc nhận biết vị trí tốt hơn giúp chuyển thành ít dữ liệu hơn để ghi / đọc từ đĩa. I / O ít hơn có nghĩa là tốc độ cao hơn!

[1] https://clouderatemp.wpengine.com/blog/2011/01/hadoop-io-sequence-map-set-array-bloommap-files/
[2] https://clouderatemp.wpengine. com / blog / 2012/06 / hbase-write-path /


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kiểm tra hiệu suất HBase bằng YCSB

  2. Cloudera Impala:Truy vấn thời gian thực trong Apache Hadoop, dành cho thực

  3. Tổng quan về nhân bản Apache HBase

  4. Triển khai ứng dụng trên Cơ sở dữ liệu hoạt động CDP (COD)

  5. Quản trị Cơ sở dữ liệu Hoạt động