データ・フローの開始

Oracle Cloud Infrastructureデータ・フローについて、それが何か、それを使用する前に何を行う必要があるか(ポリシーとストレージの設定、データのロード、Sparkアプリケーションのインポートとバンドル方法など)について学習します。

Oracle Cloud Infrastructureデータ・フローとは

データ・フローは、豊富なユーザー・インタフェースを備えたクラウドベースのサーバーレス・プラットフォームです。これにより、Spark開発者およびデータ・サイエンティストは、クラスタの必要性、オペレーション・チームまたは高度に特化したSparkの知識がなくても、任意のスケールでSparkジョブを作成、編集および実行できます。サーバーレスとは、ユーザーがデプロイまたは管理するインフラストラクチャがないことを意味します。これは、完全にREST APIによって駆動されるため、アプリケーションやワークフローとの統合が容易です。可能なこと:

  • Apache Sparkデータ・ソースに接続する。

  • 再利用可能なApache Sparkアプリケーションを作成する。

  • Apache Sparkジョブを数秒で起動する。

  • SQL、Python、Java、Scalaまたはspark-submitを使用してApache Sparkアプリケーションを作成する。

  • 単一のプラットフォームからすべてのApache Sparkアプリケーションを管理する。

  • データ・センターのクラウドまたはオンプレミスのデータを処理する。

  • 高度なビッグ・データのアプリケーションに簡単に組み入れることができる、ビッグ・データの構築ブロックを作成する。

データ・フローSparkオンデマンドを表すボックスがあり、そこから「処理済」のラベルの付いた矢印がオブジェクト・ストレージに向かっています。オブジェクト・ストレージの下には、別のボックスが2つあり、それぞれからそこへの矢印が付いています。一方のボックスはSparkアプリケーションを表し、もう一方はRawデータを表します。オブジェクト・ストレージからデータ・フローSparkオンデマンドへの、SparkアプリケーションとRawデータのフローを示す2つの矢印があります。

データ・フローを開始する前に

ノート

Oracle Cloud Infrastructureコンソール、APIまたはCLIを使用してクラウド・リソースに説明、タグまたはわかりやすい名前を割り当てる場合、機密情報を入力しないでください。これは、データ・フローでアプリケーションを作成または編集する場合に適用されます。

データ・フローの使用を開始する前に、次が必要です:

  • Oracle Cloud Infrastructureアカウント。トライアル・アカウントは、データ・フローのデモに使用できます。
  • Oracle Cloudサービスのサービス管理者ロール。サービスがアクティブ化されると、Oracleによって指定されたアカウント管理者に資格証明およびURLが送信されます。アカウント管理者は、サービスへのアクセスを必要とする各ユーザーのアカウントを作成します。
  • 次のようなサポート対象ブラウザがあります:
    • Microsoft Internet Explorer 11.x以上

    • Mozilla Firefox ESR 38以上

    • Google Chrome 42以上

  • A Spark Application  uploaded to Oracle Cloud Infrastructure Object Storage. Do not provide it packaged in a zipped format such as .zip or .gzip.
  • 処理のデータをOracle Cloud Infrastructureオブジェクト・ストレージにロードします。データは外部データ・ソースまたはクラウドから読み取ることができます。データ・フローは、Oracle Cloud Infrastructureオブジェクト・ストアに格納されているデータのパフォーマンスとセキュリティを最適化します。
  • サポートされているアプリケーション・タイプは次のとおりです。
    • Java
    • Scala
    • SparkSQL
    • PySpark (Python 3のみ)
  • この表は、データ・フローでサポートされているSparkバージョンを示しています。
    サポートされているSparkのバージョン
    Sparkバージョン Hadoop Java Python Scala Sparkドキュメント
    Spark 2.4.4 2.9.2 1.8 3.6.8 2.11.12 Sparkリリース2.4.4ガイド
    Spark 3.0.2 3.2.1 1.8 3.6.8 2.12.10 Sparkリリース3.0.2ガイド
    参照用であり、包括的なものではありません。

管理の設定

データ・フローでアプリケーションを作成、管理および実行する前に、テナント管理者(またはバケットを作成してIAMを変更するための昇格された権限を持つユーザー)は、IAMに特定のストレージ・バケットおよび関連付けられたポリシーを作成する必要があります。これらの設定ステップは、オブジェクト・ストアおよびIAMでデータ・フローが機能するために必要です。

オブジェクト・ストア: ストレージの設定

データ・フロー・サービスでアプリケーションを実行する前に、オブジェクト・ストアに2つのストレージ・バケットが必要です。オブジェクト・ストレージのドキュメントを参照してください。

Oracle Cloud Infrastructureで、次に対してオブジェクト・ストア内に2つのストレージ・バケットを作成します:
データ・フロー・ログ
データ・フローでは、アプリケーションの実行ごとにログ(標準出力と標準エラーの両方)を格納するバケットが必要です。オブジェクト・ストア・サービスでdataflow-logsという標準ストレージ層バケットを作成します。バケットの場所は、パターンに従う必要があります:
oci://dataflow-logs@<Object_Store_Namespace>/
データ・フロー・ウェアハウス
データ・フローには、Spark SQLアプリケーションのデータ・ウェアハウスが必要です。オブジェクト・ストア・サービスでdataflow-warehouseという標準ストレージ層バケットを作成します。ウェアハウスの場所は、次のパターンに従う必要があります:
oci://dataflow-warehouse@<Object_Store_Namespace>/

アイデンティティ: ポリシー設定

データ・フローでは、アプリケーションを管理および実行するために、IAMでリソースをアクセスするためのポリシーを設定する必要があります。

ポリシーを手動で作成することも、IAMのポリシー・テンプレートを使用することもできます。IAMポリシーの仕組みの詳細は、Identity and Access Managementのドキュメントを参照してください。ポリシーに追加するタグおよびタグ・ネームスペースの詳細は、タグおよびタグ・ネームスペースの管理を参照してください。

IAMテンプレートを使用したポリシーの作成

IAMテンプレートを使用して、データ・フローのポリシーを作成します。

IAMのポリシー・ビルダーでテンプレートを使用し、ステップに従ってコンソールを使用してポリシーを作成します。
  1. ナビゲーション・メニューで、「アイデンティティとセキュリティ」をクリックします。
  2. 「アイデンティティ」で、「ポリシー」をクリックします。
  3. 「ポリシー」ページで、「ポリシーの作成」をクリックします。
  4. ポリシーに名前および説明を指定します。
  5. コンパートメントを選択します。
  6. 「ポリシーのユースケース」で、Data Flowを選択します。
  7. 「共通ポリシー・テンプレート」から、使用するデータ・フロー・ポリシー・テンプレートを選択します。
    図1. DataFlowのポリシーの作成
    Data Flowが選択され、ポリシー・テンプレートがリストされているIAMのポリシー・ビルダー。
  8. 必要に応じて「グループ」または「動的グループ」をクリックし、リストからいずれかを選択します。
  9. 場所を選択します。
  10. (オプション)「拡張オプションの表示」をクリックして、タグを追加します。
  11. (オプション)「他のポリシーの作成」をクリックします。
  12. 「作成」をクリックします。
データ・フロー・ポリシー・テンプレート

データ・フローには4つの共通ポリシー・テンプレートがあります。これらは、ポリシーを作成する必要がある順序でリストされます。

データ・フロー管理者がすべてのアプリケーションと実行を管理
サービスで任意のアクションを実行できるサービスの管理者のようなユーザー(またはスーパーユーザー)向け。これにはグループに割り当てられたポリシーに従って、他のユーザーが所有するアプリケーションや、テナンシ内のユーザーによって開始された実行の管理が含まれます
データ・フロー・ユーザーが自分のアプリケーションと実行を管理。
自身のアプリケーションを作成および削除する権限のみを持っている他のすべてのユーザー。ただし、テナンシ内のアプリケーションは実行でき、他のユーザーが所有するアプリケーションの削除や他のユーザーが開始した実行の取消しなどの管理権限は持ちません。
ユーザーまたはグループのかわりに、データ・フロー・サービスが、テナンシ内のオブジェクトに対してアクションを実行することを許可。
データ・フロー・サービスでは、テナンシ内のオブジェクトでユーザーまたはグループのかわりにアクションを実行する権限が必要です。
(オプション)データ・フロー・ユーザーにプライベート・エンドポイントの作成、編集または変更を許可。
このポリシー・テンプレートは、virtual-network-familyの使用、より限定的なリソースへのアクセス、特定の操作へのアクセス、およびネットワーク構成の変更を許可します。

ポリシーの手動作成

IAMのテンプレートを使用してデータ・フローのポリシーを作成するかわりに、IAMのポリシー・ビルダーでポリシーを作成できます。

「ポリシーの管理」のステップに従って、次のポリシーを手動で作成します:

データ・フロー・ユーザー・ポリシー
一般的に、データ・フロー・ユーザーを、権限が明確に分かれる2つのグループに分類します:
  • サービスで任意のアクションを実行できるサービスの管理者のようなユーザー(またはスーパーユーザー)向け。これにはグループに割り当てられたポリシーに従って、他のユーザーが所有するアプリケーションや、テナンシ内のユーザーによって開始された実行の管理が含まれます:
    • アイデンティティ・サービスdataflow-adminにグループを作成し、このグループにユーザーを追加します。
    • dataflow-adminというポリシーを作成し、次のステートメントを追加します:
      ALLOW GROUP dataflow-admin TO READ buckets IN <TENANCY>
      ALLOW GROUP dataflow-admin TO MANAGE dataflow-family IN <TENANCY>
      ALLOW GROUP dataflow-admin TO MANAGE objects IN <TENANCY> WHERE ALL
                {target.bucket.name='dataflow-logs', any {request.permission='OBJECT_CREATE',
                request.permission='OBJECT_INSPECT'}}
    これには、dataflow-logsバケットへのアクセスが含まれます。
  • 2つ目のカテゴリは、自身のアプリケーションを作成および削除する権限のみを持っている他のすべてのユーザーが対象です。ただし、テナンシ内のアプリケーションは実行でき、他のユーザーが所有するアプリケーションの削除や他のユーザーが開始した実行の取消しなどの管理権限は持ちません。
    • アイデンティティ・サービスdataflow-usersにグループを作成し、このグループにユーザーを追加します。
    • dataflow-usersというポリシーを作成し、次のステートメントを追加します:
      ALLOW GROUP dataflow-users TO READ buckets IN <TENANCY>
      ALLOW GROUP dataflow-users TO USE dataflow-family IN <TENANCY>
      ALLOW GROUP dataflow-users TO MANAGE dataflow-family IN <TENANCY> WHERE ANY 
      {request.user.id = target.user.id, request.permission = 'DATAFLOW_APPLICATION_CREATE', 
      request.permission = 'DATAFLOW_RUN_CREATE'}
      ALLOW GROUP dataflow-users TO MANAGE objects IN <TENANCY> WHERE ALL 
      {target.bucket.name='dataflow-logs', any {request.permission='OBJECT_CREATE', 
      request.permission='OBJECT_INSPECT'}}
アイデンティティ・プロバイダによるフェデレーション
アイデンティティ・フェデレーションSAML 2.0システム(Oracle Identity Cloud Service、Microsoft Active Directory、Okta、またはSAML 2.0をサポートする他のプロバイダなど)を使用する場合は、Oracle Cloud Infrastructureコンソールなどの複数のシステムで1つのユーザー名とパスワードを使用できます。このシングル・サインオン操作を有効にするには、テナント管理者(または同等の権限を持つ別のユーザー)がIAMでフェデレーション信頼を設定する必要があります。アイデンティティ・プロバイダに適した詳細は、次を参照してください:

フェデレーション信頼を構成したら、Oracle Cloud Infrastructureコンソールを使用して、適切なアイデンティティ・プロバイダ・ユーザー・グループを、アイデンティティ・サービスの必要なデータ・フロー・ユーザー・グループにマップします。

データ・フロー・サービス・ポリシー

データ・フロー・サービスでは、テナンシ内のオブジェクトでユーザーまたはグループのかわりにアクションを実行する権限が必要です。

これを設定するには、dataflow-serviceというポリシーを作成し、次のステートメントを追加します:
ALLOW SERVICE dataflow TO READ objects IN tenancy WHERE target.bucket.name='dataflow-logs'
プライベート・エンドポイント・ポリシー
プライベート・エンドポイントを作成、編集または管理するには、次のポリシーが必要です:
  • virtual-network-familyの使用を許可するには:
    allow group dataflow-admin to use virtual-network-family in compartment <compartment-name>
  • より特定的なリソースへのアクセスを許可するには、次のポリシーが必要です:
    allow group dataflow-admin to manage vnics in compartment <compartment-name>
    allow group dataflow-admin to use subnets in compartment <compartment-name>
    allow group dataflow-admin to use network-security-groups in compartment <compartment-name>
  • 特定の操作へのアクセスを許可するには、次のポリシーが必要です:
    allow group dataflow-admin to manage virtual-network-family in compartment <compartment-name>
       where any {request.operation='CreatePrivateEndpoint',
                  request.operation='UpdatePrivateEndpoint',
                  request.operation='DeletePrivateEndpoint'
                  }
  • ネットワーク構成の変更を許可するには、次のポリシーが必要です:
    allow group dataflow-admin to manage dataflow-private-endpoint in <tenancy>
<compartment-name>をコンパートメントの名前に、<tenancy>をテナンシの名前に置き換えます。

これらの例ではポリシーをdataflow-adminに付与しますが、これらのポリシーをユーザーのサブセットにのみ付与することを選択できるため、プライベート・エンドポイントで操作を実行できるユーザーを制限できます。実行のデータへのアクセスにプライベート・エンドポイントのみを使用しており、問題のプライベート・エンドポイントがテナントに存在する場合、これらのポリシーは必要ありません。

プライベート・エンドポイント構成のアクティブ化またはネットワーク構成のインターネットへの切替えを行える実行を作成できるのは、dataflow-adminグループのユーザーのみです。実行によってプライベート・エンドポイントがアクティブ化された後、このプライベート・エンドポイントは、適切な権限を持つdataflow-adminグループのユーザーが変更するまでアクティブなままになります。適切な権限セットについては、管理の設定を参照してください。dataflow-usersグループのユーザーは、アクティブなプライベート・エンドポイントを使用するようにアプリケーションが構成されている場合にのみ実行を起動できます。
ノート

正しく構成されている場合、プライベート・エンドポイントはVCN上のプライベート・リソースとインターネット・リソースの組合せにアクセスできます。プライベート・エンドポイントを構成する場合は、「DNSゾーン」セクションでこれらのリソースのリストを指定します。
Hive Metastoreポリシー

これらのポリシーは、Hive Metastoreでデータ・フローを使用している場合のみ追加します。

  1. データ・カタログ・メタストアの説明に従って、メタストア・ポリシーを追加します。
  2. Hive Metastore機能を使用するには、データ・フロー管理者用とデータ・フロー・ユーザー用の2つの異なるグループに対して、必要なポリシーを2つの異なるIAMレベルで構成できます。
    • データ・フロー管理者がテナンシのHiveメタストアを管理できるようにするメタストア・ポリシー:
      Allow group <group-name> to manage data-catalog-metastores in tenancy
    • データ・フロー・ユーザーのメタストア・ポリシーにより、データ・フロー・アプリケーションにHiveメタストアを使用し、適切なコンパートメントで実行するために必要な権限が付与されます:
      Allow group <group-name> to {CATALOG_METASTORE_EXECUTE, CATALOG_METASTORE_INSPECT, CATALOG_METASTORE_READ} 
      in compartment <compartment-name>
      
リソース・プリンシパル・ポリシー

Sparkストリーミングなどでリソース・プリンシパルを使用する場合は、データ・フローで特定のポリシーが必要です。

ポリシー・ビルダーのデータ・フロー・リソース・プリンシパル・テンプレートの使用

ポリシー・ビルダーのデータ・フロー・テンプレートを使用して、リソース・プリンシパルのポリシーを設定します。

データ・フロー・リソースがオブジェクト・ストレージを使用できるようにします
動的グループが、指定されたオブジェクト・ストレージの場所にあるオブジェクトを作成して使用できるようにします。テナンシにポリシーを作成します。
データ・フロー・リソースがOracle Streamingから消費されるようにします
動的グループがOracle Streamingから消費できるようにします。テナンシにポリシーを作成します。
データ・フロー・リソースにOracle Streamingへの書込みを許可する
動的グループがOracle Streamingに生成されるようにします。テナンシにポリシーを作成します。
動的グループの使用

動的グループを使用すると、より簡潔なポリシーを記述し、同じグループを再利用できます。タグを参照し、グループを特定のデータ・フロー・アプリケーションに制限することもできます。

  1. すべてのデータ・フローの実行元となるコンパートメントを指定します:
    ALL {resource.type='dataflowrun', resource.compartment.id='<compartment_id>', tag.oci_dataflow.applicationId.value='<application_id>'}
    (オプション)コンパートメント内の特定のデータ・フロー・アプリケーションに制限できます:
    ALL {resource.type='dataflowrun', resource.compartment.id='<compartment_id>', tag.oci-dataflow.application-id.value='<application_id>'}
  2. データ・フロー・リソース・プリンシパルがストリーミング・ストリーム・プールおよびオブジェクト・ストレージ・バケットから消費できるようにします:
    ALLOW DYNAMIC-GROUP DF-IN-ROOT TO {STREAM_INSPECT, STREAM_READ, STREAM_CONSUME} IN TENANCY WHERE ANY {target.streampool.id = '<streampool_id>'}
    ALLOW DYNAMIC-GROUP DF-IN-ROOT TO MANAGE OBJECTS IN TENANCY WHERE ANY {target.bucket.name = '<bucket_name>', target.bucket.name = '<bucket_name>'}
オールインワン・ポリシーの使用

すべてのデータ・フローは、特定のコンパートメントから実行され、特定のストリーム・プールおよびオブジェクト・ストレージ・バケットから消費されます。

ALLOW ANY-USER TO {STREAM_INSPECT, STREAM_READ, STREAM_CONSUME} IN TENANCY WHERE ALL {request.principal.type='dataflowrun', request.compartment.id = '<compartment_id>', target.streampool.id = '<streampool_id>'}
ALLOW ANY-USER TO MANAGE OBJECTS IN TENANCY WHERE ALL {request.principal.type='dataflowrun', request.compartment.id = '<compartment_id>', target.bucket.name = '<bucket_name>'}

Oracle CloudへのApache Sparkアプリケーションのインポート

Sparkアプリケーションを実行するには、そのアプリケーションをOracle Cloud Infrastructureオブジェクト・ストレージにホストする必要があります。アプリケーションは任意のバケットにアップロードできます。アプリケーションを実行しているユーザーは、アプリケーションが正常に起動するために、すべてのアセット(関連するすべてのコンパートメント、バケットおよびファイルなど)への読取りアクセス権を持っている必要があります。

アプリケーションのバンドルのベスト・プラクティス

アプリケーションのバンドルのベスト・プラクティス
テクノロジノート
JavaまたはScalaアプリケーション最良の信頼性を得るには、オブジェクト・ストアに含まれるすべての依存性とともに、Uber JARまたはアセンブリJARとしてアプリケーションをアップロードします。Maven Assemblyプラグイン(Java)やsbt-assembly (Scala)などのツールを使用して、適切なJARを構築してください。
SQLアプリケーションすべてのSQLファイル(.sql)をオブジェクト・ストアにアップロードします。
Pythonアプリケーションデフォルト・ライブラリでアプリケーションを構築し、Pythonファイルをオブジェクト・ストアにアップロードします。サードパーティのライブラリまたはパッケージを含めるには、データ・フロー・アプリケーションへのサードパーティ・ライブラリの追加を参照してください。

.zip.gzipなどのzipフォーマットのアプリケーション・パッケージは指定しないでください。

アプリケーションがOracle Cloud Infrastructure オブジェクト・ストアにインポートされると、特別なURIを使用して後で参照できます:
oci://<bucket>@<tenancy>/<applicationfile>

たとえば、JavaまたはScalaアプリケーションを使用して、examplecorpの開発者がlogcrunch.jarというSparkアプリケーションを開発し、production_codeというバケットにアップロードしたとします。コンソールUIの右上にあるユーザー・プロファイル・アイコンをクリックして、いつでも正しいテナンシを確認できます。

正しいURIは次のようになります:
oci://production_code@examplecorp/logcrunch.jar

Oracle Cloudへのデータのロード

データ・フローは、Oracle Cloud Infrastructureオブジェクト・ストレージ内のデータを管理するために最適化されています。オブジェクト・ストレージ内のデータを管理することで、パフォーマンスが最大化され、アプリケーションが、そのアプリケーションを実行しているユーザーにかわってデータにアクセスできるようになります。

データのロード
方法ツール
ネイティブWeb UIOracle Cloud Infrastructureコンソールでは、ストレージ・バケットを管理し、ディレクトリ・ツリーを含むファイルをアップロードできます。
サード・パーティ・ツール

REST APIおよびコマンドライン・インフラストラクチャの使用を検討してください。

大量のデータの転送については、次の3つのサード・パーティ・ツールを検討してください:

クロス・テナンシ・アクセス

ユーザーはテナンシ間で作業できます。つまり、自分が存在するテナンシとは異なるテナンシで作業を実行できます。たとえば、あるテナンシにデータ・フローを設定し、2番目のテナンシに格納されているオブジェクトを読み取ることができます。
  • データ・フロー・ユーザーは、Tenancy_Aというテナンシ内のグループtenancy-a-groupに属しています。
  • データ・フローは、Tenancy_Aで実行されます。
  • 読み取られるオブジェクトは、Tenancy_Bというテナンシにあります。

tenancy-a-groupに対してTenancy_B内のバケットおよびオブジェクトの読取りを許可する必要があります。

Tenancy_Aのルート・コンパートメントで次のポリシーを適用します:
define tenancy Tenancy_B as tenancy-b-ocid
endorse group tenancy-a-group to read buckets in tenancy Tenancy_B
endorse group tenancy-a-group to read objects in tenancy Tenancy_B

最初のステートメントは、Tenancy_BのOCIDにわかりやすいラベルを割り当てる"define"ステートメントです。2番目および3番目のステートメントを使用すると、ユーザーのグループtenancy-a-groupは、Tenancy_B内のバケットおよびオブジェクトを読み取ることができます。

Tenancy_Bのルート・コンパートメントで次のポリシーを適用します:
define tenancy Tenancy_A as tenancy-a-ocid
define group tenancy-a-group as tenancy-a-group-ocid
admit group tenancy-a-group of tenancy Tenancy_A to read buckets in tenancy
admit group tenancy-a-group of tenancy Tenancy_A to read objects in tenancy

最初および2番目のステートメントは、Tenancy_Aおよびtenancy-a-groupのOCIDにわかりやすいラベルを割り当てるdefineステートメントです。3番目および4番目のステートメントを使用すると、tenancy-a-groupは、Tenancy_B内のバケットおよびオブジェクトを読み取ることができます。admitという語は、バケットおよびオブジェクトが存在するテナンシ外のグループにアクセス権が適用されることを示します。

読取りバケット・ポリシーを1つのコンパートメントに制限することで、アクセスをさらに制限できます。たとえば、your_compartmentというコンパートメントの場合:
admit group tenancy-a-group of tenancy Tenancy_A to read buckets in compartment your_compartment
または、読取りオブジェクト・ポリシーを1つのバケットに制限します。たとえば、your_compartmentyour_bucketというバケットの場合:
admit group tenancy-a-group of tenancy Tenancy_A to read objects in compartment your_compartment where target.bucket.name = 'your_bucket'