Tích hợp Hive với HBase để truy vấn dữ liệu qua HiveQL

Giới thiệu

HBase phù hợp để lưu trữ khối lượng dữ liệu rất lớn và cung cấp truy cập ngẫu nhiên theo rowkey với độ trễ thấp. Tuy nhiên, khả năng truy vấn của HBase khá hạn chế khi cần phân tích đa chiều, lọc theo nhiều điều kiện hay thực hiện các phép tính tổng hợp.

Hive mang đến giao diện HiveQL gần với SQL, cho phép chạy các tác vụ phân tích batch trên nền MapReduce, Tez hoặc Spark. Khi kết hp hai hệ thống này, ta có thể dùng HiveQL để phân tích dữ liệu đang được lưu trong HBase mà không cần di chuyển dữ liệu.

Cơ chế kết nối giữa Hive và HBase

Hive giao tiếp với HBase qua các API chuẩn thông qua lớp trung gian hive-hbase-handler-<version>.jar. Thành phần then chốt là HBaseStorageHandler, giúp Hive xác định:

  • Tên bảng HBase tương ứng.
  • Các column family và cột cần ánh xạ.
  • Các lớp InputFormatOutputFormat.
  • Thao tác tạo hoặc xóa bảng HBase nếu cần.

Khi đọc dữ liệu, Hive thực chất khởi chạy một MapReduce job sử dụng HiveHBaseTableInputFormat. Mỗi region của bảng HBase tương ứng với một split, do đó số lượng map task thường bằng số region. Dữ liệu được lấy qua Scanner với RPC tới RegionServer. Nếu câu truy vấn có điều kiện lọc, Hive sẽ cố gắng chuyển đổi thành Filter của HBase; khi điều kiện nằm trên rowkey, nó được biến đổi thành bộ lọc theo rowkey để giảm lượng dữ liệu quét.

Các bước tích hợp

1. Chuẩn bị bảng và dữ liệu trong HBase

Giả sử ta có bảng HBase tên users với column family profile chứa hai cột aliasemail:

create 'users', 'profile'

put 'users','u001','profile:alias','Alice'
put 'users','u001','profile:email','alice@example.com'
put 'users','u002','profile:alias','Bob'
put 'users','u002','profile:email','bob@example.com'
put 'users','u003','profile:alias','Carol'
put 'users','u003','profile:email','carol@example.com'

2. Tạo bảng Hive ánh xạ tới HBase

Trên Hive, cấu hình ZooKeeper của HBase và thêm handler tương ứng, sau đó tạo bảng external để ánh xạ tới bảng HBase vừa tạo:

SET hbase.zookeeper.quorum=zk1.example.com,zk2.example.com,zk3.example.com;
SET zookeeper.znode.parent=/hbase;

ADD JAR /usr/lib/hive/lib/hive-hbase-handler-<version>.jar;

CREATE EXTERNAL TABLE dim_users (
  user_id STRING,
  nickname STRING,
  email STRING
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
  "hbase.columns.mapping" = ":key,profile:alias,profile:email"
)
TBLPROPERTIES (
  "hbase.table.name" = "users"
);

Lưu ý rng sử dụng EXTERNAL TABLE s chỉ ánh xạ dữ liệu; khi xóa bảng Hive, bảng HBase vẫn được giữ nguyên. Nếu tạo bảng managed, xóa bảng Hive sẽ kéo theo xóa cả bảng HBase.

Ý ngha các tham số chính:

  • hbase.zookeeper.quorum: danh sách máy chủ ZooKeeper mà HBase sử dụng, mặc định cổng 2181.
  • zookeeper.znode.parent: đường dẫn gốc của HBase trong ZooKeeper, thường là /hbase.
  • hbase.columns.mapping: ánh xạ tng cột Hive sang cột HBase; :key tương ứng với rowkey.
  • hbase.table.name: tên bảng HBase cần liên kết.

Bên cạnh ánh xạ cột đơn, các cột còn lại ngoài rowkey cũng có thể lưu dưi dạng MAP<STRING,STRING> để biểu diễn toàn bộ các cột trong một column family.

3. Truy vấn và ghi dữ liệu

Sau khi tạo bảng, truy vấn HiveQL hoạt động như với bảng thông thường:

SELECT * FROM dim_users;

Kết quả ví dụ:

u001    Alice    alice@example.com
u002    Bob      bob@example.com
u003    Carol    carol@example.com

Để thêm dòng mới vào HBase từ Hive:

INSERT INTO TABLE dim_users VALUES ('u004', 'Dave', 'dave@example.com');

Kiểm tra lại trên Hive hoặc trực tiếp trên HBase đều sẽ thấy dòng dữ liệu vừa chèn.

Tăng tốc truy vấn với Spark SQL

Mặc định, Hive đọc HBase qua MapReduce, thường không hiệu quả với truy vấn tương tác hoặc phân tích cần nhiều vòng lặp. Một cách cải thiện là sử dụng Spark SQL đọc trực tiếp bảng Hive đã ánh xạ tới HBase, tận dụng tối ưu hóa của Spark:

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
  .appName("ReadHBaseViaHive")
  .enableHiveSupport()
  .getOrCreate()

val df = spark.sql("""
  SELECT user_id, nickname, email
  FROM default.dim_users
  WHERE user_id < 'u010'
""")

df.show()

Tùy vào kịch bản, có thể chọn Spark SQL trên bảng Hive hoặc dùng trực tiếp thư viện spark-hbase-connector để kiểm soát chi tiết hơn quá trình đọc/ghi HBase.

Thẻ: hive hbase HBaseStorageHandler zookeeper Spark SQL

Đăng vào ngày 1 tháng 8 lúc 08:46