HadoopTimes

実践 機械学習:レコメンデーションにおけるイノベーション
技術情報

Apache Drill 1.6とMapR Converged Data Platform -ビッグデータアナリティクス向け「JSON対応」型スタックの出現

本日、MapR Converged Data PlatformでApache Drill 1.6の公開ができることを嬉しく思います。Drillはこの1年半の間、短期間にリリースを繰り返していました。その間顧客やOSSコミュニティユーザーと非常に有意義な情報交換を行なってきました。このコミュニティは2014年9月のベータ版の公開から13回のリリースを行い、今も急速なペースで前進し続けています。

以下がDrill 1.6リリースのハイライトです。

  • MapR-DB (ドキュメントデータベース) の新しいストレージプラグイン
  • 向上したメモリアロケータによる安定性とスケールの強化
  • クエリパフォーマンスの強化
    • パーティションプルーニング早期適用によるクエリプランニングの高速化
    • Hiveテーブルクエリ上での高速クエリプランニング
    • Parquetメタデータキャッシュ読み込みの最適化
    • Limit Nクエリを高速化するRow count-basedプルーニング
    • limit 0パフォーマンス向上によるTableauエクスペリエンスの最適化

クライアント偽装(impersonate)によるBIツールからMapR/Drillまでのend-to-endセキュリテイ (JDBCのみサポート。ODBCドライバーはまもなく公開予定)。

  • 新しいSQLウィンドウファンクションフレーム構造
    • RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    • RANGE BETWEEN CURRENT ROW AND CURRENT ROW
  • JDK 1.8サポート
  • その他不具合の修正と改善

上記の項目からわかるように、Drill 1.6のリリースは、ANSI SQLサポートとパフォーマンス/スケールを推進する上で重要な手段の1つになります。

MapRこのリリースに大変注目しています。MapR 5.1リリースの一環として最近公開したMapR-DBドキュメントデータベース機能にDrillを統合することで、他に類を見ない価値をもたらすことになるからです。新しいMapR-DBドキュメントデータベースフォーマットプラグインをDrill 1.6に導入することで、直接MapR-DBのJSONテーブルにクエリを実行することができます。これは、どのレイヤにおいてもETLや変換処理を必要しなくなることを意味しています。この組み合わせによって、ANSI SQL機能を使用したグローバルHadoopスケール環境上において、本来のフォーマットのまま忠実にデータの保存・更新・参照が行える為、JSONに対しend-to-endで柔軟性が提供されます。結果として運用分析機能が利用可能なるばかりでなく、より大切なポイントとして、アプリケーションに内在しているデータモデルの変更へ迅速に対応することができるようになります。この機敏性により、短時間で成果を生み出すことができます。

DrillはコアとなるJSONとスキーマレス/半構造化データで設計され、MapR-FSにある未処理JSONファイルに対し、クエリ実行や操作を可能にします。まもなくDrillの性能を、グローバルのパブリッシュ・サブスクライブメッセージングフレームワークであるMapR Streamsへ拡張することになっています。つまりSQLはリアルタイムストリーミングイベントのクエリで使うことができるのです。本質的に、DrillはMapR Converged Data Platformのファイル、テーブルとストリーム全体に統一された、高性能で柔軟なSQLアクセスレイヤーになります。

MapR Converged Data Platform

https://www.mapr.com/products/hadoop-downloadからMapR Converged Data Platformコミュニティ版をダウンロードし、皆様自身でDrill+MapR-DB JSONの機能を試すことができます。

ここで、MapR-DB JSONテーブルのDrillクエリを行なってみましょう。これらを実行する上でYelpデータセットを使いました。

まずはJSONデータをMapR-DBに取り込みます。これでMapRを備えるOJAI APIやout-of-box importJSONユーティリティを使用することができます。

  • OJAI APIを使う
    • ファイルからの一括読み込み
Table table = MapRDB.getTable(“/maprdb/json/yelp");
RecordStream jsonStream = Json.newDocumentStream(fs, "/business.json");
table.insertOrReplace(jsonStream);
  • アプリケーションからのシングルレコードインサート
Table table = MapRDB.createTable(“/my_app/user_profiles”);
Document record = MapRDB.newDocument()
                 .set("firstName", "John")
                 .set("lastName", "Doe")
                 .set("age", 50);
table.insert("jdoe", record);
  • ImportJSONユーティリティを経由
mapr importJSON -src /maprdb/json_files/yelp/business -dst /maprdb/json/yelp/business  -mapreduce false -bulkload false -idfield business_id

MapR管理コンソールから、MapR-DB JSONテーブルを確認することができます。これでMapR-DBはbinary-like HBase、JSON-like MongoDBといった複数のデータモデルを持ちました。これで、1テーブルレベルごとに「type」を設定することができます。

MapR administration console

では、MapR-DB shellを使ってこのデータが実際に正しくDBにロードされるか確認しましょう。これはDrillによるクエリの必要条件ではありませんが、MapR-DBとインタラクトする別の方法を簡単に説明するために使いました。

maprdb root:> find '/maprdb/json/yelp/business' --limit 1
{"_id":"--1emggGHgoG6ipd_RMb-g","business_id":"--1emggGHgoG6ipd_RMb-g","full_address":"3280 S Decatur Blvd\nWestside\nLas Vegas, NV 89102","hours":{},"open":true,"categories":["Food","Convenience Stores"],"city":"Las Vegas","review_count":4,"name":"Sinclair","neighborhoods":["Westside"],"longitude":-115.2072382,"state":"NV","stars":4,"latitude":36.1305306,"attributes":{"Parking":{"garage":false,"street":false,"validated":false,"lot":true,"valet":false},"Accepts Credit Cards":true,"Price Range":1},"type":"business"}

1ドキュメントを見つけました。

maprdb root:> findbyid /maprdb/json/yelp/business --id "--1emggGHgoG6ipd_RMb-g"
{"_id":"--1emggGHgoG6ipd_RMb-g","business_id":"--1emggGHgoG6ipd_RMb-g","full_address":"3280 S Decatur Blvd\nWestside\nLas Vegas, NV 89102","hours":{},"open":true,"categories":["Food","Convenience Stores"],"city":"Las Vegas","review_count":4,"name":"Sinclair","neighborhoods":["Westside"],"longitude":-115.2072382,"state":"NV","stars":4,"latitude":36.1305306,"attributes":{"Parking":{"garage":false,"street":false,"validated":false,"lot":true,"valet":false},"Accepts Credit Cards":true,"Price Range":1},"type":"business"}

これでデータはDBに読み込まれたようです。ではDrillを通してこれをクエリしてみましょう。

まずはDrillのDBデータをクエリし、Drill web UIのストレージプラグインを設定します。

以下がサンプルストレージプラグイン設定です。MapR-DBのJSONテーブルはMapR File Systemの別のストレージフォーマットであることに注意してください。そして以下に示すようにDrillで簡単にフォーマットプラグインを作ることができます。

"yelp_maprdb": {
     "location": "/maprdb/json/yelp",
     "writable": true,
     "defaultInputFormat": "maprdb"
   },
.

簡単なDrillクエリを使って、ビジネステーブルの構造を確認しましょう。

0: jdbc:drill:drillbit=10.10.103.32> SELECT * FROM mfs.yelp_maprdb.business LIMIT 1;
+-----+------------+-------------+------------+------+--------------+-------+----------+-----------+------+---------------+------+--------------+-------+-------+------+
| _id | attributes | business_id | categories | city | full_address | hours | latitude | longitude | name | neighborhoods | open | review_count | stars | state | type |
+-----+------------+-------------+------------+------+--------------+-------+----------+-----------+------+---------------+------+--------------+-------+-------+------+
| --1emggGHgoG6ipd_RMb-g | {"Accepts Credit Cards":true,"Parking":{"garage":false,"lot":true,"street":false,"valet":false,"validated":false},"Price Range":1.0,"Ambience":{},"Good For":{},"Music":{},"Hair Types Specialized In":{},"Payment Types":{},"Dietary Restrictions":{}} | --1emggGHgoG6ipd_RMb-g | ["Food","Convenience Stores"] | Las Vegas | 3280 S Decatur Blvd Westside
Las Vegas, NV 89102 | {"Friday":{},"Monday":{},"Saturday":{},"Sunday":{},"Thursday":{},"Tuesday":{},"Wednesday":{}} | 36.1305306 | -115.2072382 | Sinclair | ["Westside"] | true | 4.0 | 4.0 | NV | business |
+-----+------------+-------------+------------+------+--------------+-------+----------+-----------+------+---------------+------+--------------+-------+-------+------+

ビジネステーブルにどれだけの記録があるか確認できると思います。

0: jdbc:drill:drillbit=10.10.103.32> SELECT count(*) FROM mfs.yelp_maprdb.business;
+---------+
| EXPR$0  |
+---------+
| 42153   |
+---------+

Drillによって、全てのオペレータやファンクションを含め、直接MapR-DB JSONテーブル上でANSI SQLをフルに活用することができます。

これはJSONテーブルでSQLウィンドウ機能を使う例です。

0: jdbc:drill:drillbit=10.10.103.32> WITH X
. . . . . . . . . . . . . . . . . .> AS
. . . . . . . . . . . . . . . . . .> (SELECT name, city, review_count,
. . . . . . . . . . . . . . . . . .> RANK() OVER (PARTITION BY city ORDER BY review_count DESC)
                                    AS review_rank
. . . . . . . . . . . . . . . . . .> FROM mfs.yelp_maprdb.business)
. . . . . . . . . . . . . . . . . .> SELECT X.name, X.city, X.review_count
. . . . . . . . . . . . . . . . . .> FROM X
. . . . . . . . . . . . . . . . . .> WHERE X.review_rank =1 ORDER BY review_count DESC LIMIT 10;
+-------------------------------------------+-------------+---------------+
|                   name                                     |    city     | review_count  |
+-------------------------------------------+-------------+---------------+
| Mon Ami Gabi                                           | Las Vegas    | 4084.0        |
| Studio B                                                     | Henderson   | 1336.0        | 
| Phoenix Sky Harbor International Airport  | Phoenix        | 1325.0        |
| Four Peaks Brewing Co                             | Tempe          | 1110.0        |
| The Mission                                                | Scottsdale    | 783.0         |
| Joe's Farm Grill                                          | Gilbert           | 770.0         |
| The Old Fashioned                                     | Madison        | 619.0         |
| Cornish Pasty Company                             | Mesa            | 578.0         |
| SanTan Brewing Company                         | Chandler       | 469.0         |
| Yard House                                                 | Glendale       | 321.0         |
+-------------------------------------------+-------------+---------------+

JSONネストデータをフラットニングすることなくDBから直接クエリすることができます。また、複雑なデータ機能とANSI SQL拡張機能についてDrill性能を使うことができます。

0: jdbc:drill:drillbit=10.10.103.32> SELECT name, stars, b.hours.Friday friday, categories
. . . . . . . . . . . . . . . . . .>   FROM mfs.yelp_maprdb.business b
. . . . . . . . . . . . . . . . . .>   WHERE b.hours.Friday.`open` < '22:00' AND . . . . . . . . . . . . . . . . . .>                  b.hours.Friday.`close` > '22:00' AND
. . . . . . . . . . . . . . . . . .>                  city = 'Las Vegas'
. . . . . . . . . . . . . . . . . .>   ORDER BY stars DESC 
. . . . . . . . . . . . . . . . . .>   limit 5;
+------------------------------------+--------+-----------------------------------+------------------------------------------------------------------------------------------+
|                name                | stars  |              friday               |                                        categories                                        |
+------------------------------------+--------+-----------------------------------+------------------------------------------------------------------------------------------+
| Peachy Keen Unions By Angie Kelly  | 5.0    | {"close":"23:30","open":"06:00"}  | ["Officiants","Wedding Planning","Event Planning & Services"]                            |
| Concierge Makeup                   | 5.0    | {"close":"23:30","open":"00:30"}  | ["Makeup Artists","Beauty & Spas"]                                                       |
| Hermès Encore                      | 5.0    | {"close":"23:00","open":"10:00"}  | ["Shopping"]                                                                             |
| Hague Quality Water                | 5.0    | {"close":"23:00","open":"06:00"}  | ["Plumbing","Home Services","Contractors"]                                               |
| The Sci-Fi Center                  | 5.0    | {"close":"23:00","open":"11:00"}  | ["Comic Books","Arts & Entertainment","Cinema","Shopping","Books, Mags, Music & Video"]  |
+------------------------------------+--------+-----------------------------------+------------------------------------------------------------------------------------------+

以前のブログでは、どのようにDrillがJSONとともに機能するか取り上げました。今はこれら全てのクエリをMapR-DBで直接実行することができました。Drillは様々な最適化 (プロジェクションプッシュダウン、フィルタープッシュダウン等) を行い、確実にクエリの高速化を行います。これはファイルに比べ、MapR-DBでデータを保存することの非常に大きな機能の長所です。

これはプッシュダウンの動作についてのわかりやすい例です。いくつかfilter predicateがある同じネストデータクエリを行なってみましょう。

SELECT name, stars, b.hours.Friday friday, categories FROM mfs.yelp_maprdb.business b
WHERE b.hours.Friday.`open` < '22:00' AND b.hours.Friday.`close` > '22:00' AND city = 'Las Vegas' ORDER BY stars DESC LIMIT  5

Drillのクエリ最適化について確認するために、EXPLAIN PLANを見てみましょう。強調している部分のように、Drillはプロジェクションプッシュダウンを行い、全ての列からではなく、DBの名前、スタート、時間、カテゴリ列のみリトライしています。また全てのフィルターをDrillに送り処理するのではなく、内在DBに渡すことでフィルタープッシュダウンを行っています。

how Drill optimizes the query

Drill 1.6にはさらに多くの便利な機能があります。MapR releaseからダウンロード可能です。

Drillを始める

フルデモンストレーションは http://drill.apache.org/docsを参照して下さい。補足情報は http://mapr.com/apachedrillで確認できます。

著者情報

Arun Nallusamy

ニーラジャ・レンタチンタラ

(MapR Technologies プロダクト・マネジメント・ディレクター)

MapR-DB : Hadoop上のNoSQLデータベースで業務及び分析ワークロードを統合

MapR-DB : Hadoop上のNoSQLデータベースで業務及び分析ワークロードを統合
MapR-DBは、エンタープライズグレードの高性能なHadoop上のNoSQLデータベースです。

MapRコンバージド・データ・プラットフォームの一機能として提供され、開発者がスケーラブルなアプリケーションを開発し、リアルタイムなデータ分析を可能とする初めてのHadoop上のドキュメントデータベス機能を提供します。

詳細についてデータシートをご確認ください。

無料ダウンロードはこちら

こちらの記事もおすすめです