Apache HBaseにアクセスして対話するには、さまざまな方法があります。 Java APIはほとんどの機能を提供しますが、多くの人はJavaなしでHBaseを使用したいと考えています。
これを行うには、主に2つのアプローチがあります。1つはThriftインターフェースで、2つのオプションの中でより高速で軽量です。 HBaseにアクセスするもう1つの方法は、HTTP動詞を使用してアクションを実行するRESTインターフェースを使用することです。これにより、開発者は使用する言語とプログラムを幅広く選択できます。
この一連のハウツーでは、RESTインターフェースについて説明し、それにアクセスするためのPythonコードサンプルを提供します。最初の投稿では、HBase REST、いくつかのPythonの警告、およびテーブル管理について説明します。 2番目の投稿では、XMLとJSONを使用して一度に複数の行を挿入する方法について説明します。 3番目の投稿では、XMLとJSONを使用して複数の行を取得する方法を示します。完全なコードサンプルは、私のGitHubアカウントにあります。
HBaseRESTの基本
ThriftとRESTの両方が機能するには、これらのリクエストを処理するために別のHBaseデーモンが実行されている必要があります。これらのデーモンは、hbase-thriftおよびhbase-restパッケージにインストールできます。次の図は、ThriftとRESTがクラスター内のどこに配置されているかを示しています。 ThriftおよびRESTクライアントは通常、DataNodeやRegionServersなどの他のサービスサービスを実行して、RESTインタラクションの負荷を抑え、応答性を高く保つことはありません。
これらのデーモンは、HadoopクラスターとWebアプリケーションサーバーの両方にアクセスできるノードにインストールして起動してください。 RESTインターフェースには、ロードバランシングが組み込まれていません。これは、ハードウェアまたはコードで行う必要があります。 Cloudera Managerを使用すると、HBaseRESTおよびThriftサービスのインストールと管理が非常に簡単になります。 (ダウンロードして無料で試すことができます!)RESTの欠点は、ThriftやJavaよりもはるかに重いことです。
RESTインターフェースは、XML、JSON、protobufなどのさまざまなデータ形式を使用できます。 Accept
を指定する およびContent-Type
ヘッダーでは、受け渡しする形式を選択できます。
RESTインターフェースの使用を開始するには、RESTインターフェースが実行されているポートを把握する必要があります。 CDHのデフォルトのポートはポート8070です。この投稿では、baseurl
が表示されます。 使用される変数です。使用する値は次のとおりです::
baseurl = "http://localhost:8070"
RESTインターフェースは、Kerberosクレデンシャルを使用してセキュリティを強化するように設定できます。
コードには、RESTデーモンを実行しているノードのIPアドレスまたは完全修飾ドメイン名DNSを使用する必要があります。また、ポートが正しいことを確認してください。このURLはネットワークの変更によって変更される可能性があるため、可変にすることを強くお勧めします。
PythonとHBaseのバグの回避策
対処する必要のある2つのバグと回避策があります。最初のバグは、組み込みのPythonモジュールがすべてのHTTP動詞をサポートしていないことです。 2つ目は、JSONを使用する場合のHBaseRESTのバグです。
RESTインタラクション用の組み込みPythonモジュールは、HBaseRESTに必要なすべてのHTTP動詞を簡単にサポートするわけではありません。 Pythonリクエストモジュールをインストールする必要があります。また、requestsモジュールはコードをクリーンアップし、すべての対話をはるかに簡単にします。
JSONを介してデータを追加する場合、HBaseRESTインターフェースにはバグがあります。フィールドが正確な順序を維持する必要があります。組み込みのPythondict
typeはこの機能をサポートしていないため、順序を維持するには、OrderedDict
を使用する必要があります クラス。 (Python 2.6以前を使用している場合は、ordereddictモジュールをインストールする必要があります。)バグと回避策については、投稿の後半で説明します。
また、base64のエンコードとデコードの整数を使用することも困難だったため、そのためのコードをいくつか作成しました。
# Method for encoding ints with base64 encoding def encode(n): data = struct.pack("i", n) s = base64.b64encode(data) return s # Method for decoding ints with base64 encoding def decode(s): data = base64.b64decode(s) n = struct.unpack("i", data) return n[0]
さらに簡単にするために、HTTP応答が200年代に戻ってくることを確認するメソッドを作成しました。これは、操作が機能したことを示しています。サンプルコードは、このメソッドを使用して、先に進む前に呼び出しの成功を確認します。方法は次のとおりです。
# Checks the request object to see if the call was successful def issuccessful(request): if 200
テーブルの操作
RESTインターフェースを使用して、テーブルを作成または削除できます。テーブルを作成するためのコードを見てみましょう。
content = '' content += '' content += ' ' content += '' request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})
このスニペットでは、コンテンツ変数のテーブルスキーマを定義する小さなXMLドキュメントを作成します。テーブルの名前と列のファミリー名を指定する必要があります。複数の列ファミリーがある場合は、さらにいくつかのColumnSchema
を作成します ノード。
次に、requestsモジュールを使用してPOST
作成したURLへのXML。このURLには、新しいテーブルの名前を含める必要があります。また、このPOST
のヘッダーを設定していることに注意してください 電話。 Content-Type
を使用してXMLで送信していることを示しています 「text/xml」に設定し、Accept
でXMLを元に戻します。 「text/xml」に設定します。
request.status_code
を使用する 、テーブルの作成が成功したことを確認できます。 RESTインターフェースは、同じHTTPエラーコードを使用して、呼び出しが成功したかエラーになったのかを検出します。 200年代のステータスコードは、物事が正しく機能したことを意味します。
次のコードを使用して、テーブルが存在するかどうかを簡単に確認できます。
request = requests.get(baseurl + "/" + tablename + "/schema")
呼び出しはGET
を使用します URL内のテーブルに関するスキーマ情報を取得することをRESTインターフェースに伝える動詞。ここでも、ステータスコードを使用して、テーブルが存在するかどうかを確認できます。 200年代のステータスコードは存在することを意味し、他の数字は存在しないことを意味します。
curl
を使用する コマンドを使用すると、コードを記述せずにREST操作の成功を確認できます。次のコマンドは、messagestable
が原因で、呼び出しの成功を示す200を返します。 テーブルはHBaseに存在します。呼び出しとその出力は次のとおりです。
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/schema HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache Content-Type: text/xml
tablenotthere
が原因で、このREST呼び出しはエラーになります テーブルはHBaseに存在しません。呼び出しとその出力は次のとおりです。
[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/tablenotthere/schema HTTP/1.1 500 org.apache.hadoop.hbase.TableNotFoundException: tablenotthere Content-Type: text/html; charset=iso-8859-1 Cache-Control: must-revalidate,no-cache,no-store Content-Length: 10767
次のコードを使用してテーブルを削除できます:
request = requests.delete(baseurl + "/" + tablename + "/schema")
この呼び出しはDELETE
を使用します テーブルを削除することをRESTインターフェースに伝える動詞。 RESTインターフェースを介してテーブルを削除する場合、最初にテーブルを無効にする必要はありません。いつものように、ステータスコードを確認することで成功を確認できます。
このシリーズの次の投稿では、行の挿入について説明します。
ジェシーアンダーソンはCloudera大学のインストラクターです。
HBaseに興味がある場合は、必ず登録してください HBaseCon 2013(6月13日、サンフランシスコ)– HBaseの寄稿者、開発者、管理者、およびユーザー向けのコミュニティイベント。アーリーバードの登録は4月23日まで受け付けています。