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

Sử dụng Hive để tương tác với HBase, Phần 1

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.

Đây là bài viết đầu tiên trong số hai bài đăng kiểm tra việc sử dụng Hive để tương tác với các bảng HBase. Bài thứ hai ở đây.

Một trong những điều tôi thường xuyên được hỏi là cách sử dụng HBase từ Apache Hive. Không chỉ là làm thế nào để làm điều đó, mà là những gì hoạt động, nó hoạt động tốt như thế nào và làm thế nào để tận dụng nó hiệu quả. Tôi đã thực hiện một chút nghiên cứu trong lĩnh vực này, vì vậy hy vọng điều này sẽ hữu ích cho ai đó ngoài bản thân tôi. Đây là chủ đề mà chúng tôi không đề cập đến trong HBase in Action, có lẽ những ghi chú này sẽ trở thành cơ sở cho ấn bản thứ 2 😉 Những ghi chú này có thể áp dụng cho Hive 0.11.x được sử dụng cùng với HBase 0.94.x. Chúng phải được áp dụng phần lớn cho 0,12.x + 0,96.x, mặc dù tôi chưa thử nghiệm mọi thứ.

Dự án tổ ong bao gồm một thư viện tùy chọn để tương tác với HBase. Đây là nơi thực hiện lớp cầu nối giữa hai hệ thống. Giao diện chính mà bạn sử dụng khi truy cập HBase từ các truy vấn Hive được gọi là BaseStorageHandler . Bạn cũng có thể tương tác trực tiếp với bảng HBase thông qua các định dạng Đầu vào và Đầu ra, nhưng trình xử lý đơn giản hơn và hoạt động cho hầu hết các mục đích sử dụng.

Bảng HBase từ Hive

Sử dụng HBaseStorageHandler để đăng ký các bảng HBase với Hive di căn. Bạn có thể tùy chọn chỉ định bảng HBase là EXTERNAL , trong trường hợp đó Hive sẽ không tạo bảng đó trực tiếp - bạn sẽ phải sử dụng trình bao HBase để làm như vậy.

[sql]
TẠO BẢNG [NGOÀI] foo (…)
ĐƯỢC LƯU TRỮ BỞI 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
TBLPROPERTIES ('hbase.table.name' =' thanh ');
[/ sql]

Câu lệnh trên đăng ký bảng HBase có tên bar trong di căn Hive, có thể truy cập từ Hive bằng tên foo .

Dưới mui xe, HBaseStorageHandler đang ủy quyền tương tác với bảng HBase cho
HiveHBaseTableInputFormatHiveHBaseTableOutputFormat . Bạn có thể đăng ký bảng HBase của mình trong Hive bằng cách sử dụng các lớp đó trực tiếp nếu bạn muốn. Câu lệnh trên gần tương đương với:

[sql]
TẠO BẢNG foo (…)
ĐƯỢC LƯU TRỮ NHƯ
INPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHBaseTableInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive .hbase.HiveHBaseTableOutputFormat '
TBLPROPERTIES (' hbase.table.name '=' bar ');
[/ sql]

Cũng được cung cấp là HiveHFileOutputFormat có nghĩa là cũng có thể tạo HFiles để tải hàng loạt từ Hive. Trên thực tế, tôi không muốn điều này hoạt động từ đầu đến cuối (xem HIVE-4627).

Ánh xạ giản đồ

Đăng ký bảng chỉ là bước đầu tiên. Là một phần của đăng ký đó, bạn cũng cần chỉ định ánh xạ cột. Đây là cách bạn liên kết tên cột Hive với khóa hàng và cột của bảng HBase. Làm như vậy bằng cách sử dụng hbase.columns.mapping Thuộc tính SerDe.

[sql]
TẠO BẢNG foo (phím hàng STRING, a STRING, b STRING)
ĐƯỢC LƯU TRỮ BỞI 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
VỚI SERDEPROPERTIES ('hbase.columns .mapping '=':key, f:c1, f:c2 ')
TBLPROPERTIES (' hbase.table.name '=' bar ');

[/ sql]

Các giá trị được cung cấp trong thuộc tính ánh xạ tương ứng một đối một với các tên cột của bảng hive. Tên cột HBase hoàn toàn đủ điều kiện theo họ cột và bạn sử dụng mã thông báo đặc biệt :key đại diện cho phím hàng. Ở trên

ví dụ tạo các hàng từ bảng HBase bar có sẵn qua bảng Hive foo . foo cột rowkey ánh xạ tới phím hàng của bảng HBase, a thành c1 trong f họ cột và b thành c2 , cũng trong f gia đình.

Bạn cũng có thể liên kết MAP của Hive cấu trúc dữ liệu cho họ cột HBase. Trong trường hợp này, chỉ STRING Loại Hive được sử dụng. Loại Hive khác hiện được hỗ trợ là BINARY . Xem trang wiki để biết thêm ví dụ.

Tương tác với dữ liệu

Với các ánh xạ cột được xác định, bây giờ bạn có thể truy cập dữ liệu HBase giống như bạn làm với bất kỳ dữ liệu Hive nào khác. Hiện chỉ hỗ trợ các vị từ truy vấn đơn giản.

[sql]
CHỌN * TỪ foo WHERE…;
[/ sql]

Bạn cũng có thể điền và bảng HBase bằng Hive. Điều này hoạt động với cả INTOOVERWRITE mệnh đề.

[sql]
TỪ source_hive_table CHÈN VÀO BẢNG my_hbase_table
CHỌN source_hive_table. * WHERE…;
[/ sql]

Lưu ý rằng có một hồi quy trong Hive 0.12.0 phá vỡ tính năng này, xem HIVE-5515.

Trên thực tế

Vẫn cần một chút khéo léo để mọi thứ được kết nối đúng cách trong thời gian chạy. Mô-đun tương tác HBase là hoàn toàn tùy chọn, vì vậy bạn phải đảm bảo mô-đun này và các phần phụ thuộc của HBase có sẵn trên classpath của Hive.

[bash]
$ export HADOOP_CLASSPATH =…
$ hive -e “TẠO BẢNG… ĐƯỢC LƯU TRỮ BỞI‘ org.apache… HBaseStorageHandler '”
[/ bash]

Môi trường cài đặt có thể thực hiện tốt hơn việc xử lý vấn đề này cho người dùng, nhưng hiện tại bạn phải tự quản lý nó. Lý tưởng nhất là hive bin script có thể phát hiện sự hiện diện của HBase và tự động tạo CLASSPATH cần thiết các điều chỉnh. Cải tiến này dường như đã được theo dõi trong HIVE-2055. Dặm cuối cùng được cung cấp bởi chính bản phân phối, đảm bảo các biến môi trường được đặt cho hive . Chức năng này được cung cấp bởi BIGTOP-955.

Bạn cũng cần đảm bảo rằng các lọ cần thiết được chuyển đến các công việc MapReduce khi bạn thực hiện các câu lệnh Hive của mình. Hive cung cấp một cơ chế để vận chuyển các công việc phụ thuộc bổ sung thông qua tính năng auxjars.

[bash]
$ export HIVE_AUX_JARS_PATH =…
$ hive -e “CHỌN * TỪ…”
[/ bash]

Tôi đã phát hiện ra một lỗi nhỏ trong các bản dựng HDP-1.3 che các giá trị do người dùng chỉ định của HIVE_AUX_JARS_PATH . Với quyền quản trị, điều này có thể dễ dàng khắc phục bằng cách sửa dòng trong hive-env.sh tôn trọng một giá trị hiện có. Công việc
xung quanh trong tập lệnh người dùng là sử dụng SET để cung cấp giá trị sau khi bạn khởi chạy Hive CLI.

[bash]
SET hive.aux.jars.path =…
[/ bash]

Hive sẽ có thể phát hiện ra những lọ nào cần thiết và tự thêm chúng vào. HBase cung cấp TableMapReduceUtils#addDependencyJars  các phương pháp cho mục đích này. Có vẻ như điều này được thực hiện trong hive-0.12.0, ít nhất là theo HIVE-2379.

Công việc trong tương lai

Người ta đã nói nhiều về việc hỗ trợ thích hợp cho việc đẩy lùi vị từ (HIVE-1643, HIVE-2854, HIVE-3617,
HIVE-3684) và nhận thức về loại dữ liệu (HIVE-1245, HIVE-2599). Những điều này đi đôi với nhau vì ngữ nghĩa vị từ được xác định theo kiểu mà chúng hoạt động. Có thể làm nhiều việc hơn nữa để ánh xạ các loại dữ liệu phức tạp của Hive như Bản đồ và Cấu trúc vào các họ cột HBase (HIVE-3211). Hỗ trợ cho dấu thời gian HBase hơi rắc rối; chúng không được cung cấp cho các ứng dụng Hive với bất kỳ mức độ chi tiết nào (HIVE-2828, HIVE-2306). Tương tác duy nhất mà người dùng có là thông qua cài đặt trình xử lý bộ nhớ để viết dấu thời gian tùy chỉnh với tất cả các hoạt động.

Từ góc độ hiệu suất, có những điều Hive có thể làm ngày nay (tức là không phụ thuộc vào kiểu dữ liệu) để tận dụng lợi thế của HBase. Ngoài ra còn có khả năng Hive nhận biết HBase sử dụng các bảng HBase làm vị trí lưu trữ trung gian (HIVE-3565), tạo điều kiện thuận lợi cho việc kết hợp phía bản đồ với các bảng thứ nguyên được tải vào HBase. Hive có thể tận dụng cấu trúc được lập chỉ mục tự nhiên của HBase (HIVE-3634, HIVE-3727), có khả năng tiết kiệm được các bản quét khổng lồ. Hiện tại, người dùng không có (bất kỳ?) Quyền kiểm soát nào đối với các bản quét được thực hiện. Nên bật cấu hình theo công việc hoặc ít nhất là trên mỗi bảng (HIVE-1233). Điều đó sẽ cho phép người dùng hiểu biết về HBase cung cấp cho Hive những gợi ý về cách nó sẽ tương tác với HBase. Cũng có thể dễ dàng thực hiện hỗ trợ lấy mẫu phân tách đơn giản của các bảng HBase (HIVE-3399) vì HBase đã quản lý các phân vùng bảng.

Các kênh truy cập khác

Mọi thứ được thảo luận cho đến nay đều yêu cầu Hive phải tương tác với các Máy chủ Vùng HBase trực tuyến. Các ứng dụng có thể đạt được thông lượng đáng kể và tận hưởng tính linh hoạt cao hơn bằng cách tương tác trực tiếp với dữ liệu HBase được duy trì ở HDFS. Điều này cũng có lợi ích là ngăn khối lượng công việc Hive can thiệp vào các ứng dụng HBase trực tuyến ràng buộc SLA (ít nhất, cho đến khi chúng tôi thấy các cải tiến của HBase trong việc cách ly QOS giữa các tác vụ, HBASE-4441).

Như đã đề cập trước đó, có HiveHFileOutputFormat . Việc phân giải HIVE-4627 sẽ giúp Hive trở thành một cách dễ dàng để tạo HFiles để tải hàng loạt. Sau khi bạn đã tạo HFiles bằng Hive, vẫn còn bước cuối cùng là chạy
LoadIncrementalHFiles tiện ích để sao chép và đăng ký chúng trong các khu vực. Đối với điều này, HiveStorageHandler  giao diện sẽ cần một số loại móc để tác động đến kế hoạch truy vấn khi nó được tạo, cho phép nó thêm các bước. Khi đã đặt xong, có thể SET cờ thời gian chạy, chuyển đổi INSERT  hoạt động để sử dụng khối lượng lớn.

HBase gần đây đã giới thiệu tính năng chụp nhanh bảng. Điều này cho phép người dùng tạo chế độ xem bảng theo thời gian liên tục, được duy trì ở HDFS. HBase có thể khôi phục bảng từ ảnh chụp nhanh về trạng thái trước đó và tạo một bảng hoàn toàn mới từ ảnh chụp nhanh hiện có. Hive hiện không hỗ trợ đọc từ ảnh chụp nhanh HBase. Đối với vấn đề đó, HBase chưa hỗ trợ các công việc MapReduce qua ảnh chụp nhanh, mặc dù tính năng này đang được tiến hành (HBASE-8369).

Kết luận

Giao diện giữa HBase và Hive còn non trẻ, nhưng có tiềm năng tốt. Bạn có thể nhặt rất nhiều trái cây ở tầm thấp để giúp mọi việc trở nên dễ dàng và nhanh chóng hơn. Vấn đề rõ ràng nhất cản trở việc phát triển ứng dụng thực là sự không khớp về trở kháng giữa lược đồ dày đặc, được định kiểu của Hive và lược đồ không được định kiểu, thưa thớt của HBase. Đây cũng là một vấn đề về nhận thức giống như vấn đề kỹ thuật. Các giải pháp ở đây sẽ cho phép một số cải tiến được đưa ra, bao gồm nhiều cải tiến về mặt hiệu suất. Tôi hy vọng rằng việc tiếp tục thêm các loại dữ liệu vào HBase (HBASE-8089) có thể giúp thu hẹp khoảng cách này.

Các hoạt động cơ bản hầu hết đều hoạt động, ít nhất là theo một cách thô sơ. Bạn có thể đọc dữ liệu ra và ghi dữ liệu trở lại HBase bằng Hive. Định cấu hình môi trường là một quy trình thủ công và không rõ ràng, một quy trình có thể khiến người mới sử dụng các công cụ này khó chịu. Ngoài ra còn có câu hỏi về các hoạt động hàng loạt - hỗ trợ viết HFiles và đọc ảnh chụp nhanh HBase bằng Hive hoàn toàn thiếu tại thời điểm này. Và tất nhiên, có những lỗi rắc khắp. Cải tiến lớn nhất gần đây là việc ngừng sử dụng giao diện của HCatalog, loại bỏ quyết định trả trước cần thiết về việc sử dụng giao diện nào.

Hive cung cấp một giao diện SQL rất hữu dụng trên HBase, một giao diện tích hợp dễ dàng vào nhiều quy trình làm việc ETL hiện có. Giao diện đó yêu cầu đơn giản hóa một số ngữ nghĩa của BigTable mà HBase cung cấp, nhưng kết quả là HBase sẽ mở ra cho nhiều đối tượng người dùng hơn. Interop Hive khen ngợi rất tốt trải nghiệm do Phoenix cung cấp. Hive có lợi ích là không yêu cầu sự phức tạp khi triển khai hiện được yêu cầu bởi hệ thống đó. Hy vọng rằng định nghĩa chung về các loại sẽ cho phép một tương lai bổ sung.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chuyển đổi kỹ thuật số là một hành trình dữ liệu từ Edge đến Insight

  2. Đưa hỗ trợ giao dịch vào Cơ sở dữ liệu hoạt động của Cloudera

  3. Sử dụng Hive để tương tác với HBase, Phần 1

  4. Lớp giảm tốc Hadoop trong MapReduce là gì?

  5. Giao dịch HBase là gì?