OCI HDFSコネクタの使用

OCI Hadoop Distributed File System (HDFS)コネクタを使用すると、オブジェクト・ストレージに対してApache Hadoopアプリケーションによるデータの読取りと書込みが可能になります。

重要

これは、ビッグ・データ・サービス3.0.4以前用です。バージョンが3.0.4以降の場合は、オブジェクト・ストレージAPIキー統合を使用してオブジェクト・ストレージに接続します。ビッグ・データ・サービスのバージョンが、「クラスタ詳細」ページの「クラスタ情報」タブに表示されます。

一般的なチューニング・ガイドライン

OCIオブジェクト・ストレージ・ファイル・システムに対してワークロードを実行する際のビッグ・データ・サービスの一般的なチューニング・ガイドラインに従って、中規模/大規模ワークロードに対して効果的なパフォーマンスと信頼性を確保します。

読取りチューニング

デフォルトでは、Hadoopアプリケーションによって作成されたInputStreamは、オブジェクト・ストレージ・サービス(OSS)クライアントによって生成されたInputStreamの基本ラッパーです。ただし、パフォーマンスの最適化はありません。

読取り速度を向上させるには、読取りキャッシュに関連する次のパラメータを使用します。

事前チューニング構成の確認

  • fs.oci.io.read.ahead=true
  • fs.oci.io.read.ahead.blocksize=6291456
  • fs.oci.io.read.ahead.blockcount=4
  • fs.oci.rename.operation.numthreads=2
ノート

ワークロード・パターンおよびパフォーマンス・ベンチマークに基づいて、ブロック・サイズ、スレッド数またはキャッシュの有効化/無効化を調整できます。これらは、アプリケーションがファイル全体を順番に読み取るdistcp、Trinoワークロードなどのワークロードに特に役立ちます。

Parquetメタデータ・キャッシング

  • fs.oci.caching.object.parquet.enabled=true: このパラメータは、RAM内のParquetフッター・メタデータのキャッシュをアクティブ化します。
  • fs.oci.caching.object.parquet.spec: このパラメータを使用すると、キャッシュ動作をファインチューニングできますが、その使用はオプションで、特定のワークロード要件によって異なります。

Parquetフッター・キャッシュを有効にすると、特に同じファイルに複数回アクセスする場合やメタデータが比較的静的な場合に、Parquetファイルの読取りパフォーマンスを大幅に向上できます。このキャッシュ・メカニズムにより、重要なメタデータがメモリーで簡単に使用できるようになり、Parquetファイル自体からメタデータを繰り返し読み取る必要がなくなります。RAM内のParquetフッターのキャッシュを有効にするには、前述のパラメータを設定します。

Parquetメタデータ・キャッシュは、メタデータ全体を迅速にキャッシュしてアクセスできるようにするため、ブロック数が1の場合に最も効果的です。ブロック数が1より大きい場合、メタデータ・キャッシュの有効性は、ワークロードおよびアプリケーションの読取りパターンによって異なります。ファイル全体を読み取るdistcpなどのワークロードは、より高い並列性とblockcount設定の恩恵を受けることができます。一方、Parquetファイルから特定の列を読み取るSparkなどのアプリケーションには、これらの設定の関連性を低下させる独自の最適化戦略がある場合があります。

書込みチューニング

デフォルトでは、HDFSコネクタは、HDFSファイルに書き込まれるデータをバッファするために、ディスク上にローカル一時ファイルを生成します。次のHDFSコネクタ構成を参照してください。

  • fs.oci.io.write.multipart.inmemory: この構成により、upload-as-you-goプロセスが有効になります。これをtrueに設定すると、ファイル全体がディスクにバッファされるのを待たずに、書込みサイズが事前定義済のパート・サイズに達するとすぐに、コネクタはObject Storage Serviceへのデータ・パートのアップロードを開始します。
  • fs.oci.client.multipart.numthreads: この構成では、マルチパート・アップロードに使用するスレッド数を指定します。一般的なファイルの予想されるチャンク数に基づいてスレッド数を作成することをお薦めします。一般的なガイドラインとして、エグゼキュータごとにvCPUsの数の2倍に設定します。この構成により、アップロード中のデータ・パートのパラレル処理が保証されます。
  • fs.oci.client.multipart.partsize.mb: この構成では、マルチパート・アップロードの各データ・パートのサイズをMB単位で定義します。ファイル・サイズを均等に分割する64MBに最も近いチャンク・サイズを使用することをお薦めします。たとえば、ファイル・サイズが640MBの場合、パート・サイズが64MBの場合、チャンクは10になります。
  • fs.oci.client.multipart.minobjectsize.mb: この構成では、マルチパート・アップロードが有効な最小オブジェクト・サイズをMB単位で指定します。指定したサイズより小さいオブジェクトは、マルチパート・アップロードではなく標準のPutObjectリクエストを使用してアップロードされます。これは、小さいファイルのパフォーマンスを最適化するのに役立ちます。
  • fs.oci.client.md5.numthreads: この構成は、MD5ハッシュ値を非同期的に計算するためのスレッド数を設定します。MD5ハッシュは、転送中にデータの整合性を検証するために使用されます。専用スレッド・プールを確立することで、MD5ハッシュの計算をデータ・パートのアップロード・プロセスと同時に実行できるため、全体的な効率が向上します。

一部のチューニングは、ファイル・サイズに基づきます。一般に、マルチパート・アップロード(デフォルトで有効)を介して、ファイルを32から128MBのチャンクとして書き込みます。明示的なチューニングの場合、X MBのファイル・サイズには、Xを均等に分割する64MBに最も近いマルチパート・チャンク・サイズを使用します。たとえば、Xが640MBの場合、10個の64MBのチャンク(偶数)を取得します。Xが641MBの場合、10個の64MBチャンクと1個の1MBチャンクが取得されます。チャンク・サイズが65MBの方が適しています。ただし、デフォルトの起動では、次のチューニングでNを64(64MB)に設定します。

次に、スレッド数(M)は、一般的なファイルのチャンクの数です。一般に、これはエグゼキュータごとに2 * vcpusです。転送のX * Mバイトのヒープが返されるため、小さいヒープに収まるように調整する必要がある場合があります。

ビッグ・データ・サービス・クラスタからのHDFS Connectorの使用例

オブジェクト・ストレージ・バケットおよびその他のリソースにアクセスするには、必要なIAMポリシーが作成されている必要があります。

  • Hadoop
    hadoop fs -ls oci://<bucket-name>@<namespace>/
  • Spark
    import org.apache.spark._
    val conf = sc.getConf
    val test_prefix = sc.textFile("oci://<bucket-name>@<namespace>/")
    test_prefix.toDF().show()

参照: HDFSコネクタのURI形式