データベースとHadoopの連携
Hadoopのしくみとデータベースシステムとの対比
HadoopはGoogleの分散処理基盤システムを紹介した論文をもとに、Apacheコミュニティにて開発されたオープンソースの分散処理システムです。分散処理環境の構築に汎用ハードウェアを活用し、MapReduceと呼ばれる比較的シンプルな分散処理フレームワークを導入することにより、これまでは困難であった分散処理アプリケーション構築のハードルを大きく下げ、大規模データ処理の基盤として活用する事例も増えてきています。
Hadoopのコアの部分は、Hadoop Distributed File System (HDFS) という分散ファイルシステムと、MapReduce分散処理フレームワークが密接に組み合わされて構成されています。Hadoopでデータを処理する場合には、まずデータはファイルとしてHDFS上に格納されますが、HDFSはデータを固定長のブロックに分割した上で複数のノードに分散して配置します。そしてHadoopジョブの実体であるJavaで記述されたMapReduceプログラムが各ノードに送られ、各ノードに配置されたデータブロックを入力として並列に処理を行います。
ところでこのようなHadoopの処理のしくみを読んで、HadoopとGreenplum DBは結構似ているのではないかと思われる方がいるかもしれません。実際、汎用ハードウェアやLinuxをベースにスケールアウト型の処理基盤を構築する点や、データを完全分散するシェアードナッシング型のアーキテクチャに基づいている点、バッチ系の処理に大きな効果がある点などは共通しています。その意味で、両者ともビッグデータ時代の大規模データ処理基盤にふさわしい技術をベースにしていると言えます。
一方で、大きく異なる点もあります。Greenplum DBはリレーショナルデータベースなので、テーブル構造や処理クエリをあらかじめ設計した上でデータをそれに合わせて格納するのが一般的です。また、すべての処理はトランザクションとして扱われ、データベースゆえにACIDの性質をもつことは大前提です。しかしながらHadoopでは、データ格納時は単にファイルとして扱われるだけなので、特に構造を定義しておく必要はありません。そしてMapReduceプログラムの実行時に初めてデータをどのように解釈して処理して行くかということが示されます。さらに、Hadoopの処理はACIDの性質を捨てることで分散処理における可用性や効率性を追求しています。
Greenplum DBとHadoop連携の例とメリット
Greenplum DBはバージョン4.1でHadoopとの連携機能をサポートしました。以下では、Greenplum DBをHadoopと連携して利用することのメリットと、具体的な連携方法について解説します。
上で述べたようにリレーショナルデータベースとHadoopでは、データの扱いに関するアプローチが大きく異なるため、対象の処理の性質に応じてうまく使い分けていくことが重要です。
まず1つの見方として、処理対象のデータの形式による使い分けが考えられます。データソースが既存システムのデータベースで、すでに構造化されているデータをデータウェアハウスに統合するというケースであれば、データ構造をそのまま利用できるGreenplum DBを利用することでデータ移行のコストやリスクを減らすことができます。Webアプリケーションのログや画像のような、通常のデータベースでは扱いにくい完全には構造化されていないデータであれば、Hadoopにファイルとして格納して柔軟なデータ加工や抽出処理を行うことが適するケースも多いでしょう。
別の見方としては、ユーザーの使い勝手の観点からの使い分けも考えられます。Hadoopは急速に普及を拡大している技術ではありますが、現時点では対応ツールや既存システムとの連携手段が十分に整っていない状況です。また、Hadoopアプリケーション開発は自由度が高く様々な処理を記述できる反面、データ構造の定義や性能の最適化など開発者にゆだねられる部分も多く難易度は高いです。一方、Greenplum DBの実行エンジンは、長年の稼働実績と進化の歴史を経た技術をベースとしており、データ構造やデータの内容をもとに分散配置が行われるためデータベースエンジンに性能の最適化を任せることができます。
このように、リレーショナルデータベースとHadoopにはそれぞれ得意とする領域がありますが、両者を連携させることでお互いを補完する柔軟性の高いシステムになります。
図2にGreenplum DBとHadoopを連携させた情報系システムの例を示します。ここではGreenplum DBを企業の情報システムの中心となるデータウェアハウスとして利用しています。業務系のデータは、企業内の各部門で管理している複数のデータベースからロードされてGreenplum DB内に格納されますが、これらのデータはすでに構造化されているため直接ロードすることが可能です。これに加え、自社のWebサービスを利用するユーザーの行動履歴を広告・マーケティングに使うことを目的としてWebログの活用を考える場合、ログは非定型のフォーマットで不要な情報も含まれているため、まずはHadoopに格納してデータを加工・抽出することとします。そしてHadoop上での処理を経て構造化されたデータをGreenplum DBに取り込むことで、業務系データと合わせた横断的な分析の準備が整います。分析に使用するBIツールやSQLベースのアプリケーションはGreenplum DBに接続して様々な分析やレポーティング処理を実行する一方で、一部のWebアプリケーションなどはHadoopプラットフォームにアクセスして柔軟性の高いデータ処理基盤を直接利用することもあるかもしれません。
Greeplum DBのHadoop連携における外部テーブルの定義とデータ移動のしくみ
リレーショナルデータベースとHadoopの間の連携にはさまざまなパターンがあります。最近ではどのデータベース/データウェアハウスベンダーもHadoopとの連携に力を入れて機能を用意しておりますが、製品によってそのしくみは異なるため、実際にはデータの転送時間や使い勝手で差が出てきます。特に両者間でデータアクセスを行う場合にどのような連携方法があるか、以下の3つのパターンを見てみましょう。
1. データベースからデータをファイルにダンプし、Hadoopの転送コマンド(実質的にはJava APIを経由)でファイルをHadoopのファイルシステムに投入する
どの製品でも対応可能な非常にシンプルな方法ですが、データを一時格納するためのファイルシステム領域が必要です。また、データベースからのデータのダンプ、Hadoopへの転送の両方がボトルネックとなり得るため(特にJavaプロセスがボトルネックとなりがち)、性能はあまりよくありません。
2. Hadoop上でSqoopを利用して並列にデータを転送する
Hadoopで動作するデータのインポート/エクスポートツールSqoopを利用してデータを転送する方法です。データベース製品側でSqoop対応を明示している場合もありますし、JDBCで接続することも可能です。データの一時ストレージが不要で、MapReduceジョブとして多数のプロセスで並列にデータアクセスを行うため、効率的に転送を行うことができます。ただし、データベース側の処理が完全には並列化されていないケースも多く、さらにMapReduceジョブが起動されるため一定の時間的なオーバーヘッドを計算に入れておく必要があります。
3. Hadoopファイルシステムを対象としたGreenplum DBのパラレルローディング
Greenplum DBはHadoopのHDFS上にあるデータのアクセスに、通常のデータのパラレルローディングと同じしくみを利用します。Greenplum DBの複数のセグメントサーバは、HDFS内部で分散配置されているデータブロックをHDFS APIを介して並列に直接アクセスするため、ボトルネックのない効率的なデータアクセスを実現しています。データベース上ではHDFS上のファイルは外部テーブルのデータソースとして抽象化されているため、開発者はSQLで外部テーブルに対する処理を記述するだけで、Hadoopを意識することなくデータを利用できます。
このように、Greenplum DBのユニークなHadoop連携機能を利用することで、データベースとHadoopをシームレスに連携することが可能になり、データ活用の幅が大きく広がります。
さて、次回はいよいよ連載最終回。高度な統計解析分析を可能にし、処理のスケーラビリティを向上させるIn-Database分析技術について触れてみたいと思います。