簡単RESTクライアントSQL,Hadoop,Drillを使用
20607 ワード
フォレスター研究会社(Forrester Research)の観点によると、SQLはHadoop生態系で最も生産される応用案の一つになるだろう.Apache Drillはビッグデータ検索に適用されるオープンソースSQLクエリーエンジンです.RESTサービスとクライアントはすでにインターネットで流行している技術となっている.Apache HBAseは人気のあるHadoop NoSQLデータベースです.本稿では、SQL、Hadoop、Drill、REST with JSON、NoSQL、HBAseなどのテクノロジーと組み合わせて、Drill REST APIを使用してHBAseとHiveをクエリーする方法について議論し、説明します.同時に、Drill REST APIを使用する簡単なjQueryクライアントを共有し、JSONを利用してデータ交換を行い、ユーザーに基本的な操作インタフェースを提供します.
Apache DrillチュートリアルとMapR砂箱
Apache Drillは、直接クエリー・ファイル内の自己記述および半構造化データ(JSONおよびParquetと同様)およびHBAseテーブルの機能を提供し、HBAseテーブルをクエリーする際にHiveメタストレージのような集中型ストレージでテーブルのモードを定義および維持する必要はありません.この例は、Drillを使用したMapR砂箱とDrillチュートリアルのサンプルデータに基づいています.Apache Drillを含むMapR砂箱は、Hadoop環境でApache Drillの概要を知ることができる機能的で、単一ノードのクラスタです.
使用例データの参照
Drillチュートリアルの例はオンライン小売システムで、ユーザーはWebのインタフェースと携帯電話のアプリケーションを通じて商品を購入することができます.主な顧客プロファイルと製品カタログは、NoSQLのHBAseデータベースであるMapR-DBで管理されています.ページ側と携帯アプリ側からのクリックストリームデータはJSON形式のファイルとしてHadoopに格納され、注文データはHiveに格納される.Drillを使用すると、これらの異なるデータ・ソースを動的にクエリーでき、異なるデータ・ソース・クエリーと組み合わせることもできます.次の関係図は、このチュートリアルの異なるデータ・ソース間の「関係」を示しています.
ログデータの参照
Drillを使用すると、ファイルとディレクトリに対してSQL操作を直接実行できます.事前のモード定義やモデル変更のモード管理動作をする必要はありません.クエリーと同時に対応するモードも得られます.次の図は、Drill Explorerを使用してJSONデータを参照し、セット内のモードを定義および管理する必要がありません.
次の例は、1つのJSONファイルに対してSQL文を実行し、トランザクションid、デバイス名、crで始まるキーワードをクエリーします.
Hive受注テーブル(Orders)データの参照
次の例は、Drill Explorerを使用してHiveのorderテーブルを参照します.Drillは、Hive実行エンジンを用いずにHiveメタストレージを使用することができる.
HBAseのプロダクトテーブルを参照(Products)
HBAseはNoSQLデータベースです.MapR-DBは、HBAseのAPIを実現し、アプリケーション開発をサポートするためにオープンしたエンタープライズクラスのHadoop NoSQLデータベースです.MapR-DBの使用はHBAseと同じですが、下位層ではより効率的に実現され、MapRファイルシステムと統合されています.HBAseはカラムファミリー向けのデータベースであり、「モードなし」です.これは、テーブルを作成するときにカラムファミリーを定義するだけであることを意味します.データを書くとき、カラムは動的に定義され、入力時のタイプではなくバイト配列で格納されます.
HBAseのプロダクトテーブル(products)には、2つのカラムファミリー(下図のdetailsとpricing)があります.
クエリーHBAseがHiveまたはHadoopベースのSQL(SQL-on-Hadoop)方式を採用している場合は、バイナリの値をどのように変換するかを明確にするモード定義をパッケージする必要があります.他のHadoopベースのSQL方式とは異なり、DrillはHiveでHBAseデータを操作するためにパッケージモード定義を必要としない.次のようにDrill explorerを使用してHBAseの製品(products)テーブルを参照できます.
これは、Drillコマンドラインインタフェースを使用してHBAseのプロダクトテーブルをクエリーする例です.
HBAseのどのデータもバイト配列で格納されていることと、Drillがデータ型を示すために事前のモード定義を必要としないことを考慮すると、クエリが返すカラム値の元のバイト配列は、その格納状態と一致します.Drillでconvert_を使うことができますfrom関数は、対応するデータ型にデータを変換します.また、カラムは、次のように別名を指定できます.
冗長で複雑なHBAseクエリー文の繰り返し書き込みを避けるために、一般的なワークフローは、有用な情報を含むビューを作成してから、ビューをクエリーすることです.ODBCツール、JDBCクライアント、またはこの例のRESTクライアントでは、ビューは、データをより利用可能な「テーブル」形式で容易に使用することができる.RESTクライアントが使用するビューは、上述したようにHiveテーブルに変換されて接続されたHBAseデータである.HBAseデータに基づいてビューを作成するクエリーです.
まず、書き込み可能ワークスペースに切り替えます.
HBAseのプロダクトテーブル(Products)のビューを作成します.
従来のデータベースとは異なり、ビューは通常DBA/開発者によって操作され、Drillではファイルシステムベースのビューは非常に軽量です.Drillビューは、単純なJSONファイルで定義された仮想データセットです.作成したJSONファイルを見てみましょう.
次のようにDrill explorerを使用して、製品のグラフ(prodview)を参照できます.
クエリーにHiveを関連付ける受注テーブル(Orders)と製品ビューグラフ(Prodview)
Drillを使用すると、Hive、ファイル、およびHBAseテーブルをクエリーで動的に関連付けることができます.たとえば、このクエリはjsonログファイルからdeviceとprod_を取得します.id、Hiveの受注テーブルからorderを取得し、jsonログファイルのprod_idはorderテーブルのprod_に等しいid.【訳者注:原文作成者が誤記し、照会条件のprod_idをcust_idとした.】
ビューorderprodviewを作成し、HBAseのプロダクトテーブルビュー(prodview)に接続します.
【訳者注:ここの原文の作者は誤りがあって、書いたのは製品表のproductです】とHiveの注文表(Order)です:
クエリー・ビューorderprodviewの例です.
Drillビューの用途は次のとおりです.
複雑なクエリーのシンプル化複数のデータ・ソースから集約されたデータをテーブルと同じように配置するTableauのようなBI(Business Intelligence)ツールを備えたデータ管理の柔軟性次に、RESTでこのビューをどのように使用するかを見てみましょう
Drill RESTインタフェース
Drillは簡単なRESTインタフェースを提供しています.Drill wikiからもっと知ることができます.https://cwiki.apache.org/confluence/display/DRILL/Apache+Drill+Wiki.クエリをコミットし、結果を受信するREST APIです.HTTP POSTでDrill URL、すなわち8047/queryをリクエストできます.json,bodyは下図のようにJSON形式のRequestを携帯している.受信したresponse応答はJSONオブジェクトのリストになります.
CURLまたはブラウザプラグインを使用してRESTインタフェースをテストするのは便利です.次の例では、LinuxコマンドラインからorderprodviewへのクエリーをCURLで送信します.
Google ChromeのREST Client拡張機能を使用してorderprodviewを検索します.
Drill RESTインタフェースを使用して受注製品ビューのJQueryクライアントを問い合わせる
では、先ほどのRESTクエリのために作成した簡単なJQueryクライアントを見てみましょう.これはクライアントのスクリーンショットです.Drillにクエリーを開始し、結果をテーブルに表示します.
Google Chrome開発者ツールを使用すると、HTTPリクエストは次のように表示されます.
返されるresponseは次のとおりです.
jQueryクライアント
これは、サービス呼び出しに参加するjQueryコードです.jQueryクライアントはjqueryを使用する.ajaxは、HTTP POSTからDrillへのクエリーURLを実行し、クエリーデータをJSON形式で渡す.
リクエストが成功すると、renderListが呼び出されます.この方法は次のようになります.返されるresponseデータはJSONオブジェクトデータであり、renderListは注文オブジェクトをindexに追加する.htmlページのhtmlテーブルにあります.
jQueryクライアントは、以下の図に示すように、製品カテゴリ(Product Category)を検索する機能も提供しています.
検索機能のコードは、クエリにwhere category like'searchKey'を追加しただけです.
Chrome開発者ツールウィンドウで見たJSONリクエストデータは次のとおりです.
上記の例は、Drill REST APIを使用してHBAseおよびHiveを動的にクエリする簡単なRESTクライアントを含む.
Drillの使用例をもっと知りたい場合は、MapR砂箱をダウンロードし、Drill砂箱チュートリアルを試してみてください.詳細はApache Drill公式サイトで入手できます.
転載先:https://www.cnblogs.com/ainima/p/6331852.html
Apache DrillチュートリアルとMapR砂箱
Apache Drillは、直接クエリー・ファイル内の自己記述および半構造化データ(JSONおよびParquetと同様)およびHBAseテーブルの機能を提供し、HBAseテーブルをクエリーする際にHiveメタストレージのような集中型ストレージでテーブルのモードを定義および維持する必要はありません.この例は、Drillを使用したMapR砂箱とDrillチュートリアルのサンプルデータに基づいています.Apache Drillを含むMapR砂箱は、Hadoop環境でApache Drillの概要を知ることができる機能的で、単一ノードのクラスタです.
使用例データの参照
Drillチュートリアルの例はオンライン小売システムで、ユーザーはWebのインタフェースと携帯電話のアプリケーションを通じて商品を購入することができます.主な顧客プロファイルと製品カタログは、NoSQLのHBAseデータベースであるMapR-DBで管理されています.ページ側と携帯アプリ側からのクリックストリームデータはJSON形式のファイルとしてHadoopに格納され、注文データはHiveに格納される.Drillを使用すると、これらの異なるデータ・ソースを動的にクエリーでき、異なるデータ・ソース・クエリーと組み合わせることもできます.次の関係図は、このチュートリアルの異なるデータ・ソース間の「関係」を示しています.
ログデータの参照
Drillを使用すると、ファイルとディレクトリに対してSQL操作を直接実行できます.事前のモード定義やモデル変更のモード管理動作をする必要はありません.クエリーと同時に対応するモードも得られます.次の図は、Drill Explorerを使用してJSONデータを参照し、セット内のモードを定義および管理する必要がありません.
次の例は、1つのJSONファイルに対してSQL文を実行し、トランザクションid、デバイス名、crで始まるキーワードをクエリーします.
Hive受注テーブル(Orders)データの参照
次の例は、Drill Explorerを使用してHiveのorderテーブルを参照します.Drillは、Hive実行エンジンを用いずにHiveメタストレージを使用することができる.
HBAseのプロダクトテーブルを参照(Products)
HBAseはNoSQLデータベースです.MapR-DBは、HBAseのAPIを実現し、アプリケーション開発をサポートするためにオープンしたエンタープライズクラスのHadoop NoSQLデータベースです.MapR-DBの使用はHBAseと同じですが、下位層ではより効率的に実現され、MapRファイルシステムと統合されています.HBAseはカラムファミリー向けのデータベースであり、「モードなし」です.これは、テーブルを作成するときにカラムファミリーを定義するだけであることを意味します.データを書くとき、カラムは動的に定義され、入力時のタイプではなくバイト配列で格納されます.
HBAseのプロダクトテーブル(products)には、2つのカラムファミリー(下図のdetailsとpricing)があります.
クエリーHBAseがHiveまたはHadoopベースのSQL(SQL-on-Hadoop)方式を採用している場合は、バイナリの値をどのように変換するかを明確にするモード定義をパッケージする必要があります.他のHadoopベースのSQL方式とは異なり、DrillはHiveでHBAseデータを操作するためにパッケージモード定義を必要としない.次のようにDrill explorerを使用してHBAseの製品(products)テーブルを参照できます.
これは、Drillコマンドラインインタフェースを使用してHBAseのプロダクトテーブルをクエリーする例です.
0: jdbc:drill:> select * from maprdb.products limit 3;
+------------+------------+------------+
| row_key | details | pricing |
+------------+------------+------------+
| [B@1babffd6 | {"category":"bGFwdG9w","name":"IlNvbnkgbm90ZWJvb2si"} | {"price":"OTU5"} |
| [B@456a24be | {"category":"RW52ZWxvcGVz","name":"IzEwLTQgMS84IHggOSAxLzIgUHJlbWl1bSBEaWFnb25hbCBTZWFtIEVudmVsb3Blcw=="} | {"price":"MTY="} |
| [B@3b92598c | {"category":"U3RvcmFnZSAmIE9yZ2FuaXphdGlvbg==","name":"MjQgQ2FwYWNpdHkgTWF4aSBEYXRhIEJpbmRlciBSYWNrc1BlYXJs"} | {"price":"MjEx"} |
+------------+------------+------------+
HBAseのどのデータもバイト配列で格納されていることと、Drillがデータ型を示すために事前のモード定義を必要としないことを考慮すると、クエリが返すカラム値の元のバイト配列は、その格納状態と一致します.Drillでconvert_を使うことができますfrom関数は、対応するデータ型にデータを変換します.また、カラムは、次のように別名を指定できます.
冗長で複雑なHBAseクエリー文の繰り返し書き込みを避けるために、一般的なワークフローは、有用な情報を含むビューを作成してから、ビューをクエリーすることです.ODBCツール、JDBCクライアント、またはこの例のRESTクライアントでは、ビューは、データをより利用可能な「テーブル」形式で容易に使用することができる.RESTクライアントが使用するビューは、上述したようにHiveテーブルに変換されて接続されたHBAseデータである.HBAseデータに基づいてビューを作成するクエリーです.
まず、書き込み可能ワークスペースに切り替えます.
0: jdbc:drill:> use dfs.mydata;
+------------+------------+
| ok | summary |
+------------+------------+
| true | Default schema changed to 'dfs.mydata' |
+------------+------------+
1 row selected (0.078 seconds)
HBAseのプロダクトテーブル(Products)のビューを作成します.
0: jdbc:drill:> create or replace view prodview as SELECT CAST(row_key AS INTEGER) AS prod_id, CAST(t.details.category AS VARCHAR(40)) AS category, CAST(t.details.name AS VARCHAR(129)) AS name FROM maprdb.products t;
+------------+------------+
| ok | summary |
+------------+------------+
| true | View 'prodview' replaced successfully in 'dfs.mydata' schema |
+------------+------------+
従来のデータベースとは異なり、ビューは通常DBA/開発者によって操作され、Drillではファイルシステムベースのビューは非常に軽量です.Drillビューは、単純なJSONファイルで定義された仮想データセットです.作成したJSONファイルを見てみましょう.
# cat /mapr/demo.mapr.com/data/views/prodview.view.drill
{
"name" : "prodview",
"sql" : "SELECT CAST(`row_key` AS INTEGER) AS `prod_id`, CAST(`t`.`details`['category'] AS VARCHAR(40)) AS `category`, CAST(`t`.`details`['name'] AS VARCHAR(129)) AS `name`nFROM `maprdb`.`products` AS `t`",
"fields" : [ {
"name" : "prod_id",
"type" : "INTEGER"
}, {
"name" : "category",
"type" : "VARCHAR",
"precision" : 40
}, {
"name" : "name",
"type" : "VARCHAR",
"precision" : 129
} ],
"workspaceSchemaPath" : [ "dfs", "mydata" ]
}
次のようにDrill explorerを使用して、製品のグラフ(prodview)を参照できます.
クエリーにHiveを関連付ける受注テーブル(Orders)と製品ビューグラフ(Prodview)
Drillを使用すると、Hive、ファイル、およびHBAseテーブルをクエリーで動的に関連付けることができます.たとえば、このクエリはjsonログファイルからdeviceとprod_を取得します.id、Hiveの受注テーブルからorderを取得し、jsonログファイルのprod_idはorderテーブルのprod_に等しいid.【訳者注:原文作成者が誤記し、照会条件のprod_idをcust_idとした.】
ビューorderprodviewを作成し、HBAseのプロダクトテーブルビュー(prodview)に接続します.
【訳者注:ここの原文の作者は誤りがあって、書いたのは製品表のproductです】とHiveの注文表(Order)です:
0: jdbc:drill:> create or replace view orderprodview as select o.order_id, o.`month`, o.cust_id, o.state, o.prod_id, o.order_total, p.category, p.name from hive.orders o, dfs.mydata.prodview p where o.prod_id=p.prod_id limit 100;
+------------+------------+
| ok | summary |
+------------+------------+
| true | View 'orderprodview' replaced successfully in 'dfs.mydata' schema |
+------------+------------+
クエリー・ビューorderprodviewの例です.
Drillビューの用途は次のとおりです.
複雑なクエリーのシンプル化複数のデータ・ソースから集約されたデータをテーブルと同じように配置するTableauのようなBI(Business Intelligence)ツールを備えたデータ管理の柔軟性次に、RESTでこのビューをどのように使用するかを見てみましょう
Drill RESTインタフェース
Drillは簡単なRESTインタフェースを提供しています.Drill wikiからもっと知ることができます.https://cwiki.apache.org/confluence/display/DRILL/Apache+Drill+Wiki.クエリをコミットし、結果を受信するREST APIです.HTTP POSTでDrill URL、すなわち8047/queryをリクエストできます.json,bodyは下図のようにJSON形式のRequestを携帯している.受信したresponse応答はJSONオブジェクトのリストになります.
POST <drill_node_ip_address>:8047/query.json
Request body:
{
"queryType" : "SQL",
"query" : "select * from dfs.mydata.orderprodview limit 5”
}
Response body (list of JSON objects):
[
{
"order_total" : 13,
"category" : "Binders and Binder Accessories",
"prod_id" : 909,
"name" : "Wilson Jones Ledger-SizePiano-Hinge Binder2Blue",
"state" : "ca", }, …
]
CURLまたはブラウザプラグインを使用してRESTインタフェースをテストするのは便利です.次の例では、LinuxコマンドラインからorderprodviewへのクエリーをCURLで送信します.
# curl
--header "Content-type: application/json"
--request POST
--data '{
"queryType" : "SQL",
"query" : "select * from dfs.mydata.orderprodview limit 1"
}'
http://192.168.110.133:8047/query.json
[ {
"order_total" : 13,
"category" : "Binders and Binder Accessories",
"prod_id" : 909,
"name" : "Wilson Jones Ledger-SizePiano-Hinge Binder2Blue",
"state" : "ca",
"month" : "June",
"order_id" : 67212,
"cust_id" : 10001
}]
Google ChromeのREST Client拡張機能を使用してorderprodviewを検索します.
Drill RESTインタフェースを使用して受注製品ビューのJQueryクライアントを問い合わせる
では、先ほどのRESTクエリのために作成した簡単なJQueryクライアントを見てみましょう.これはクライアントのスクリーンショットです.Drillにクエリーを開始し、結果をテーブルに表示します.
Google Chrome開発者ツールを使用すると、HTTPリクエストは次のように表示されます.
返されるresponseは次のとおりです.
jQueryクライアント
これは、サービス呼び出しに参加するjQueryコードです.jQueryクライアントはjqueryを使用する.ajaxは、HTTP POSTからDrillへのクエリーURLを実行し、クエリーデータをJSON形式で渡す.
var rootURL = "http://host:8047/query.json";
var query = "select * from dfs.mydata.orderprodview"
function doQuery(query) {
console.log('doQuery');
$.ajax({
type: 'POST',
contentType: 'application/json',
url: rootURL,
dataType: "json",
data: queryToJSON(query),
success: function(data) {
console.log(' success: ' + data);
renderList(data);
},
error: function(jqXHR, textStatus, errorThrown) {
alert('error: ' + textStatus);
}
});
}
function queryToJSON(query) {
return JSON.stringify({
"queryType": "SQL",
"query": query
});
}
リクエストが成功すると、renderListが呼び出されます.この方法は次のようになります.返されるresponseデータはJSONオブジェクトデータであり、renderListは注文オブジェクトをindexに追加する.htmlページのhtmlテーブルにあります.
function renderList(data) {
var list = data == null ? [] : (data instanceof Array ? data : [data])
$.each(list, function(order) {
$('#orderList').append('<tr><td>' + order.order_id + 'td><td>'
+ order.cust_id + 'td><td>'
+ order.state + 'td><td>' + order.month + 'td><td>'
+ order.order_total + 'td><td>'
+ order.prod_id + 'td><td>' + order.category + 'td><td>'
+ order.name + 'td>tr>');
});
}
Index.html
<table id="list" class='tablesorter-blue'>
<thead>
<tr>
<th>< b>Order Idb>th>
<th>< b>Customer Idb>th>
<th>< b>Stateb>th>
<th>< b>Monthb>th>
<th>< b>Order Totalb>th>
<th>< b>Product Idb>th>
<th>< b>Product Categoryb>th>
<th>< b>Product Nameb>th>
tr>
thead>
<tbody id="orderList" >tbody>
table>
jQueryクライアントは、以下の図に示すように、製品カテゴリ(Product Category)を検索する機能も提供しています.
検索機能のコードは、クエリにwhere category like'searchKey'を追加しただけです.
function search(searchKey) {
if (searchKey != '')
query = query + ' where category like '' + searchKey + '%'';
doQuery(query);
}
Chrome開発者ツールウィンドウで見たJSONリクエストデータは次のとおりです.
上記の例は、Drill REST APIを使用してHBAseおよびHiveを動的にクエリする簡単なRESTクライアントを含む.
Drillの使用例をもっと知りたい場合は、MapR砂箱をダウンロードし、Drill砂箱チュートリアルを試してみてください.詳細はApache Drill公式サイトで入手できます.
転載先:https://www.cnblogs.com/ainima/p/6331852.html