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

Cách thực hiện:Sử dụng Giao diện Apache HBase REST, Phần 1

Có nhiều cách khác nhau để truy cập và tương tác với Apache HBase. API Java cung cấp nhiều chức năng nhất, nhưng nhiều người muốn sử dụng HBase mà không cần Java.

Có hai cách tiếp cận chính để làm điều đó:Một là giao diện Thrift, giao diện này nhanh hơn và nhẹ hơn trong hai tùy chọn. Cách khác để truy cập HBase là sử dụng giao diện REST, sử dụng các động từ HTTP để thực hiện một hành động, mang đến cho các nhà phát triển nhiều lựa chọn về ngôn ngữ và chương trình để sử dụng.

Loạt bài hướng dẫn này sẽ thảo luận về giao diện REST và cung cấp các mẫu mã Python để truy cập nó. Bài đầu tiên sẽ đề cập đến HBase REST, một số lưu ý của Python và quản trị bảng. Bài đăng thứ hai sẽ giải thích cách chèn nhiều hàng cùng một lúc bằng cách sử dụng XML và JSON. Bài đăng thứ ba sẽ chỉ ra cách lấy nhiều hàng bằng cách sử dụng XML và JSON. 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.

Kiến thức cơ bản về HBase REST

Để 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. Những daemon này có thể được cài đặt trong gói hbase-tiết kiệm và hbase-rest. Sơ đồ dưới đây minh họa vị trí Thrift và REST được đặt trong cụm. Lưu ý rằng các ứng dụng khách Thrift và REST thường không chạy bất kỳ dịch vụ dịch vụ nào khác như DataNode hoặc RegionServers để giảm tải và khả năng phản hồi cao cho các tương tác REST.

Đả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à máy chủ ứng dụng web. Giao diện REST không có bất kỳ cân bằng tải tích hợp nào; điều đó sẽ cần được thực hiện bằng phần cứng hoặc bằng mã. Cloudera Manager 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í!) Nhược điểm của REST là nó nặng hơn nhiều so với Thrift hoặc Java.

Giao diện REST có thể sử dụng các định dạng dữ liệu khác nhau:XML, JSON và protobuf. Bằng cách chỉ định AcceptContent-Type tiêu đề, bạn có thể chọn định dạng bạn muốn chuyển vào hoặc nhận lại.

Để bắt đầu sử dụng giao diện REST, 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 8070. Đối với bài đăng này, bạn sẽ thấy baseurl biến được sử dụng và đây là giá trị tôi sẽ sử dụng ::

baseurl = "http://localhost:8070"

Giao diện REST có thể được thiết lập để sử dụng thông tin xác thực Kerberos nhằm tăng cường bảo mật.

Đối với mã của bạn, bạn sẽ cần sử dụng địa chỉ IP hoặc DNS tên miền đủ điều kiện của nút chạy daemon REST. Ngoài ra, hãy xác nhận rằng cổng là chính xác. 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.

Cách giải quyết lỗi của Python và HBase

Có hai lỗi và cách giải quyết cần được giải quyết. Lỗi đầu tiên là các mô-đun Python tích hợp sẵn không hỗ trợ tất cả các động từ HTTP. Thứ hai là lỗi HBase REST khi làm việc với JSON.

Các mô-đun Python tích hợp cho tương tác REST không dễ dàng hỗ trợ tất cả các động từ HTTP cần thiết cho HBase REST. Bạn sẽ cần cài đặt mô-đun yêu cầu Python. Mô-đun yêu cầu cũng xóa mã và làm cho tất cả các tương tác dễ dàng hơn nhiều.

Giao diện HBase REST có một lỗi khi thêm dữ liệu qua JSON:yêu cầu các trường phải duy trì thứ tự chính xác của chúng. dict tích hợp sẵn trong Python loại không hỗ trợ tính năng này, vì vậy để duy trì đơn hàng, chúng tôi sẽ cần sử dụng OrderedDict lớp. (Những người sử dụng Python 2.6 trở lên sẽ cần cài đặt mô-đun lệnh.) Tôi cũng sẽ đề cập đến lỗi và cách giải quyết sau trong bài đăng.

Cũng khó sử dụng mã hóa và giải mã số nguyên base64, vì vậy tôi đã viết một số mã để làm điều đó:

 # Phương pháp mã hóa int với mã hóa base64 encodingdef (n):data =struct.pack ("i", n) s =base64.b64encode (data) return s # Phương pháp giải mã int với (các) mã hóa base64 encodingdef decode (s) :Data =base64.b64decode (s) n =struct.unpack ("i", data) return n [0] 

Để làm cho mọi thứ dễ dàng hơn, tôi đã viết một phương pháp để xác nhận rằng các phản hồi HTTP quay trở lại trong những năm 200, điều này cho thấy rằng hoạt động đã hoạt động. Mã mẫu sử dụng phương pháp này để kiểm tra mức độ thành công của cuộc gọi trước khi tiếp tục. Đây là phương pháp:

 # Kiểm tra đối tượng yêu cầu để xem cuộc gọi có thành công không 

Làm việc với bảng

Sử dụng giao diện REST, bạn có thể tạo hoặc xóa bảng. Hãy xem mã để tạo bảng.

 content ='' content + ='' content + ='' content + ='' request =request.post (baseurl + "/" + tablename + "/ schema", data =content, headers ={"Content -Kiểu ":" text / xml "," Chấp nhận ":" text / xml "}) 

Trong đoạn mã này, chúng tôi tạo một tài liệu XML nhỏ xác định lược đồ bảng trong biến nội dung. Chúng ta cần cung cấp tên của bảng và họ của cột. Nếu có nhiều họ cột, bạn tạo thêm một số ColumnSchema các nút.

Tiếp theo, chúng tôi sử dụng mô-đun yêu cầu để POST XML tới URL mà chúng tôi tạo. URL này cần bao gồm tên của bảng mới. Ngoài ra, hãy lưu ý rằng chúng tôi đang đặt tiêu đề cho POST này gọi điện. Chúng tôi cho thấy rằng chúng tôi đang gửi bằng XML với Content-Type đặt thành “text / xml” và chúng tôi muốn XML trở lại bằng Accept đặt thành “text / xml”.

Sử dụng request.status_code , bạn có thể kiểm tra xem tạo bảng đã thành công chưa. Giao diện REST sử dụng các mã lỗi HTTP giống nhau để phát hiện xem cuộc gọi thành công hay bị lỗi. Mã trạng thái trong những năm 200 có nghĩa là mọi thứ hoạt động chính xác.

Chúng tôi có thể dễ dàng kiểm tra xem bảng có tồn tại hay không bằng cách sử dụng mã sau:

 request =request.get (baseurl + "/" + tablename + "/ schema") 

Các cuộc gọi sử dụng GET động từ để nói với giao diện REST mà chúng ta muốn lấy thông tin lược đồ về bảng trong URL. Một lần nữa, chúng ta có thể sử dụng mã trạng thái để xem bảng có tồn tại hay không. Mã trạng thái trong những năm 200 có nghĩa là nó tồn tại và bất kỳ số nào khác có nghĩa là nó không tồn tại.

Sử dụng curl lệnh, chúng ta có thể kiểm tra sự thành công của một hoạt động REST mà không cần viết mã. Lệnh sau sẽ trả về 200 hiển thị thành công của cuộc gọi vì messagestable bảng không tồn tại trong HBase. Đây là cuộc gọi và đầu ra của nó:

 [user @ localhost] $ curl -I -H "Accept:text / xml" http:// localhost:8070 / messagestable / schemaHTTP / 1.1 200 OKContent-Length:0Cache-Control:no-cacheContent-Type:text / xml 

Lệnh gọi REST này sẽ xảy ra lỗi do tablenotthere bảng không tồn tại trong HBase. Đây là cuộc gọi và đầu ra của nó:

 [user @ localhost] $ curl -I -H "Accept:text / xml" http:// localhost:8070 / tablenotthere / schemaHTTP / 1.1 500 org.apache.hadoop.hbase.TableNotFoundException:tablenotthereContent-Type:text / html; charset =iso-8859-1Cache-Control:phải xác thực lại, no-cache, no-storeContent-Length:10767 

Chúng tôi có thể xóa bảng bằng mã sau:

 request =request.delete (baseurl + "/" + tên bảng + "/ schema") 

Cuộc gọi này sử dụng DELETE động từ để nói với giao diện REST rằng chúng ta muốn xóa bảng. Xóa bảng thông qua giao diện REST không yêu cầu bạn phải tắt nó trước. Như thường lệ, chúng tôi có thể xác nhận thành công bằng cách xem mã trạng thái.

Trong bài đăng tiếp theo của loạt bài này, chúng tôi sẽ đề cập đến việc chèn các hàng.

Jesse Anderson là giảng viên của Đại học Cloudera.

Nếu bạn quan tâm đến HBase, hãy nhớ đăng ký HBaseCon 2013 (13 tháng 6, San Francisco) - SỰ kiện cộng đồng dành cho những người đóng góp, nhà phát triển, quản trị viên và người dùng HBase. Đăng ký Early Bird được mở cho đến ngày 23 tháng 4.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Đồng bộ hóa dữ liệu nhóm HBase với công cụ HashTable / SyncTable

  2. Hadoop InputFormat &Các loại InputFormat trong MapReduce

  3. Bản phát hành CDH 6.2:Có gì mới trong HBase

  4. Tương lai của Hadoop - Dự đoán về tiền lương và công việc trong phân tích dữ liệu lớn

  5. Điều chỉnh hiệu suất trong MapReduce để cải thiện hiệu suất