※ 本記事は、Saket Bihari, Pavan Upadhyayによる”Boosting ORC file reading performance in OCI Data Flow and OCI Big Data Service using Spark“を翻訳したものです。

2023年8月31日


Apache Sparkは、Oracle Cloud Infrastructure (OCI) Data FlowやOCI Big Data Serviceなどのオブジェクト・ストレージ・サービスからOptimized Row Columnar (ORC)ファイルを読み取って処理するなど、様々なユースケース向けのビッグ・データ処理エンジンになりました。ただし、これらのクラウド・ストレージ・サービスから大規模なORCファイルを読み取ると、パフォーマンスの問題が発生する可能性があります。このブログでは、ORCファイル読取りパフォーマンスの問題にどのように対処し、特定のSpark構成をチューニングすることで大幅な改善を実現したかについてご紹介します。

遅い読み取り時間を修正する構成

SparkクラスタのOCIオブジェクト・ストレージからORCファイルを読み取ろうとすると、読取り時間が遅くなり、処理時間が長くなることがよくあります。このパフォーマンスの低下により、ボトルネックが発生し、データ処理パイプラインの全体的な効率に悪影響を及ぼす可能性があります。

Data FlowおよびBig Data上のSparkでのORCファイル読取りパフォーマンスの問題に対処するために、様々な構成を試し、著しく改善された次の設定を特定しました。:

  • fs.oci.io.read.ahead: true

  • fs.oci.io.read.ahead.blocksize: 6291456

これらの構成では、Hadoop Distributed File System (HDFS)コネクタ・バージョン3.3.1.0.3.2が使用され、Hadoop 3.3.x、Spark 3.2.1およびScala 2.12.xと互換性があります。構成を確認し、ORCファイルの読取りパフォーマンスの向上にどのように役立つかを理解しましょう。

  • fs.oci.io.read.ahead: この構成をtrueに設定すると、OCI Object Storageからデータにアクセスするときに先読み機能が有効になります。先読みにより、Sparkはより多くのデータ・ブロックを事前にフェッチできるため、データ読取り中に後続のブロックをフェッチする待機時間が短縮されます。この最適化により、Object Storageからデータをフェッチするために必要なラウンドトリップの数が最小限に抑えられます。

  • fs.oci.io.read.ahead.blocksize: この構成によって、Sparkが事前に読み取るデータ・ブロックのサイズが決まります。「6291456」(6MB)に設定すると、読取りパフォーマンスとメモリー使用率の最適なバランスがとれたことになります。この値を調整するには、特定のユース・ケースとデータ特性に基づくいくつかの実験が必要になる場合があります。

その他の構成

2つのプライマリ構成に加えて、次の例を含む最適なORCファイル読取りパフォーマンスのためにSparkクラスタをさらにチューニングするために、さらにいくつかの設定を試すことができます:

  • fs.oci.rename.operation.numthreads: この構成により、OCIオブジェクト・ストレージの操作時に名前変更操作に使用されるスレッドの数が決まります。ファイル名の変更は、特にSparkクラスタなどの分散環境では、リソース集中型の操作になります。デフォルトでは、この値は1に設定されており、名前変更操作は順番に実行されます。ただし、スレッド数を2に増やすことで、複数の名前変更操作を同時に実行できるため、ストレージ・バケット内のファイルの名前変更に必要な時間が短縮される可能性があります。

  • fs.oci.io.read.ahead.blockcount: 前述したfs.oci.io.read.ahead.blocksizeと同様に、この構成によって、OCIオブジェクト・ストレージから事前に読み取るデータ・ブロックの数が制御されます。4に設定すると、Sparkは4つのデータ・ブロックを事前にフェッチし、データを事前ロードして、データ読取り中に後続のブロックの待機に要する時間を短縮します。この設定の最適な値は特定のユース・ケースによって異なる可能性があるため、実験することをお薦めします。

前述の構成を実装すると、ORCファイルの読取り時間が大幅に短縮されました。以前は、OCI Object Storageから1.6-GB ORCファイルを読み取るのに約20分かかりました。ただし、推奨設定を適用すると、読み取り時間はわずか1分に大幅に短縮されました。この拡張により、データ処理の効率性とパイプライン全体のパフォーマンスが大幅に向上します。

試してみてください!

ビッグ・データ・アプリケーションを成功させるには効率的なデータ処理が不可欠であり、Sparkはこのような課題に取り組むための強力なツールであることが実証されています。fs.oci.io.read.aheadやfs.oci.io.read.ahead.blocksizeなどの特定の構成を細かく調整することで、OCI Data Flow、OCI Big Dataサービス、または標準SparkクラスタでのORCファイル読取りパフォーマンスの大幅な改善を実現できます。

この投稿を通じて経験とインサイトを共有することで、他のユーザーがOCI Object StorageからORCファイルを読み取るためのSparkワークロードを最適化し、同様のパフォーマンス向上を実現できるよう支援したいと考えています。これらの構成の効果は、データセットおよびワークロードの特性によって異なる可能性があるため、特定のユース・ケースに対して設定を試し、調整することが不可欠です。

ビッグ・データ・サービスおよびSparkの詳細は、OCI Data Flowサービス・ガイドBig DataサービスのドキュメントまたはApacheのSpark構成ページを参照してください。Happy Sparking!