6.1 Ai đã phát minh ra HBase và tại sao

Trong bài giảng này, chúng ta sẽ nói về một công cụ tuyệt vời như Hbase, gần đây đã trở nên rất phổ biến: ví dụ: Facebook sử dụng nó làm nền tảng cho hệ thống nhắn tin của mình và điều này đã nói lên rất nhiều điều.

Bài giảng sẽ nói về khái niệm Big Table và cách triển khai miễn phí của nó, các tính năng hoạt động và sự khác biệt so với cả cơ sở dữ liệu quan hệ cổ điển (như MySQL và Oracle) và kho lưu trữ khóa-giá trị như Redis, Aerospike và memcached. Như thường lệ, hãy bắt đầu với lịch sử của vấn đề. Giống như nhiều dự án BigData khác, Hbase được sinh ra từ một khái niệm được phát triển bởi Google. Các nguyên tắc đằng sau Hbase đã được mô tả trong bài viết Bigtable: Hệ thống lưu trữ phân tán cho dữ liệu có cấu trúc .

Như chúng ta đã thảo luận trong các bài giảng trước, các tệp thông thường khá phù hợp để xử lý dữ liệu hàng loạt bằng cách sử dụng mô hình MapReduce. Mặt khác, thông tin được lưu trữ trong các tệp khá bất tiện khi cập nhật; Các tệp cũng bị tước khả năng truy cập ngẫu nhiên. Để làm việc nhanh chóng và thuận tiện với quyền truy cập ngẫu nhiên, có một loại hệ thống nosql như lưu trữ khóa-giá trị, chẳng hạn như Aerospike, Redis, Couchbase, Memcached. Tuy nhiên, xử lý hàng loạt thường rất bất tiện trong các hệ thống này. Hbase là một nỗ lực để kết hợp sự tiện lợi của xử lý hàng loạt với sự tiện lợi của việc cập nhật và truy cập ngẫu nhiên.

6.2 Mô hình dữ liệu

HBase là cơ sở dữ liệu khóa-giá trị đa phiên bản, định hướng cột, phân tán.

  • Dữ liệu được sắp xếp thành các bảng được lập chỉ mục bởi khóa chính có tên là RowKey trong Hbase.
  • Đối với mỗi khóa RowKey, có thể lưu trữ một bộ thuộc tính (hoặc cột) không giới hạn.
  • Các cột được tổ chức thành các nhóm cột được gọi là Cột họ. Theo quy định, các cột có cùng kiểu sử dụng và lưu trữ được kết hợp thành một Họ cột.
  • Đối với mỗi thuộc tính, một số phiên bản khác nhau có thể được lưu trữ. Các phiên bản khác nhau có dấu thời gian khác nhau.

Các bản ghi được lưu trữ vật lý theo thứ tự được sắp xếp theo RowKey. Trong trường hợp này, dữ liệu tương ứng với các họ cột khác nhau được lưu trữ riêng biệt, điều này cho phép, nếu cần, chỉ đọc dữ liệu từ họ cột mong muốn.

Khi một thuộc tính nhất định bị xóa, nó không bị xóa ngay lập tức mà chỉ được đánh dấu bằng một lá cờ bia mộ đặc biệt. Việc xóa vật lý dữ liệu sẽ xảy ra sau đó, khi thao tác nén chính được thực hiện.

Các thuộc tính thuộc cùng một nhóm cột và tương ứng với cùng một khóa được lưu trữ vật lý dưới dạng danh sách được sắp xếp. Bất kỳ thuộc tính nào cũng có thể vắng mặt hoặc có mặt cho mỗi khóa và nếu thuộc tính không có, điều này không gây ra chi phí lưu trữ các giá trị trống.

Tên nhóm danh sách và cột cố định và có bố cục rõ ràng. Ở cấp độ nhóm cột, các tham số như thời gian tồn tại (TTL) và số lượng phiên bản được lưu trữ tối đa được đặt. Nếu sự khác biệt giữa dấu thời gian cho một phiên bản cụ thể và thời gian hiện tại lớn hơn TTL, mục nhập được đánh dấu để xóa. Nếu số phiên bản cho một thuộc tính nhất định vượt quá số phiên bản tối đa, bản ghi cũng được đánh dấu để xóa.

Mô hình dữ liệu Hbase có thể được ghi nhớ dưới dạng đối sánh khóa-giá trị:

<table, RowKey, Column Family, Column, timestamp> -> Value

6.3 Hoạt động được hỗ trợ

Danh sách các hoạt động được hỗ trợ trong hbase khá đơn giản. 4 hoạt động chính được hỗ trợ:

  • Đặt : thêm một mục mới vào hbase. Dấu thời gian của mục nhập này có thể được đặt bằng tay, nếu không, dấu thời gian sẽ được đặt tự động thành thời gian hiện tại.
  • Nhận : Nhận dữ liệu cho một RowKey cụ thể. Bạn có thể chỉ định Họ Cột mà từ đó chúng tôi sẽ lấy dữ liệu và số lượng phiên bản mà chúng tôi muốn đọc.
  • Quét : đọc từng bản ghi một. Bạn có thể chỉ định bản ghi mà chúng tôi bắt đầu đọc, bản ghi sẽ đọc, số lượng bản ghi sẽ được đọc, Họ Cột mà việc đọc sẽ được thực hiện từ đó và số lượng phiên bản tối đa cho mỗi bản ghi.
  • Xóa : Đánh dấu một phiên bản cụ thể để xóa. Sẽ không có việc xóa vật lý, nó sẽ bị hoãn lại cho đến Cuộc nén lớn tiếp theo (xem bên dưới).

6.4 Kiến trúc

HBase là một cơ sở dữ liệu phân tán có thể chạy trên hàng chục hoặc hàng trăm máy chủ vật lý, đảm bảo hoạt động không bị gián đoạn ngay cả khi một số máy chủ bị lỗi. Do đó, kiến ​​trúc của HBase khá phức tạp so với cơ sở dữ liệu quan hệ cổ điển.

HBase sử dụng hai quy trình chính cho công việc của mình:

1. Máy chủ khu vực - Phục vụ một hoặc nhiều khu vực. Vùng là một phạm vi bản ghi tương ứng với một phạm vi RowKeys liên tiếp cụ thể. Mỗi khu vực chứa:

  • Persistent Storage là nơi lưu trữ dữ liệu chính trong HBase. Dữ liệu được lưu trữ vật lý trên HDFS, ở định dạng HFile đặc biệt. Dữ liệu trong HFile được lưu trữ theo thứ tự sắp xếp RowKey. Một cặp (vùng, họ cột) tương ứng với ít nhất một HFIle.
  • MemStore - ghi bộ đệm. Vì dữ liệu được lưu trữ trong HFile d theo thứ tự được sắp xếp nên việc cập nhật HFile trên mỗi bản ghi là khá tốn kém. Thay vào đó, khi ghi, dữ liệu sẽ đi vào vùng bộ nhớ MemStore đặc biệt, nơi dữ liệu được tích lũy trong một thời gian. Khi MemStore được điền vào một số giá trị quan trọng, dữ liệu được ghi vào một HFile mới.
  • BlockCache - bộ đệm để đọc. Cho phép bạn tiết kiệm đáng kể thời gian cho dữ liệu được đọc thường xuyên.
  • Nhật ký ghi trước (WAL) . Vì dữ liệu được ghi vào memstore nên có một số nguy cơ mất dữ liệu do sự cố. Để ngăn điều này xảy ra, tất cả các hoạt động trước khi thực hiện các thao tác thực tế đều nằm trong một tệp nhật ký đặc biệt. Điều này cho phép bạn khôi phục dữ liệu sau bất kỳ lỗi nào.

2. Master Server - máy chủ chính trong cụm HBase. Master quản lý việc phân phối các khu vực giữa các Máy chủ khu vực, duy trì sổ đăng ký các khu vực, quản lý khởi chạy các tác vụ thông thường và thực hiện các công việc hữu ích khác.

Để phối hợp hành động giữa các dịch vụ, HBase sử dụng Apache ZooKeeper, một dịch vụ đặc biệt được thiết kế để quản lý cấu hình và đồng bộ hóa dịch vụ.

Khi lượng dữ liệu trong vùng tăng lên và đạt đến một kích thước nhất định, Hbase bắt đầu phân tách, một thao tác chia vùng thành 2. Để tránh phân chia vùng liên tục, bạn có thể đặt trước ranh giới của các vùng và tăng mức tối đa của chúng kích cỡ.

Vì dữ liệu cho một vùng có thể được lưu trữ trong một số HFiles, Hbase định kỳ hợp nhất chúng lại với nhau để tăng tốc công việc. Hoạt động này được gọi là nén trong Hbase. Nén có hai loại:

  • đầm nén nhỏ . Bắt đầu tự động, chạy trong nền. Có mức độ ưu tiên thấp so với các hoạt động Hbase khác.
  • đầm chính . Nó được khởi chạy bằng tay hoặc khi xuất hiện một số trình kích hoạt nhất định (ví dụ: bằng bộ đếm thời gian). Nó có mức độ ưu tiên cao và có thể làm chậm cụm đáng kể. Việc nén chính được thực hiện tốt nhất vào thời điểm khi tải trên cụm nhỏ. Major Compaction cũng xóa dữ liệu được đánh dấu trước đó bằng bia mộ.

6.5 Các cách làm việc với HBase

Vỏ HBase

Cách dễ nhất để bắt đầu với Hbase là sử dụng tiện ích shell hbase. Nó khả dụng ngay sau khi cài đặt hbase trên bất kỳ nút cụm hbase nào.

Hbase shell là một bảng điều khiển jruby có hỗ trợ tích hợp cho tất cả các hoạt động cơ bản của Hbase. Sau đây là một ví dụ về việc tạo bảng người dùng có hai họ cột, thực hiện một số thao tác trên bảng đó và thả bảng ở cuối vào trình bao hbase:

create 'users', {NAME => 'user_profile', VERSIONS => 5}, {NAME => 'user_posts', VERSIONS => 1231231231} 
put 'users', 'id1', 'user_profile:name', 'alexander' 
put 'users', 'id1', 'user_profile:second_name', 'alexander' 
get 'users', 'id1' 
put 'users', 'id1', 'user_profile:second_name', 'kuznetsov' 
get 'users', 'id1' 
get 'users', 'id1', {COLUMN => 'user_profile:second_name', VERSIONS => 5} 
put 'users', 'id2', 'user_profile:name', 'vasiliy' 
put 'users', 'id2', 'user_profile:second_name', 'ivanov' 
scan 'users', {COLUMN => 'user_profile:second_name', VERSIONS => 5} 
delete 'users', 'id1', 'user_profile:second_name' 
get 'users', 'id1' 
disable 'users' 
drop 'users'

API gốc

Giống như hầu hết các dự án liên quan đến hadoop khác, hbase được triển khai trong java, vì vậy api gốc có sẵn trong Java. API gốc được ghi lại khá đầy đủ trên trang web chính thức. Đây là một ví dụ về việc sử dụng API Hbase được lấy từ đó:

import java.io.IOException;

import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class MyLittleHBaseClient {
  public static void main(String[] args) throws IOException {
	Configuration config = HBaseConfiguration.create();
	Connection connection = ConnectionFactory.createConnection(config);
	try {
  	Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));
  	try {
    	Put p = new Put(Bytes.toBytes("myLittleRow"));
    	p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
    	Bytes.toBytes("Some Value"));
    	table.put(p);

    	Get g = new Get(Bytes.toBytes("myLittleRow"));
    	Result r = table.get(g);
    	byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
      	Bytes.toBytes("someQualifier"));

    	String valueStr = Bytes.toString(value);
    	System.out.println("GET: " + valueStr);

    	Scan s = new Scan();
    	s.addColumn(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"));
    	ResultScanner scanner = table.getScanner(s);
    	try {
       	for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
         	System.out.println("Found row: " + rr);
       	}
     	} finally {
       	scanner.close();
     	}
   	} finally {
     	if (table != null) table.close();
   	}
 	} finally {
   	connection.close();
 	}
  }
}

Thrift, REST và hỗ trợ cho các ngôn ngữ lập trình khác

Để làm việc với các ngôn ngữ lập trình khác, Hbase cung cấp Thrift API và Rest API. Dựa trên chúng, các ứng dụng khách được xây dựng cho tất cả các ngôn ngữ lập trình chính: python, PHP, Java Script, v.v.

6.6 Một số tính năng làm việc với HBase

  1. Hbase tích hợp sẵn với MapReduce và có thể được sử dụng làm đầu vào và đầu ra bằng cách sử dụng TableInputFormat và TableOutputFormat đặc biệt.

  2. Điều rất quan trọng là chọn đúng RowKey. RowKey phải cung cấp khả năng phân phối đồng đều tốt giữa các vùng, nếu không sẽ có nguy cơ xảy ra cái gọi là "vùng nóng" - những vùng được sử dụng thường xuyên hơn nhiều so với các vùng khác, dẫn đến việc sử dụng tài nguyên hệ thống không hiệu quả.

  3. Nếu dữ liệu không được tải lên đơn lẻ mà ngay lập tức theo lô lớn, Hbase hỗ trợ cơ chế Tải hàng loạt đặc biệt cho phép bạn tải dữ liệu lên nhanh hơn nhiều so với sử dụng các Đặt đơn lẻ. BulkLoad về cơ bản là một hoạt động gồm hai bước:

    • Hình thành HFile mà không có sự tham gia của các lệnh sử dụng công việc MapReduce đặc biệt
    • Chèn các tệp này trực tiếp vào Hbase
  4. Hbase hỗ trợ xuất các số liệu của nó tới máy chủ giám sát Ganglia. Điều này có thể rất hữu ích khi quản trị Hbase để tìm hiểu tận cùng các vấn đề về hbase.

phím hàng

RowKey là ID người dùng, là GUUID, một chuỗi được tạo đặc biệt để trở thành duy nhất trên toàn thế giới. GUUID được phân phối đồng đều, giúp phân phối dữ liệu tốt trên các máy chủ.

họ cột

Bộ nhớ của chúng tôi sử dụng hai họ cột:

  • dữ liệu. Nhóm cột này lưu trữ dữ liệu không còn phù hợp cho mục đích quảng cáo, chẳng hạn như việc người dùng đã truy cập một số URL nhất định. TTL cho họ Cột này được đặt thành 2 tháng, giới hạn về số lượng phiên bản là 2000.
  • longdata. Nhóm cột này lưu trữ dữ liệu không mất đi tính liên quan theo thời gian, chẳng hạn như giới tính, ngày sinh và các đặc điểm người dùng “vĩnh viễn” khác.

diễn giả

Mỗi loại thông tin người dùng được lưu trữ trong một cột riêng biệt. Ví dụ: cột Data:_v lưu trữ các URL mà người dùng đã truy cập và cột LongData:gender lưu trữ giới tính của người dùng.

Dấu thời gian của thực tế này được lưu trữ dưới dạng dấu thời gian. Ví dụ: trong cột Dữ liệu:_v, dấu thời gian là thời gian người dùng đã truy cập một URL cụ thể.

Cấu trúc lưu trữ dữ liệu người dùng này rất phù hợp với mô hình sử dụng của chúng tôi và cho phép bạn nhanh chóng cập nhật dữ liệu người dùng, nhanh chóng lấy tất cả thông tin cần thiết về người dùng và sử dụng MapReduce để nhanh chóng xử lý dữ liệu về tất cả người dùng cùng một lúc.

6.7 Lựa chọn thay thế

HBase khá phức tạp để quản lý và sử dụng, vì vậy trước khi sử dụng HBase, bạn nên xem xét các lựa chọn thay thế:

  • Cơ sở dữ liệu quan hệ . Một giải pháp thay thế rất tốt, đặc biệt là trong trường hợp dữ liệu vừa với một máy. Ngoài ra, trước hết, bạn nên nghĩ về cơ sở dữ liệu quan hệ trong trường hợp giao dịch của các chỉ mục khác với chỉ mục chính là quan trọng.

  • Lưu trữ khóa-giá trị . Các kho lưu trữ như Redis và Aerospike phù hợp hơn khi cần độ trễ và xử lý hàng loạt ít quan trọng hơn.

  • Các tệp và quá trình xử lý của chúng với MapReduce . Nếu dữ liệu chỉ được thêm vào và hiếm khi được cập nhật/thay đổi thì tốt hơn hết là không nên sử dụng HBase mà chỉ cần lưu trữ dữ liệu trong các tệp. Để đơn giản hóa công việc với các tệp, bạn có thể sử dụng các công cụ như Hive, Pig và Impala.

Việc sử dụng HBase là hợp lý khi:

  • Có rất nhiều dữ liệu và chúng không vừa trên một máy tính / máy chủ
  • Dữ liệu thường xuyên được cập nhật và xóa
  • Có một "chìa khóa" rõ ràng trong dữ liệu, thuận tiện để liên kết mọi thứ khác
  • Cần xử lý hàng loạt
  • Cần truy cập ngẫu nhiên vào dữ liệu bằng các khóa cụ thể