Amazon Athena 向け JDBC および ODBC ドライバーの比較
本記事のデータは、2019年8月時点で入手可能な最新ドライバーに基づいています。
Amazon Athena は、標準 SQL を使用して Amazon S3 内のデータを簡単に分析できるインタラクティブなクエリサービスです。CData Drivers for Amazon Athena を使用すると、JDBC や ODBC などの標準ベースのインターフェースを通じて、クエリのトップクラスのパフォーマンスを実現できます。本記事では、読み取りパフォーマンスとリソース使用量を比較していきます。その結果、CData ドライバーは大規模なデータセットを Amazon ドライバーよりも約3倍速く取得し、クライアント側のリソースをより効率的に活用してパフォーマンスを向上させていることがわかりました。
準備
本記事では、以下の2組のドライバーを比較します。
- Amazon 提供の ODBC Driver for Amazon Athena 1.0.51 と CData Software ODBC Driver for Amazon Athena3
- Amazon 提供の JDBC Driver for Amazon Athena 2.0.72 と CData Software JDBC Driver for Amazon Athena4
再現可能な比較を行うために、Amazon Customer Reviews データセット5を自社の S3 インスタンスのバケットにコピーし、S3 バケットをベースにした Athena のパーティションテーブル(amazon_reviews_parquet)を作成しました。
ドライバーを並べて比較するため、マシン自体のパフォーマンスは相対的に重要ではありません。重要なのは、ドライバー同士の相対的な比較です。
比較
テーブルの詳細は以下のとおりです。
| テーブルサイズ | テーブルの行数 | カラム数 | ||
|---|---|---|---|---|
| 2.74 GB | 160,796,570 | 16 |
各ドライバーで同じクエリを実行し、関連するパフォーマンスを比較しました。使用したクエリは以下のとおりです。
- SELECT * FROM amazon_reviews_parquet LIMIT 250000
- SELECT * FROM amazon_reviews_parquet LIMIT 10000000
結果
JDBC ドライバーでは、基本的な Java アプリケーションで java.sql ライブラリを使用して Athena に接続しました。ODBC ドライバーでは、サンプル C プログラムから DSN を使用して Athena に接続しました。すべての行の各フィールドの結果を読み取り、保存しました。以下のチャートに示されている時間は、複数回の実行の平均値に基づいています。これにより、ネットワークトラフィックのスパイクなどによる外れ値を平準化しています。
| ドライバー別クエリ時間(秒) | ||||
|---|---|---|---|---|
| クエリ | CData JDBC | Amazon JDBC | CData ODBC | Amazon ODBC |
| 25,000 行 | 15.43 (105.1% 高速) | 31.67 | 18.14 (161.8% 高速) | 47.50 |
| 10,000,000 行 | 333.66 (179.1% 高速) | 931.23 | 353.03 (311.3% 高速) | 1,451.99 |
結果からわかるように、CData ドライバーは大規模な結果セットを扱う際に Amazon ドライバーを大幅に上回り、大規模なデータセットの取得と処理を Amazon ドライバーよりも約3倍速く行いました。
JDBC ドライバーのリソース使用量
JDBC ドライバーの読み取りパフォーマンスをテストする際に、クライアント側のリソース使用量(特にメモリと CPU 使用量)も計測しました。以下のチャートは、サンプル Java プログラムを実行し、Java VisualVM を使用して CPU とメモリ使用量をキャプチャして得られたものです。Java バージョン 8 アップデート 211 を使用し、最大ヒープサイズは 4.27 GB に設定しました。
この比較では、1,000万行を取得するクエリを実行しました:SELECT * FROM amazon_reviews_parquet LIMIT 10000000
* ヒープグラフのスケールが異なることにご注意ください。
グラフから、両方のドライバーが Amazon Athena にリクエストを送信し、レスポンスを待機していることがわかります。Athena がクエリ結果を返し始めると、ドライバーはその処理を開始します。
CData ドライバーは大部分のデータを迅速に取得・処理し、最初の1分間は平均約 600 MB のヒープを使用し、その後大部分のデータが処理された後は約 150 MB を使用します。CPU 使用量のグラフを見ると、CData ドライバーはトランザクションの大部分で利用可能な CPU の約 25% を一貫して使用し、その後平均約 15% に低下しており、データが返されるのと同じ速さで一貫して処理していることがわかります。
ネイティブドライバーは Athena がレスポンスを返すとすぐに処理を開始するようですが、トランザクション全体を通じて CPU 容量とヒープの使用量が少なくなっています(CPU 容量の約 17%、ヒープ使用量約 150 MB を平均)。この CPU とヒープ使用量の低さが、結果の処理に長い時間がかかる原因となっています。
ODBC ドライバーのリソース使用量
ODBC ドライバーのテスト中にも、クライアント側のリソース使用量(特にネットワークと CPU 使用量)を計測しました。以下のチャートは、サンプル C プログラムを実行し、Windows リソースモニターを使用して得られたものです。
この比較では、1,000万行を取得するクエリを実行しました:SELECT * FROM amazon_reviews_parquet LIMIT 10000000
* ネットワークグラフのスケールが異なることにご注意ください。
各ドライバーのサンプル C アプリケーションの同じウィンドウ(Athena がクエリ結果を返し始めた後)をキャプチャしています。グラフに基づくと、CData ODBC ドライバーはデータの取得と処理を同時に行い、約 200 Mbps でデータを取得しています。ネイティブドライバーも同様にデータの取得と処理を同時に行っているようですが、約 50 Mbps と、CData ドライバーの約 1/4 の速度でしか処理できていません。
まとめ
CData ドライバーのパフォーマンスは、Amazon 提供のドライバーをはるかに上回っています。当社の開発者は、Amazon から返される結果の処理パフォーマンスを最適化するために数え切れないほどの時間を費やしてきました。その結果、ドライバーはネットワークトラフィックとサーバー処理時間によってのみ制限されているように見えるほどになっています。このパフォーマンスは、大量のデータを処理する必要がある場合に特に顕著です。



