歡迎光臨
每天分享高質量文章

如何在一個簡單的 REST 客戶端使用 SQL,Hadoop,Drill?

英文:Carol McDonald

譯者:伯樂線上-無名俠女譚

網址:http://blog.jobbole.com/88767/

根據福雷斯特研究公司(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的介面和手機應用來購買商品。主要的客戶概要資訊和產品目錄在MapR-DB中管理,這是一個NoSQL的HBase資料庫。來自網頁端和手機應用端的點選流資料以JSON格式檔案的形式儲存在Hadoop中,訂單資料則是儲存在Hive中。透過Drill,我們可以動態查詢這些不同資料源,而且甚至可以結合不同的資料源查詢。下麵的關係圖展示了該教程中不同資料源之間的“關係”。

瀏覽日誌資料

利用Drill,你可以對檔案和目錄直接執行SQL操作,而無需做預先樣式定義或者任何模型更改的樣式管理動作。查詢的同時也能得到相應的樣式。下圖是使用Drill Explorer來瀏覽JSON資料,無需定義和管理任何集中的樣式。

下麵的例子是對一個JSON檔案執行SQL陳述句,查詢事務id、裝置名稱和以cr開頭的關鍵字。

瀏覽Hive上訂單表(Orders)資料

下麵的例子是使用Drill Explorer來瀏覽Hive的order表。Drill可以在不用Hive執行引擎的條件下使用Hive元儲存。

瀏覽HBase的產品表(Products)

HBase是一個NoSQL資料庫。MapR-DB是一個企業級的Hadoop NoSQL資料庫,它實現了HBase的API,並將其開放以支援應用開發。MapR-DB的使用起來就和HBase一樣,但底層實現更為高效,而且它與MapR檔案系統是整合的。HBase是一個面向列族的資料庫,且是“無樣式”的,這意味著當你建立一個表的時候只需要定義列族。在你寫資料的時候,列會被動態定義,並且資料都以位元組陣列的形式儲存,而非輸入時的型別。

HBase的產品表(products)有兩個列族(下圖中的details和pricing):

如果查詢HBase採用Hive或其他基於Hadoop的SQL(SQL-on-Hadoop)方式,你不得不包裝一個樣式定義以此明確如何轉換二進位制的值。不像其他基於Hadoop的SQL方式,Drill在Hive中不需要包裝樣式定義來操作HBase資料。你可以像如下使用Drill explorer來瀏覽HBase中產品(products)表。

這是一個使用Drill命令列介面來查詢HBase中產品(products)表的示例。

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 :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命令列用CURL來傳送對orderprodview的查詢:

# curl

–essay-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表格中。

+ order.cust_id + ‘

function renderList(data) {

var list = data == null ? [] : (data instanceof Array ? data : [data])

$.each(list, function(order) {

$(‘#orderList’).append(‘

‘ + order.order_id + ‘

+ order.state + ‘

‘ + order.month + ‘
‘+ order.order_total + ‘

‘ + order.prod_id + ‘

‘ + order.category + ‘
‘+ order.name + ‘

‘);

});

}

Index.html

jQuery客戶端還提供了搜尋產品類目(Product Category)的功能,如下圖。

搜尋功能的程式碼只是在查詢中添加了where category like ‘searchKey’:

< b>Order Id < b>Customer Id < b>State < b>Month < b>Order Total < b>Product Id < b>Product Category < b>Product Name
function search(searchKey) {

if (searchKey != ”)

query = query + ‘ where category like ” + searchKey + ‘%”;

doQuery(query);

}

在Chrome開發者工具視窗看到的JSON請求資料是這樣的:

以上的例子包含了一個簡單的REST客戶端,它採用Drill REST API來動態查詢HBase和Hive。

想要瞭解更多如何使用Drill的示例,下載MapR沙箱,然後嘗試一下Drill沙箱教程。更多資訊可到Apache Drill官方網站獲取。

贊(0)

分享創造快樂