すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:MaxComputeプロジェクトのトップNのコストとトップNの時間のかかるジョブを持つアカウントの統計を収集する

最終更新日:Jan 20, 2025

MaxComputeの開発中、データ開発者は、MaxComputeプロジェクトのアカウントのコストとジョブの期間を計算して、ジョブの計画と調整を支援する必要があります。 このトピックでは、MaxComputeメタデータサービス情報スキーマを使用して、DingTalkを使用して、上位N件のコストと上位N件の時間のかかるジョブを持つアカウントの統計を収集し、顧客グループに情報をプッシュする方法について説明します。

背景情報

ほとんどの場合、データ開発者はDataWorksワークスペースに基づくMaxComputeを標準モードで使用します。 MaxComputeは、Information Schemaのほとんどのジョブの実行アカウントと同じAlibaba Cloudアカウントを記録します。 RAMユーザーは、少数のジョブの実行アカウントとしてのみ記録されます。 この場合、データ開発者は、各アカウントのコストと時間のかかるジョブに関する統計を収集する方法について懸念しています。 この問題を解決するために、MaxComputeは次のソリューションを提供します。

  • アカウントのコストに関する統計を収集するには、課金管理コンソールの [請求書の詳細] ページで使用状況の詳細を照会できます。 ただし、使用状況の詳細が属するRAMユーザーを特定することはできません。 Information SchemaサービスのTASKS_HISTORYビューは、MaxComputeプロジェクトで完了したジョブの詳細を記録し、過去14日間のデータを保持します。 TASKS_HISTORYビューのデータを指定されたMaxComputeプロジェクトにバックアップし、データに基づいて上位N件のコストを持つアカウントの統計を収集できます。

  • TASKS_HISTORYビューのデータに基づいて、時間のかかる上位N個のジョブに関する統計を収集できます。

情報スキーマサービスの機能と制限の詳細については、「プロジェクトレベルの情報スキーマ (廃止) 」をご参照ください。

手順1: 情報スキーマサービスの取得

2024年3月1日以降、MaxComputeは新しいプロジェクトに対してプロジェクトレベルの情報スキーマサービスを自動的に提供しなくなりました。 既定では、3月1日、2024日以降に作成されたプロジェクトには、プロジェクトレベルの情報スキーマのパッケージは提供されません。 メタデータをクエリする場合は、テナントレベルの情報スキーマを使用して、より包括的な情報を取得できます。 テナントレベル情報スキーマの使用方法の詳細については、「テナントレベル情報スキーマ」をご参照ください。

既存のプロジェクトで情報スキーマを使用する前に、プロジェクトメタデータにアクセスするためのアクセス許可を取得する必要があります。 権限を取得するには、プロジェクト所有者として、またはSuper_Administratorロールが割り当てられているRAMユーザーとして、Information Schema権限パッケージをインストールします。 詳細については、「ユーザーへのロールの割り当て」をご参照ください。 次のいずれかの方法を使用して、権限パッケージをインストールできます。

説明

複数のMaxComputeプロジェクトのメタデータを収集するには、各MaxComputeプロジェクトにInformation Schema権限パッケージをインストールする必要があります。 次に、一元化された統計分析のために、各MaxComputeプロジェクトのバックアップメタデータを同じテーブルに挿入する必要があります。

(オプション) 手順2: プロジェクト所有者以外のユーザーに権限を付与する

情報スキーマによって提供されるビューには、プロジェクトレベルのすべてのユーザーデータが含まれます。 既定では、プロジェクトの所有者はこのプロジェクトのユーザーデータを表示できます。 プロジェクト内の他のユーザーまたはロールに、データを表示するために必要な権限を付与する必要があります。 詳細については、「パッケージに基づくクロスプロジェクトリソースアクセス」をご参照ください。

ユーザーまたはロールに権限を付与するために使用されるステートメントの構文:

grant <actions> on package Information_Schema.systables to user <user_name>;
grant <actions> on package Information_Schema.systables to role <role_name>;
  • actions: 付与する権限。 値を [読み取り] に設定します。

  • user_name: プロジェクトに追加されたAlibaba CloudアカウントまたはRAMユーザー。

    MaxComputeクライアントlist users; コマンドを実行して、ユーザーアカウントを取得できます。

  • role_name: プロジェクトに追加されるロール。

    MaxComputeクライアントlist roles; コマンドを実行して、ロールの名前を照会できます。

例:

grant read on package Information_Schema.systables to user RAM$Bob@aliyun.com:user01;

ステップ3: メタデータのダウンロードとバックアップ

MaxComputeプロジェクトでメタデータバックアップテーブルを作成し、定期的にメタデータをバックアップテーブルに書き込みます。 次の例では、MaxComputeクライアントでの手順について説明します。

  1. MaxComputeクライアントにログインして、次のコマンドを実行して、メタデータバックアップテーブルを作成します。

    -- project_name specifies the name of the MaxCompute project. 
    create table if not exists <project_name>.information_history
    (
        task_catalog STRING
        ,task_schema STRING
        ,task_name STRING
        ,task_type STRING
        ,inst_id STRING
        ,`status` STRING
        ,owner_id STRING
        ,owner_name STRING
        ,result STRING
        ,start_time DATETIME
        ,end_time DATETIME
        ,input_records BIGINT
        ,output_records BIGINT
        ,input_bytes BIGINT
        ,output_bytes BIGINT
        ,input_tables STRING
        ,output_tables STRING
        ,operation_text STRING
        ,signature STRING
        ,complexity DOUBLE
        ,cost_cpu DOUBLE
        ,cost_mem DOUBLE
        ,settings STRING
        ,ds STRING
    );
  2. DataWorksコンソールの [DataStudio] ページで、information_historyという名前のODPS SQLノードを作成し、定期的にバックアップテーブルinformation_historyにデータを書き込むように定期的なスケジューリングを設定します。 次に、左上隅の保存アイコンをクリックして設定を保存します。

    ODPS SQLノードの作成方法の詳細については、「MaxCompute SQLタスクの開発」をご参照ください。

    次のサンプルコードは、ODPS SQLノードの例を示しています。

    -- project_name specifies the name of the MaxCompute project. 
    use <project_name>;
    insert into table <project_name>.information_history select * from information_schema.tasks_history where ds ='datetime1';

    ${datetime1} はDataWorksのスケジューリングパラメーターです。 ODPS SQLノードの右側で、[プロパティ] タブをクリックします。 [プロパティ] パネルの [全般] セクションで、${datetime1} パラメーターを追加し、このパラメーターに ${yyyymmdd} の値を割り当てます。

    説明

    複数のMaxComputeプロジェクトのメタデータを同時に分析する場合は、複数のODPS SQLノードを作成し、これらのMaxComputeプロジェクトのメタデータを同じバックアップテーブルに書き込むことができます。

ステップ4: テーブルとDataWorksノードを作成して、トップNのコストと時間のかかるジョブを持つアカウントの統計を収集します。

TASKS_HISTORYビューの設定フィールドには、上層アプリケーションによってスケジュールされた情報、またはユーザーによって指定された情報が記録されます。 情報はJSON形式で保存されます。 情報は、USERAGENT、BIZID、SKYNET_ID、およびSKYNET_NODENAMEなどのフィールドを含む。 設定フィールドの情報に基づいて、ジョブを作成するRAMユーザーに関する情報を見つけることができます。 したがって、バックアップテーブルに基づいて、上位Nのコストと上位Nの時間のかかるジョブを持つアカウントの統計を収集できます。 統計を収集するには、次の手順を実行します。

  1. MaxComputeクライアントにログインします。 user_ramという名前のテーブルを作成して、RAMユーザーの名前とIDを記録します。

    例:

    create table if not exists <project_name>.user_ram
    (
        user_id STRING
        ,user_name STRING
    );
  2. cost_topnという名前のテーブルを作成して、上位N個のコストを持つアカウントの詳細を記録します。

    例:

    create table if not exists <project_name>.cost_topn
    (
        cost_sum DECIMAL(38,5)
        ,task_owner STRING
    )
    partitioned by 
    (
        ds STRING
    );
  3. time_topnという名前のテーブルを作成して、時間のかかる上位N件のジョブの詳細を記録します。

    例:

    create table if not exists <project_name>.time_topn
    (
        inst_id STRING
        ,cost_time BIGINT
        ,task_owner STRING
    )
    partitioned by 
    (
        ds STRING
    );
  4. DataWorksコンソールの [DataStudio] ページで、topnという名前のODPS SQLノードを作成し、定期的なスケジューリングを設定して、定期的にcost_topnテーブルからuser_ramテーブルに統計データを書き込みます。 左上隅の保存アイコンをクリックして、設定を保存します。

    ODPS SQLノードの作成方法の詳細については、「MaxCompute SQLタスクの開発」をご参照ください。

    次のサンプルコードは、ODPS SQLノードの例を示しています。

    -- Enable the MaxCompute V2.0 data type edition. For more information about the MaxCompute V2.0 data type edition, see documentation of the MaxCompute V2.0 data type edition. 
    set odps.sql.decimal.odps2=true;
    -- Write metadata to the cost_topn and time_topn tables. user_id specifies the account ID. You can view the account ID on the Security Settings page. 
    insert into table <project_name>.cost_topn partition (ds = '${datetime1}')
    select   
    nvl(cost_sum,0) cost_sum
            ,case when a.task_owner='<user_id>' or a.task_owner='<user_id>' or a.task_owner='<user_id>' then b.user_name 
                  else a.task_owner 
             end task_owner 
    from    (
                select  inst_id
                        ,owner_name
                        ,task_type
                        ,a.input_bytes
                        ,a.cost_cpu
                        ,a.status
                        ,case    when a.task_type = 'SQL' then cast(a.input_bytes/1024/1024/1024 * a.complexity * 0.3 as DECIMAL(18,5) )
                                 when a.task_type = 'SQLRT' then cast(a.input_bytes/1024/1024/1024 * a.complexity * 0.3 as DECIMAL(18,5) )
                                 when a.task_type = 'CUPID' and a.status='Terminated'then cast(a.cost_cpu/100/3600 * 0.66 as DECIMAL(18,5) ) 
                                 else 0 
                         end cost_sum
                        ,a.settings
                        ,get_json_object(settings, "$.SKYNET_ONDUTY") owner
                        ,case    when get_json_object(a.settings, "$.SKYNET_ONDUTY") is null then owner_name 
                                 else get_json_object(a.settings, "$.SKYNET_ONDUTY") 
                         end task_owner
                from    information_history
                where   ds = '${datetime1}'
            ) a
    left join <project_name>.user_ram b
    on      a.task_owner = b.user_id;
    
    insert into table <project_name>.time_topn partition(ds = '${datetime1}')
    select  inst_id
            ,cost_time
            ,case    when a.task_owner='<user_id>' or a.task_owner='<user_id>' or a.task_owner='<user_id>' then b.user_name 
                     else a.task_owner 
             end task_owner
    from    (
                select  inst_id
                        ,task_type
                        ,status
                        ,datediff(a.end_time, a.start_time, 'ss') AS cost_time
                        ,case    when get_json_object(a.settings, "$.SKYNET_ONDUTY") is null then owner_name 
                                 else get_json_object(a.settings, "$.SKYNET_ONDUTY") 
                         end task_owner
                from    <project_name>.information_history a
                where   ds = '${datetime1}'
            ) a
    left join <project_name>.user_ram b
    on      a.task_owner = b.user_id
    ;
    説明

    上記のサンプルコードでは、task_type = 'SQL' はSQLジョブを示し、task_type = 'SQLRT' はMaxComputeクエリアクセラレーション (MCQA) ジョブを示し、task_type = 'CUPIDはSparkジョブを示します。 MapReduceやMapReduceなど、他の請求可能なジョブに関する統計を収集する場合

    Marsジョブでは、課金式に基づいてコード行を追加できます。 課金の詳細については、「」をご参照ください。 コンピューティング価格

    ${datetime1} はDataWorksのスケジューリングパラメーターです。 ODPS SQLノードの右側で、[プロパティ] タブをクリックします。 [プロパティ] パネルの [全般] セクションで、${datetime1} パラメーターを追加し、このパラメーターに ${yyyymmdd} の値を割り当てます。

手順5: アップストリームノードとダウンストリームノードのスケジューリングプロパティを設定し、現在のノードを実行する

information_history、topn、dingsendノード間のスケジューリングの依存関係を設定するために、ワークフローのキャンバスに線を描画します。 ワークフローの [プロパティ] パネルで、再実行属性と各ノードの上流ノードを設定します。 設定が完了したら、ノードを右クリックし、[現在のノードを実行] を選択します。

依存関係の設定方法の詳細については、「同一サイクルスケジューリング依存関係の設定」をご参照ください。

アップストリームノードとダウンストリームノードの設定方法の詳細については、「入出力パラメーターの設定」をご参照ください。

関連ドキュメント

テクニカルサポート

MaxComputeに関する質問や提案がある場合は、DingTalkグループID 11782920を検索し、DingTalkグループに参加してテクニカルサポートを行います。