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

Tách và hợp nhất vùng Apache HBase

Bài đăng trên blog này đã được xuất bản trên Hortonworks.com trước khi hợp nhất với Cloudera. Một số liên kết, tài nguyên hoặc tham chiếu có thể không còn chính xác.

Đối với bài đăng này, chúng tôi đi sâu về kỹ thuật vào một trong những lĩnh vực cốt lõi của HBase. Cụ thể, chúng ta sẽ xem xét cách Apache HBase phân phối tải qua các vùng và quản lý việc phân chia vùng. HBase lưu trữ các hàng dữ liệu trong bảng. Các bảng được chia thành các phần hàng được gọi là "vùng". Các khu vực đó được phân phối trên toàn bộ cụm, được lưu trữ và cung cấp cho các quy trình khách hàng bởi quy trình Máy chủ khu vực. Vùng là một phạm vi liên tục trong không gian khóa, có nghĩa là tất cả các hàng trong bảng sắp xếp giữa khóa bắt đầu và khóa kết thúc của vùng được lưu trữ trong cùng một vùng. Các khu vực không chồng chéo, tức là một khóa hàng duy nhất thuộc về chính xác một khu vực tại bất kỳ thời điểm nào. Một khu vực chỉ được phục vụ bởi một máy chủ khu vực tại bất kỳ thời điểm nào, đó là cách HBase đảm bảo tính nhất quán mạnh mẽ trong một hàng #. Cùng với -ROOT- và .META. vùng, các vùng của bảng tạo thành một Cây 3 cấp B một cách hiệu quả cho mục đích định vị một hàng trong một bảng.

Đến lượt mình, một Vùng bao gồm nhiều “Cửa hàng”, tương ứng với các họ cột. Một cửa hàng chứa một kho lưu trữ và không hoặc nhiều tệp lưu trữ. Dữ liệu cho mỗi họ cột được lưu trữ và truy cập riêng biệt.

Một bảng thường bao gồm nhiều vùng, lần lượt được lưu trữ bởi nhiều máy chủ vùng. Do đó, vùng là cơ chế vật lý được sử dụng để phân phối tải ghi và truy vấn giữa các máy chủ vùng. Khi một bảng được tạo lần đầu tiên, HBase, theo mặc định, sẽ chỉ cấp phát một vùng cho bảng. Điều này có nghĩa là ban đầu, tất cả các yêu cầu sẽ chuyển đến một máy chủ khu vực duy nhất, bất kể số lượng máy chủ khu vực. Đây là lý do chính tại sao các giai đoạn tải dữ liệu ban đầu vào một bảng trống không thể sử dụng toàn bộ dung lượng của cụm.

Phân tách trước

Lý do HBase chỉ tạo một vùng cho bảng là nó không thể biết cách tạo các điểm phân tách trong không gian khóa hàng. Việc đưa ra các quyết định như vậy dựa rất nhiều vào việc phân phối các khóa trong dữ liệu của bạn. Thay vì phỏng đoán và để bạn giải quyết hậu quả, HBase cung cấp cho bạn các công cụ để quản lý điều này từ khách hàng. Với quy trình được gọi là phân tách trước, bạn có thể tạo một bảng với nhiều vùng bằng cách cung cấp các điểm phân tách tại thời điểm tạo bảng. Vì phân tách trước sẽ đảm bảo rằng tải ban đầu được phân bổ đồng đều hơn trong toàn bộ cụm, bạn nên luôn cân nhắc sử dụng nó nếu bạn biết trước phân phối khóa của mình. Tuy nhiên, phân tách trước cũng có nguy cơ tạo ra các vùng, không thực sự phân phối tải đồng đều do dữ liệu bị lệch hoặc khi có các hàng rất nóng hoặc lớn. Nếu tập hợp điểm phân chia khu vực ban đầu được chọn không tốt, bạn có thể kết thúc với việc phân phối tải không đồng nhất, điều này sẽ hạn chế hiệu suất các cụm của bạn.

Không có câu trả lời ngắn gọn cho số lượng vùng tối ưu cho một tải nhất định, nhưng bạn có thể bắt đầu với bội số thấp hơn của số lượng máy chủ vùng làm số lượng phân chia, sau đó để phân tách tự động lo phần còn lại.

Một vấn đề với phân tách trước là tính toán điểm phân tách cho bảng. Bạn có thể sử dụng tiện ích RegionSplitter. RegionSplitter tạo ra các điểm phân tách, bằng cách sử dụng một thuật toán SplitAlgorithm có thể cắm được. HexStringSplit và UniformSplit là hai thuật toán được xác định trước. Cái trước có thể được sử dụng nếu các phím hàng có tiền tố cho chuỗi thập lục phân (giống như nếu bạn đang sử dụng mã băm làm tiền tố). Cái sau chia đều không gian khóa giả sử chúng là mảng byte ngẫu nhiên. Bạn cũng có thể triển khai Thuật toán phân tách tùy chỉnh của mình và sử dụng nó từ tiện ích Bộ chia vùng.

$ hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f f1

trong đó -c 10, chỉ định số vùng được yêu cầu là 10 và -f chỉ định họ cột bạn muốn trong bảng, được phân tách bằng “:”. Công cụ sẽ tạo một bảng có tên “test_table” với 10 vùng:

13/01/18 18:49:32 DEBUG hbase.HRegionInfo: Current INFO from scan results = {NAME => 'test_table,,1358563771069.acc1ad1b7962564fc3a43e5907e8db33.', STARTKEY => '', ENDKEY => '19999999', ENCODED => acc1ad1b7962564fc3a43e5907e8db33,}
13/01/18 18:49:32 DEBUG hbase.HRegionInfo: Current INFO from scan results = {NAME => 'test_table,19999999,1358563771096.37ec12df6bd0078f5573565af415c91b.', STARTKEY => '19999999', ENDKEY => '33333332', ENCODED => 37ec12df6bd0078f5573565af415c91b,}
...

Nếu bạn có sẵn các điểm phân tách, bạn cũng có thể sử dụng vỏ HBase để tạo bảng với các điểm phân tách mong muốn.

hbase(main):015:0> create 'test_table', 'f1', SPLITS=> ['a', 'b', 'c']

hoặc

$ echo -e  "anbnc" >/tmp/splits
hbase(main):015:0> create 'test_table', 'f1', SPLITSFILE=>'/tmp/splits'

Để phân phối tải tối ưu, bạn nên suy nghĩ về mô hình dữ liệu của mình và phân phối chính để chọn thuật toán phân tách chính xác hoặc các điểm phân tách. Bất kể phương pháp bạn chọn để tạo bảng với số lượng vùng được xác định trước, bây giờ bạn có thể bắt đầu tải dữ liệu vào bảng và thấy rằng tải được phân phối khắp cụm của bạn. Bạn có thể cho phép phân tách tự động tiếp quản khi quá trình nhập dữ liệu bắt đầu và liên tục theo dõi tổng số vùng của bảng.

Tự động chia nhỏ

Bất kể phân tách trước có được sử dụng hay không, khi một vùng đạt đến một giới hạn nhất định, nó sẽ tự động được tách thành hai vùng. Nếu bạn đang sử dụng HBase 0.94 (đi kèm với HDP-1.2), bạn có thể định cấu hình khi nào HBase quyết định tách một vùng và cách nó tính toán các điểm phân tách thông qua API RegionSplitPolicy có thể cắm được. Có một số chính sách phân chia vùng được xác định trước:ConstantSizeRegionSplitPolicy ,isingToUpperBoundRegionSplitPolicy và KeyPrefixRegionSplitPolicy.

Chính sách đầu tiên là chính sách phân chia mặc định và duy nhất cho các phiên bản HBase trước 0.94. Nó phân chia các vùng khi tổng kích thước dữ liệu cho một trong các cửa hàng (tương ứng với một họ cột) trong vùng lớn hơn được định cấu hình “hbase.hregion.max.filesize”, có giá trị mặc định là 10GB. Chính sách phân tách này là lý tưởng trong trường hợp bạn đã thực hiện phân tách trước và quan tâm đến việc nhận được số lượng khu vực thấp hơn trên mỗi máy chủ khu vực.

Chính sách phân chia mặc định cho HBase 0.94 và trung kế là TăngToUpperBoundRegionSplitPolicy, thực hiện phân tách linh hoạt hơn dựa trên số lượng vùng được lưu trữ trong máy chủ cùng khu vực. Chính sách phân tách sử dụng kích thước tệp cửa hàng tối đa dựa trên Tối thiểu (R ^ 2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”), trong đó R là số vùng giống nhau bảng được lưu trữ trên cùng một máy chủ vùng. Vì vậy, ví dụ:với kích thước lưu trữ mặc định của memstore là 128MB và kích thước lưu trữ tối đa mặc định là 10GB, vùng đầu tiên trên máy chủ khu vực sẽ được chia ngay sau lần xả đầu tiên ở 128MB. Khi số lượng khu vực được lưu trữ trong máy chủ khu vực tăng lên, nó sẽ sử dụng kích thước phân chia ngày càng tăng:512MB, 1152MB, 2GB, 3.2GB, 4.6GB, 6.2GB, v.v. Sau khi đạt đến 9 khu vực, kích thước phân chia sẽ vượt ra ngoài “hbase đã định cấu hình .hregion.max.filesize ”, tại thời điểm đó, kích thước chia nhỏ 10GB sẽ được sử dụng kể từ đó. Đối với cả hai thuật toán này, bất kể thời điểm phân tách xảy ra, điểm phân tách được sử dụng là phím hàng tương ứng với điểm giữa trong "chỉ mục khối" cho tệp lưu trữ lớn nhất trong cửa hàng lớn nhất.

KeyPrefixRegionSplitPolicy là một bổ sung gây tò mò cho kho vũ khí HBase. Bạn có thể định cấu hình độ dài của tiền tố cho các khóa hàng của mình để nhóm chúng và chính sách phân tách này đảm bảo rằng các vùng không bị chia tách ở giữa một nhóm các hàng có cùng tiền tố. Nếu bạn đã đặt tiền tố cho khóa của mình, thì bạn có thể sử dụng chính sách tách này để đảm bảo rằng các hàng có cùng tiền tố khóa hàng luôn kết thúc trong cùng một vùng. Nhóm bản ghi này đôi khi được gọi là “Nhóm thực thể” hoặc “Nhóm hàng”. Đây là một tính năng chính khi cân nhắc sử dụng tính năng “giao dịch cục bộ” (liên kết thay thế) trong thiết kế ứng dụng của bạn.

Bạn có thể định cấu hình chính sách phân tách mặc định được sử dụng bằng cách đặt cấu hình “hbase.regionserver.region.split.policy” hoặc bằng cách định cấu hình bộ mô tả bảng. Đối với những tâm hồn dũng cảm, bạn cũng có thể triển khai chính sách phân chia tùy chỉnh của riêng mình và cắm chính sách đó vào lúc tạo bảng hoặc bằng cách sửa đổi bảng hiện có:

HTableDescriptor tableDesc = new HTableDescriptor("example-table");
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, AwesomeSplitPolicy.class.getName());
//add columns etc
admin.createTable(tableDesc);

Nếu bạn đang thực hiện chia tách trước và muốn quản lý việc phân chia vùng theo cách thủ công, bạn cũng có thể tắt tính năng tách vùng bằng cách đặt “hbase.hregion.max.filesize” thành một số cao và đặt chính sách phân tách thành ConstantSizeRegionSplitPolicy. Tuy nhiên, bạn nên sử dụng giá trị bảo vệ như 100GB để các khu vực không phát triển vượt quá khả năng của máy chủ khu vực. Bạn có thể xem xét việc tắt tính năng tách tự động và dựa vào tập hợp các vùng ban đầu từ quá trình phân tách trước, ví dụ:nếu bạn đang sử dụng hàm băm thống nhất cho các tiền tố chính của mình và bạn có thể đảm bảo rằng tải đọc / ghi cho từng vùng cũng như kích thước của nó là đồng nhất giữa các vùng trong bảng.

Buộc tách

HBase cũng cho phép khách hàng buộc tách một bảng trực tuyến từ phía khách hàng. Ví dụ:vỏ HBase có thể được sử dụng để chia tất cả các vùng của bảng hoặc tách một vùng, tùy chọn bằng cách cung cấp một điểm phân tách.

hbase(main):024:0> split 'b07d0034cbe72cb040ae9cf66300a10c', 'b'
0 row(s) in 0.1620 seconds

Với việc theo dõi cẩn thận phân phối tải HBase của bạn, nếu bạn thấy một số khu vực nhận tải không đồng đều, bạn có thể xem xét chia nhỏ các khu vực đó theo cách thủ công để chia đều tải và cải thiện thông lượng. Một lý do khác tại sao bạn có thể muốn thực hiện phân chia thủ công là khi bạn thấy rằng các phân chia ban đầu cho khu vực hóa ra là không tối ưu và bạn đã vô hiệu hóa phân chia tự động. Điều đó có thể xảy ra chẳng hạn, nếu phân phối dữ liệu thay đổi theo thời gian.

Cách thực hiện Chia tách khu vực

Khi các yêu cầu ghi được xử lý bởi máy chủ khu vực, chúng được tích lũy trong một hệ thống lưu trữ trong bộ nhớ được gọi là “memstore”. Khi memstore đầy, nội dung của nó sẽ được ghi vào đĩa dưới dạng các tệp lưu trữ bổ sung. Sự kiện này được gọi là "memstore flush". Khi các tệp lưu trữ tích lũy, Máy chủ Vùng sẽ "thu gọn" chúng thành các tệp kết hợp, lớn hơn. Sau khi mỗi lần xả hoặc nén kết thúc, một yêu cầu tách vùng sẽ được xếp hàng nếu RegionSplitPolicy quyết định rằng vùng đó nên được chia thành hai. Vì tất cả các tệp dữ liệu trong HBase là không thay đổi, nên khi sự phân tách xảy ra, các vùng con mới được tạo sẽ không ghi lại tất cả dữ liệu thành các tệp mới. Thay vào đó, chúng sẽ tạo các tệp liên kết sym-link nhỏ, có tên là tệp Tham chiếu, trỏ đến phần trên cùng hoặc dưới cùng của tệp lưu trữ mẹ tùy theo điểm phân tách. Tệp tham chiếu sẽ được sử dụng giống như tệp dữ liệu thông thường, nhưng chỉ một nửa số bản ghi. Chỉ có thể tách vùng nếu không còn tham chiếu đến các tệp dữ liệu bất biến của vùng mẹ. Các tệp tham chiếu đó được làm sạch dần dần bằng các giao dịch, do đó vùng sẽ ngừng tham chiếu đến các tệp cha của nó và có thể được chia nhỏ hơn nữa.

Mặc dù việc tách vùng là một quyết định cục bộ được thực hiện tại Máy chủ Vùng, bản thân quá trình chia tách phải phối hợp với nhiều tác nhân. Máy chủ vùng thông báo cho Master trước và sau khi tách, cập nhật .META. để khách hàng có thể khám phá các vùng con mới và sắp xếp lại cấu trúc thư mục và tệp dữ liệu trong HDFS. Chia tách là một quá trình đa nhiệm vụ. Để kích hoạt tính năng khôi phục trong trường hợp có lỗi, Máy chủ vùng lưu giữ nhật ký trong bộ nhớ về trạng thái thực thi. Các bước do Máy chủ vùng thực hiện để thực hiện tách được minh họa bằng Hình 1. Mỗi bước được gắn nhãn với số bước của nó. Các hành động từ Máy chủ vùng hoặc Máy chủ được hiển thị bằng màu đỏ, trong khi các hành động từ máy khách được hiển thị bằng màu xanh lục.

1. RegionServer quyết định cục bộ tách vùng và chuẩn bị chia. Ở bước đầu tiên, nó tạo một znode trong Zookeeper dưới tên / hbase / region-in-transfer / region-name ở trạng thái SPLITTING.
2. Master tìm hiểu về znode này, vì nó có một trình theo dõi cho znode trong vùng chuyển tiếp gốc.
3. RegionServer tạo một thư mục con có tên “.splits” trong thư mục vùng của cha mẹ trong HDFS.
4. RegionServer đóng vùng mẹ, buộc xóa bộ nhớ cache và đánh dấu vùng là ngoại tuyến trong cấu trúc dữ liệu cục bộ của nó. Tại thời điểm này, các yêu cầu máy khách đến vùng mẹ sẽ ném NotServingRegionException. Khách hàng sẽ thử lại với một số lỗi.
5. RegionServer tạo các thư mục vùng trong thư mục .splits, cho các vùng con A và B, đồng thời tạo các cấu trúc dữ liệu cần thiết. Sau đó, nó tách các tệp lưu trữ, theo nghĩa là nó tạo ra hai tệp Tham chiếu cho mỗi tệp cửa hàng trong vùng mẹ. Các tệp tham chiếu đó sẽ trỏ đến các tệp vùng mẹ.
6. RegionServer tạo thư mục vùng thực trong HDFS và di chuyển các tệp tham chiếu cho từng con gái.
7. RegionServer gửi yêu cầu Put tới .META. và đặt cha là ngoại tuyến trong .META. bảng và thêm thông tin về các vùng con gái. Tại thời điểm này, sẽ không có mục nhập riêng lẻ nào trong .META. cho các cô con gái. Khách hàng sẽ thấy khu vực mẹ bị chia nhỏ nếu họ quét .META., Nhưng sẽ không biết về các con cho đến khi chúng xuất hiện trong .META .. Ngoài ra, nếu điều này được đặt thành .META. thành công, cha mẹ sẽ được phân tách một cách hiệu quả. Nếu Máy chủ vùng không thành công trước khi RPC này thành công, Máy chủ và máy chủ vùng tiếp theo mở vùng sẽ xóa trạng thái bẩn về sự phân chia vùng. Sau khi .META. tuy nhiên, cập nhật, việc phân chia khu vực sẽ được Master chuyển tiếp.
8. RegionServer mở các con gái song song để chấp nhận ghi.
9. RegionServer thêm các con A và B vào .META. cùng với thông tin mà nó lưu trữ các khu vực. Sau thời điểm này, khách hàng có thể khám phá các khu vực mới và đưa ra yêu cầu đối với khu vực mới. Khách hàng lưu vào bộ nhớ cache .META. các mục nhập cục bộ, nhưng khi chúng đưa ra yêu cầu tới máy chủ khu vực hoặc .META., bộ đệm của chúng sẽ bị vô hiệu và chúng sẽ tìm hiểu về các vùng mới từ .META ..
10. RegionServer cập nhật znode / hbase / region-in-transfer / region-name trong zookeeper sang trạng thái SPLIT, để chủ có thể tìm hiểu về nó. Bộ cân bằng có thể tự do chỉ định lại các vùng con cho các máy chủ vùng khác nếu nó chọn như vậy.
11. Sau khi tách, meta và HDFS sẽ vẫn chứa các tham chiếu đến vùng mẹ. Các tham chiếu đó sẽ bị xóa khi các giao dịch trong các vùng con ghi lại các tệp dữ liệu. Các nhiệm vụ thu gom rác trong tổng thể kiểm tra định kỳ xem các vùng con có còn tham chiếu đến tệp cha mẹ hay không. Nếu không, vùng mẹ sẽ bị xóa.

Hợp nhất khu vực

Không giống như tách vùng, HBase ở thời điểm này không cung cấp các công cụ hữu dụng để hợp nhất các vùng. Mặc dù có các công cụ HMerge và Merge, chúng không phù hợp lắm cho việc sử dụng chung. Hiện tại không có hỗ trợ cho các bảng trực tuyến và chức năng tự động hợp nhất. Tuy nhiên, với các vấn đề như OnlineMerge, Master khởi xướng tự động hợp nhất vùng, khóa Đọc / Ghi dựa trên ZK cho các thao tác trên bảng, chúng tôi đang nỗ lực để ổn định việc phân chia vùng và hỗ trợ tốt hơn cho việc hợp nhất vùng. Hãy theo dõi!

Kết luận

Như bạn có thể thấy, HBase hoạt động ngầm thực hiện rất nhiều công việc quản lý để quản lý việc phân chia các khu vực và thực hiện phân chia tự động qua các khu vực. Tuy nhiên, HBase cũng cung cấp các công cụ cần thiết xoay quanh việc quản lý khu vực, để bạn có thể quản lý quá trình phân tách. Bạn cũng có thể kiểm soát chính xác thời điểm và cách thức phân chia vùng đang diễn ra thông qua RegionSplitPolicy.

Số lượng vùng trong bảng và cách phân chia các vùng đó là những yếu tố quan trọng trong việc hiểu và điều chỉnh tải cụm HBase của bạn. Nếu bạn có thể ước tính phân phối khóa của mình, bạn nên tạo bảng với phân tách trước để có được hiệu suất tải ban đầu tối ưu. Bạn có thể bắt đầu với số lượng máy chủ khu vực thấp hơn làm điểm khởi đầu cho số lượng khu vực ban đầu và để việc phân tách tự động tiếp quản. Nếu bạn không thể ước tính chính xác các điểm phân tách ban đầu, tốt hơn là chỉ tạo bảng với một vùng và bắt đầu một số tải ban đầu với tính năng phân tách tự động và sử dụng TăngToUpperBoundRegionSplitPolicy. Tuy nhiên, hãy nhớ rằng tổng số khu vực sẽ ổn định theo thời gian và tập hợp các điểm phân chia khu vực hiện tại sẽ được xác định từ dữ liệu mà bảng đã nhận được cho đến nay. Bạn có thể muốn theo dõi phân phối tải trên các khu vực mọi lúc và nếu phân bố tải thay đổi theo thời gian, hãy sử dụng phân chia thủ công hoặc đặt kích thước phân chia khu vực linh hoạt hơn. Cuối cùng, bạn có thể thử tính năng hợp nhất trực tuyến sắp tới và đóng góp trường hợp sử dụng của mình.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách thực hiện:Quét các bảng Apache HBase muối với các phạm vi chính theo khu vực cụ thể trong MapReduce

  2. Hadoop - Hướng dẫn Apache Hadoop cho người mới bắt đầu

  3. tạo nhanh một bảng hbase mẫu

  4. Các khái niệm phát triển ứng dụng Cơ sở dữ liệu hoạt động Cloudera

  5. MapReduce Shuffling và Sắp xếp trong Hadoop