TOP>企業情報>コラム>技術情報>IoT、ビッグデータの高速分析機能が強化されたVertica 7.2

IoT、ビッグデータの高速分析機能が強化されたVertica 7.2

Vertica

情報系システムのパフォーマンス改善、運用管理コスト削減に貢献するデータベース、「Vertica」。2015年末にリリースされたVertica 7.2では、IoTやビッグデータの高速分析機能がさらに強化されました。本稿では、そんなVertica 7.2の代表的な新機能についてご紹介します。



Verticaは、高い検索パフォーマンスを実現する「DWH/ビッグデータ活用」に特化した列指向(カラムナー)データベースです。

※Verticaの基礎を知りたい方は、アシスト Vertica技術情報サイトの「 Verticaとは 」をご確認ください。

2015年末にVerticaの最新バージョンである、Vertica 7.2がリリースされました。Vertica 7.2では、IoTデータなどのデータストリーミング分析のためにApache Kafkaとの連携が強化されたり、Hive等Hadoopで使われることが多いORCファイル上で直接クエリが実行できるようになったりと、これまで以上にIoTデータやビッグデータ分析の高速化に力を入れています。

また、こういった新機能だけでなく、主キー/一意キー制約や、バックアップ/リストア機能の強化といった、エンタープライズ向けの機能も強化されています。

Vertica 7.2で追加された主な新機能は次の通りです。

  • 「Apache Kafka」分散型メッセージングシステムのネイティブサポート
  • データロード時の主キー/一意キー制約列に対する一意性チェック機能の追加
  • HASH JOINの性能向上や、ヒント句のサポートといったクエリの最適化
  • データロード時のParserとしてAvro Parser、CSV Parserの追加
  • 解析関数(NTH_VALUE)、算術関数(COSH、SINH、TANH、LOG10)の追加
  • JDBC接続のMARS対応やPythonドライバーの追加といったクライアント接続機能の強化
  • スキーマレベルの権限継承機能の追加
  • プロセスレベルのハング検知機能追加といったデータベース管理機能の強化
  • バックアップ・リカバリ機能の強化
  • Flex Zoneライセンス体系の変更

この中から、まずはIoTデータとビッグデータ分析をより便利にする以下の2つの新機能をご紹介します。


1. Apache Kafkaと連携することで、大量データのデータストリーミング分析を実現


Verticaへのデータロードは、COPYコマンドを用いたCSVファイルのバルクロードで実施する方法が一般的です。INSERT文も使用できますが、Verticaのような列指向データベースは1件1件のINSERT処理よりも、ある程度まとまった件数をロードするバルクロードに向いています。

そのため、これまでのバージョンでは、IoT端末が生成する大量のログデータやTwitterのつぶやきデータ等の逐次発生するデータをリアルタイムで取り込むことは難しいというのが現実でした。(ETLツール等を用いて、少量のデータを逐次COPYコマンドでロードするような仕組みを作れば実現できますが、そういった仕組みはデータ同期等のことを考えると複雑になりがちです)

Vertica 7.2では、オープンソース分散型メッセージングシステムの「Apache Kafka」(以下Kafka)のネイティブサポートを提供することで、これらのデータをニア・リアルタイムで取り込むことが可能になりました。

図1:Kafka連携機能を利用してTwitterのつぶやきデータを取り込む場合の構成例

図1:Kafka連携機能を利用してTwitterのつぶやきデータを取り込む場合の構成例

例えばTwitterのつぶやきデータを分析したい場合は、図1のような構成で実現することができます。TwitterのつぶやきデータをApache Flumeやfluentdなどを使って収集し、Kafkaに送信します。Kafkaには送られてきたデータがキューとしてKafka Cluster内に次々と溜まっていきます。このキューに溜まっているデータの中から、分析に使用するデータをVerticaが一定間隔で受け取りに行き、内部的にCOPYコマンドを使ってVerticaにロードします。

このように、INSERTではなくVerticaが得意とするCOPYコマンドを使用したバルクロードとして処理することで、ログデータ等の逐次発生するようなデータをVerticaにリアルタイムに取り込むことが可能です。ロードしたデータについては通常のテーブルに格納されるので、すぐに分析を行うことができます。

次に、Kafkaと連携させるために、事前にVertica側で実施しなければならない内容について説明します。

1. Kafka スケジューラの定義(vkconfig schedulerコマンド)
接続先のKafkaサーバの情報や、Kafkaにデータを取得しに行く間隔(図1の場合は10秒間隔)等を指定します。

2. データロード用のターゲットテーブルの作成(CREATE [FLEX] TABLE)
Kafkaから取得したデータをロードするためのテーブルを作成しておきます。構造化できないようなデータの場合は、半構造化データを扱えるFlex Tableを作成しておくと良いでしょう。
※Flex Tableについては後述する「Flex Tableとは?」を参照してください。

3. Kafka Topicとターゲットテーブルの関連付け(vkconfig topicコマンド)
KafkaではデータをTopicという単位で分類して格納しています。取り込みたいKafkaのTopicとロード先のVerticaのテーブルとの関連付けを行います。

4. Kafkaスケジューラの実行(vkconfig launchコマンド)
設定した内容でkafka連携を開始するためのコマンドを実行します。

Kafka連携がネイティブサポートされたことで、このようにわずか4つのコマンドを実行するだけで、KafkaのデータをVerticaに取り込むことが可能になりました。

Kafka連携時の具体的な手順については、アシストが運営するVertica技術情報サイトの「Apache Kafka連携機能を利用して、Verticaにストリーミングデータをロードする(7.2新機能) 」で紹介しています。

2. Flex Tableが通常ライセンスで利用可能に


Verticaでは 通常の構造化データを扱うテーブル以外に、Flex Tableという半構造化データを扱うテーブルを作成することができます。Flex Tableを利用する場合、Vertica 7.1までは通常のライセンスとは別のFlex ZoneというFlex Table用のライセンスが必要でした。

しかし、Vertica 7.2からは、Flex Tableのデータも通常ライセンスの範囲内で使用できるようになったため、より気軽に利用できるようになりました。

参考:Flex Tableとは?
Flex Tableを作成することで、Verticaで半構造化データを扱うことができます。例えば、Twitter APIを使用して取得したJSONフォーマットのつぶやきデータを、CSV形式に変換することなくダイレクトにFlex Tableにロードし、そのまま従来のSQLで検索することができます。

Flex tableの利用例


1. CREATE FLEX TABLE文でFlex Tableを作成します。

 テーブルの作成時はデータ型を指定する必要はありません。

2. COPYコマンドでJSON形式のデータをロードします。

 ※補足※ 山に関するKey-Value型のJSONデータサンプル(mountain.json)

3. ロードしたデータは、通常のテーブルのように利用することができます。

 この場合は、元データのKeyがname、type、heightのデータを検索しています。存在しないKeyについてはheight列の
 2行目のように表示されません。

また、Vertica 7.2ではエンタープライズ向けの機能も強化されています。以降ではエンタープライズ向けに強化された機能の中から以下の3点をご紹介します。


3. 主キー/一意キー制約のロード時の自動チェックが可能に


Vertica 7.1でも主キー/一意キー制約自体はサポートされていますが、これは主にオプティマイザがクエリの実行計画を決定する際の判断材料として使用するものであり、データロード時に一意性のチェックを行ってくれるものではありませんでした。一意性の担保は、Verticaにロードする前段階のETLツール等でも対応できますが、やはりデータベース側で制御したいという要望も多くありました。

このような要望に応え、Vertica 7.2からは一般的な汎用RDBMSのように、データロード時に一意性のチェックが行えるようになりました。

ロード時に一意性のチェックを行うと、チェックを行わない場合と比較して10%ほどロード時間が長くなります。(弊社検証結果)

なお、これまでのバージョンと同様に、主キー/一意キー列が存在する場合でも、ロード時には一意性をチェックしないように設定することも可能です。

その場合でもロード後にデータの重複をチェックするコマンドを実行し、重複データがないか確認することができます。具体的な方法はアシスト技術情報サイトの「テーブル内の重複データを確認する方法 」をご確認ください。

4. バックアップ・リカバリ機能の強化


Verticaでは、付属のpythonスクリプトを使用して、オンラインでのバックアップが可能です。バックアップはデータベース(フルバックアップ)、スキーマ、テーブル単位で取得することが可能です。しかし、Vertica 7.1まではフルバックアップから特定のテーブルのみをリストアすることはできませんでした。そのため、例えば誤った更新をした際に、そのテーブルのみをリストアしたい場合、フルバックアップとは別にテーブルレベルのバックアップを別途取得しておく必要がありました。

図2:テーブルレベルのリストアイメージ

図2:テーブルレベルのリストアイメージ

Vertica 7.2からはデータベース、スキーマ単位で取得したバックアップの中から、特定のスキーマ、テーブルを選択してリストアすることができるようになりました。これにより、バックアップ時間の短縮、バックアップ領域の節約が可能になりました。

また、ノードダウン後のリカバリについても、機能強化が行われています。

Vertica 7.1まではリカバリ処理中は全テーブルに対してロックがかけられるため、リカバリが完了するまではDML/DDLは実行できませんでしたが、Vertica 7.2からはリカバリが完了したテーブルから順次ロックが解放されるようになりました。

なお、リカバリを優先するテーブルを設定することもできるため、例えば更新が発生するテーブルを優先してリカバリを行う対象と設定することで、業務への影響を最小限に留めることができます。

5. ヒント句でプロジェクションや結合タイプの強制が可能に


Vertica 7.2からはSQLヒントが使用可能になりました。Verticaにはパフォーマンス向上を目的としたプロジェクションというオブジェクトがあります。(プロジェクションについてはアシストVertica技術情報サイトの「プロジェクションの概要 」をご確認ください。)

例えば、Verticaは1つのテーブルに対して複数のプロジェクションを作成できますが、使用されるプロジェクションを明示的に指定したい場合はヒントを使用します。(ヒントを使用しない場合はオプティマイザが最適なプロジェクションを選択してくれます)

t1テーブルの検索時に、t1_test_proプロジェクションの使用を強制させたい場合の例


その他にもJOINの結合タイプ(HASH JOINかMERGE JOIN)を強制したり、あらかじめ保存しておいた実行計画の使用を強制するようなヒントも追加されました。これにより、例えばバージョンアップでオプティマイザの挙動が変わった場合も、以前と同じ実行計画でクエリを実行できるようになります。


いかがでしたでしょうか?

Vertica 7.2では、Kafka連携等の新機能追加により、これまで以上にIoTやビッグデータの高速分析が可能になりました。また、こういった先進的な新機能だけでなく、データロード時の一意性チェック機能等の既存機能も強化され、エンタープライズ向けのデータベースとしての安心感や使い勝手が大きく向上しています。

今回は5つの機能に絞ってご紹介しましたが、ご紹介しきれなかったVertica 7.2の新機能の詳細については、順次アシストの技術情報サイトで公開していきますのでお楽しみに!

Vertica技術情報サイト
本サイトでは、Verticaをより手軽に正しくお使いいただくために、既にお使いの方だけでなく、ご検討中の方にも役立つ情報を発信していますので、ぜひご覧ください。


執筆者紹介

佐伯竜輔

佐伯 竜輔(Ryusuke Saeki)

株式会社アシスト データベース技術本部 技術開発部

入社後eラーニング製品、MySQL、InfiniDBのサポートに従事。現在は、Verticaのフィールドエンジニアおよびサポート担当として活動中。『SQL逆引き大全363の極意』共著。


Facebookで情報をお届けしています

Facebookでは、アシストの「今」を週3回のペースでお届けしています。「めげない、逃げない、あまり儲けない」を合言葉に日々頑張っておりますので、応援よろしくお願いします。



ページの先頭へ戻る