2014年7月17日木曜日

データ連携の基本テクニック「中間データストア」のポイント

みなさんこんにちは。大須賀と申します。

私は製品開発部門で、Waha! Transformerという製品を開発しています。

今回、こちらのブログで「データ連携・統合」をテーマに連載をさせていただくことになりました。私たちは、IBM、富士通、日立のメインフレームをベースとして、ミニコン/Unixの黎明期からOS2、WindowsNT等のPC系サーバーがビジネスに採用されて現在に至るまで、様々な異機種間のデータ移行を経験してきました。
データの移行や交換には様々なノウハウがありますが、それらをこちらのブログで公開していこうと考えていますが、技術的な解説はもちろんですが、実質的な現場の標準や、冗談のようなトラブル話など、楽しく語っていければと思っています。

どうぞよろしくお願いします。




さて、最初の話題です。

データ連携を行う際、さまざまなデータ加工処理が動作しますが、処理を効率化するために、中間的なデータストアを使用して、初期加工済みのデータを投入し、そこから複数の詳細な加工処理を動作させる例をよく見かけます。セントラルウェアハウスほどではありませんが、冗長な加工処理を省くために有効な手法です。



 このような中間データストアにデータベースを使用するのはよくあることですが、速度等の効率についてはどうなのでしょうか。

以下に、自社で計測してみた結果を掲載します。

評価対象は主要な有償データベースとオープンソースデータベースです。ローダーは、各社データベースで通常ロードと高速ロードがある場合、それぞれ別に計測して記載しました。



Insertと単純READは当社ETLツールを使用しています。ODBCによる書き込みなのですが、秘伝の(笑)高速書き込みアルゴリズムを使用しているため、生半可なアプリより数十倍は高速です。各RDBの通常ロードよりInsert処理の方が速い事にご注目ください。

こうして計測してみると、さすがに有償データベースはオープンソースとは速度のレベルが違うようです。しかし、今回はデータ加工の中間データストアとしての利用パターンであり、大量データを一気に書き込む時間の比較ですので、OLTPのような使い方とは大きく異なる事を申し添えておきます。

中間データストアのデータベースに、有償データベースを使用するのはコスト上許されないと言うことであれば、MySQLでMyISAMを使用するのがよいかもしれません。しかし、有償データベースの多くは、制限はあるものの無償版がありますので、利用実績のあるデータベースであれば、その無償版を使用するのも手かもしれませんね。

ただ、データを絞り込む程度では中間データストアにデータベースを使用するのはあまり意味がありません。後続処理がさまざまなビューでデータを参照したり、複雑なジョインをデータベースに任せたりする場合には有効ですが、一時的に貯めて一括処理するだけなら、CSVだけでも十分なのではないでしょうか。ただしその際には、ETL機能がCSVを対象にした十分な加工機能を持っていることが前提となります。

まとめますと、中間データストアの選択は、以下のように考えられます。
  1. ETLに十分な加工機能があるなら、CSVファイルで保存
  2. 用途が限られるのであれば、無料のオープンソース
  3. ノウハウに問題が無いなら、有償データベースの無償版
  4. 予算があれば有償データベース
選択時には、システムの規模、重要性、利用期間(短期、長期)にも考慮が必要ですね。

さて、オマケですが、中間データストアにMySQLを使用する場合、V5.1までのバージョンでは、「サーバーからクライアントへのデータ引き渡しがタイムアウトしたときのエラーが通知されない」という障害があります。クエリーを出して、ODBC APIからデータを受け取る間になにか処理をしていて時間が空いたときに発生するのですが、この問題が発生すると、ODBCドライバがキャッシュとして先行で受け取った分だけの中途半端なデータで処理が継続されてしまうため、致命的です。

この問題はmy.iniでパラメータ「net_write_timeout」の値を大きくすることで緩和されますが、エラーが通知されないため、もし現象が発生してデータが不完全になっても、それを知る手段がありません。現在のところ、改善されたという文書は残念ながら発見できていませんが、V5.5、V5.6では改善されているようですので、最新版のV5.6を使用する事で回避できます。

オープンソースは無償で使用出来て、シェアが大きければネット上に情報も多いのですが、このような問題が起きた場合にメーカー問い合わせができないのは痛いですね。


0 件のコメント:

コメントを投稿