Có nhiều cách khác nhau để truy cập và tương tác với Apache HBase. Đáng chú ý nhất, Java API cung cấp nhiều chức năng nhất. Nhưng một số người muốn sử dụng HBase mà không cần Java.
Những người đó có hai tùy chọn chính:Một là giao diện Thrift (nhẹ hơn và do đó nhanh hơn trong hai tùy chọn), và hai là giao diện REST (hay còn gọi là Stargate). Giao diện REST sử dụng các động từ HTTP để thực hiện một hành động. Bằng cách sử dụng HTTP, giao diện REST cung cấp một loạt các ngôn ngữ và chương trình rộng hơn có thể truy cập vào giao diện. (Nếu bạn muốn biết thêm thông tin về giao diện REST, bạn có thể chuyển đến loạt bài hướng dẫn của tôi về nó.)
Trong loạt bài hướng dẫn này, bạn sẽ tìm hiểu theo cách của mình xung quanh giao diện Thrift và khám phá các mẫu mã Python để thực hiện điều đó. Bài đầu tiên này sẽ đề cập đến HBase Thrift, làm việc với Thrift và một số mã soạn sẵn để kết nối với Thrift. Bài thứ hai sẽ hướng dẫn cách chèn và lấy nhiều hàng cùng một lúc. Bài đăng thứ ba sẽ giải thích cách sử dụng tính năng quét và một số cân nhắc khi lựa chọn giữa REST và Thrift.
Bạn có thể tìm thấy các mẫu mã đầy đủ trên tài khoản GitHub của tôi.
HBase Tiết kiệm
Thrift là một khung phần mềm cho phép bạn tạo các ràng buộc đa ngôn ngữ. Trong bối cảnh của HBase, Java là công dân hạng nhất duy nhất. Tuy nhiên, giao diện HBase Thrift cho phép các ngôn ngữ khác truy cập HBase qua Thrift bằng cách kết nối với máy chủ Thrift giao diện với máy khách Java.
Để cả Thrift và REST hoạt động, cần phải chạy một daemon HBase khác để xử lý các yêu cầu này. Các daemon này có thể được cài đặt với các gói hbase-tiết kiệm và hbase-rest. Sơ đồ dưới đây cho thấy cách Thrift và REST được đặt trong cụm.
Lưu ý rằng máy chủ khách hàng Thrift và REST thường không chạy bất kỳ dịch vụ nào khác (chẳng hạn như DataNodes hoặc RegionServer) để giữ chi phí thấp và khả năng phản hồi cao cho các tương tác REST hoặc Thrift.
Đảm bảo cài đặt và khởi động các daemon này trên các nút có quyền truy cập vào cả cụm Hadoop và ứng dụng cần quyền truy cập vào HBase. Giao diện Thrift không có bất kỳ cân bằng tải tích hợp nào, vì vậy tất cả cân bằng tải sẽ cần được thực hiện bằng các công cụ bên ngoài như DNS round-robin, địa chỉ IP ảo hoặc trong mã. Cloudera Manager cũng giúp cài đặt và quản lý các dịch vụ HBase REST và Thrift thực sự dễ dàng. Bạn có thể tải xuống và dùng thử miễn phí trong Cloudera Standard!
Nhược điểm của Thrift là khó thiết lập hơn REST. Bạn sẽ cần phải biên dịch Thrift và tạo các ràng buộc dành riêng cho ngôn ngữ. Những ràng buộc này rất hay vì chúng cung cấp cho bạn mã cho ngôn ngữ bạn đang làm việc - không cần phải phân tích cú pháp XML hoặc JSON như trong REST; thay vào đó, giao diện Thrift cung cấp cho bạn quyền truy cập trực tiếp vào dữ liệu hàng. Một tính năng thú vị khác là giao thức Thrift có truyền tải nhị phân bản địa; bạn sẽ không cần mã hóa và giải mã dữ liệu base64.
Để bắt đầu sử dụng giao diện Thrift, bạn cần tìm hiểu xem nó đang chạy trên cổng nào. Cổng mặc định cho CDH là cổng 9090. Đối với bài đăng này, bạn sẽ thấy các biến máy chủ và cổng được sử dụng, đây là các giá trị chúng tôi sẽ sử dụng:
host = "localhost" port = "9090"
Bạn có thể thiết lập giao diện Thrift để sử dụng thông tin đăng nhập Kerberos nhằm bảo mật tốt hơn.
Đối với mã của bạn, bạn sẽ cần sử dụng địa chỉ IP hoặc tên miền đủ điều kiện của nút và cổng chạy daemon Thrift. Tôi thực sự khuyên bạn nên đặt URL này thành một biến vì nó có thể thay đổi theo các thay đổi của mạng.
Ràng buộc ngôn ngữ
Trước khi bạn có thể tạo ràng buộc Thrift, bạn phải tải xuống và biên dịch Thrift. Không có gói nhị phân nào cho Thrift mà tôi có thể tìm thấy, ngoại trừ trên Windows. Bạn sẽ phải làm theo hướng dẫn của Thrift để cài đặt trên nền tảng bạn chọn.
Sau khi cài đặt Thrift, bạn cần tìm tệp Hbase.thrift. Để xác định các dịch vụ và kiểu dữ liệu trong Thrift, bạn phải tạo một tệp IDL. May mắn thay, các nhà phát triển HBase đã tạo một cái cho chúng tôi. Rất tiếc, tệp không được phân phối như một phần của gói nhị phân CDH. (Chúng tôi sẽ sửa lỗi đó trong bản phát hành CDH trong tương lai.) Bạn sẽ cần tải xuống gói nguồn của phiên bản HBase mà bạn đang sử dụng. Đảm bảo sử dụng đúng phiên bản HBase vì IDL này có thể thay đổi. Trong tệp nén, đường dẫn đến IDL là hbase-VERSION / src / main / resources / org / apache / hadoop / hbase / retft / Hbase.thrift.
Thrift hỗ trợ tạo liên kết ngôn ngữ cho hơn 14 ngôn ngữ bao gồm Java, C ++, Python, PHP, Ruby và C #. Để tạo các liên kết cho Python, bạn sẽ sử dụng lệnh sau:
thrift -gen py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
Tiếp theo, bạn sẽ cần lấy mã Thrift cho ngôn ngữ của mình chứa tất cả các lớp để kết nối với Thrift và các giao thức của nó. Bạn có thể tìm thấy mã này tại /path/to/thrift/thrift-0.9.0/lib/py/src/.
Đây là các lệnh tôi đã chạy để tạo một dự án Python để sử dụng HBase Thrift:
$ mkdir HBaseThrift $ cd HBaseThrift/ $ thrift -gen py ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift $ mv gen-py/* . $ rm -rf gen-py/ $ mkdir thrift $ cp -rp ~/Downloads/thrift-0.9.0/lib/py/src/* ./thrift/
Tôi muốn giữ một bản sao của tệp Hbase.thrift trong dự án để tham khảo lại. Nó có rất nhiều “Javadoc” trên các lệnh gọi, đối tượng dữ liệu và đối tượng trả về khác nhau.
$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
Mã Boilerplate
Bạn sẽ thấy rằng tất cả các tập lệnh Python Thrift của bạn sẽ trông rất giống nhau. Hãy xem qua từng phần.
from thrift.transport import TSocket from thrift.protocol import TBinaryProtocol from thrift.transport import TTransport from hbase import Hbase
Chúng sẽ nhập các mô-đun Thrift và HBase mà bạn cần.
# Connect to HBase Thrift server transport = TTransport.TBufferedTransport(TSocket.TSocket(host, port)) protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
Điều này tạo ra giao thức truyền tải và đường truyền socket và cho phép ứng dụng khách Thrift kết nối và nói chuyện với máy chủ Thrift.
# Create and open the client connection client = Hbase.Client(protocol) transport.open()
Những dòng này tạo ra đối tượng Client mà bạn sẽ sử dụng để tương tác với HBase. Từ đối tượng khách hàng này, bạn sẽ phát hành tất cả Gets và Puts của mình. Tiếp theo, mở ổ cắm vào máy chủ Thrift.
# Do Something
Tiếp theo, bạn sẽ thực sự làm việc với ứng dụng khách HBase. Mọi thứ đều được xây dựng, khởi tạo và kết nối. Đầu tiên, hãy bắt đầu sử dụng ứng dụng khách.
transport.close()
Cuối cùng, đóng phương tiện giao thông. Thao tác này sẽ đóng ổ cắm và giải phóng tài nguyên trên máy chủ Thrift. Đây là toàn bộ mã để dễ dàng sao chép và dán:
from thrift.transport import TSocket from thrift.protocol import TBinaryProtocol from thrift.transport import TTransport from hbase import Hbase # Connect to HBase Thrift server transport = TTransport.TBufferedTransport(TSocket.TSocket(host, port)) protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport) # Create and open the client connection client = Hbase.Client(protocol) transport.open() # Do Something transport.close()
Trong triển khai Python của HBase Thrift, tất cả các giá trị được chuyển xung quanh dưới dạng chuỗi. Điều này bao gồm dữ liệu nhị phân như một số nguyên. Tất cả các giá trị cột được giữ trong đối tượng TCell. Đây là định nghĩa trong tệp Hbase.thrift:
struct TCell{ 1:Bytes value, 2:i64 timestamp }
Lưu ý sự thay đổi đối với một chuỗi khi mã Python được tạo:
thrift_spec = ( None, # 0 (1, TType.STRING, 'value', None, None, ), # 1 (2, TType.I64, 'timestamp', None, None, ), # 2 )
Tôi đã viết một phương thức trợ giúp để giúp xử lý số nguyên 32 bit dễ dàng hơn. Để thay đổi một số nguyên qua lại giữa một chuỗi, bạn sử dụng hai phương pháp này.
# Method for encoding ints with Thrift's string encoding def encode(n): return struct.pack("i", n) # Method for decoding ints with Thrift's string encoding def decode(s): return struct.unpack('i', s)[0]
Hãy ghi nhớ điều này khi bạn làm việc với dữ liệu nhị phân trong Thrift. Bạn sẽ cần chuyển đổi dữ liệu nhị phân thành chuỗi và ngược lại.
Lỗi xảy ra
Việc hiểu lỗi trong giao diện Tiết kiệm không dễ dàng như vậy. Ví dụ:đây là lỗi xuất phát từ Python khi không tìm thấy bảng:
Traceback (most recent call last): File "./get.py", line 17, in <module> rows = client.getRow(tablename, "shakespeare-comedies-000001") File "/mnt/hgfs/jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", line 1038, in getRow return self.recv_getRow() File "/mnt/hgfs/jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", line 1062, in recv_getRow raise result.io hbase.ttypes.IOError: IOError(_message='doesnotexist')
Tất cả không bị mất vì bạn có thể xem tệp nhật ký HBase Thrift. Trên CDH, tệp này được đặt tại /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log. Trong ví dụ bảng bị thiếu, bạn sẽ thấy lỗi trong Nhật ký tiết kiệm cho biết bảng không tồn tại. Điều đó thật bất tiện, nhưng bạn có thể gỡ lỗi từ đó.
Trong phần tiếp theo, tôi sẽ đề cập đến việc chèn và lấy hàng.
Jesse Anderson là giảng viên của Đại học Cloudera.