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

Batch Compute (Deprecated):Java SDK クイックスタート

最終更新日:Feb 14, 2025

このセクションでは、Java SDK を使用してジョブを送信する方法について説明します。このジョブは、ログファイルに INFO、WARN、ERROR、および DEBUG が出現する回数をカウントすることを目的としています。

[注]: 事前に Batch Compute サービスにサインアップ していることを確認してください。

[コンテンツ]:

  • ジョブの準備
    • OSS にデータファイルをアップロードする
    • サンプルコードを使用する
    • コードをコンパイルしてパッケージ化する
    • OSS にパッケージをアップロードする
  • SDK を使用してジョブを作成 (送信) する
  • 結果を確認する

このジョブは、ログファイルに「INFO」、「WARN」、「ERROR」、および「DEBUG」が出現する回数をカウントすることを目的としています。

このジョブには、次のタスクが含まれています。

  • 分割タスクは、ログファイルを 3 つの部分に分割するために使用されます。
  • カウントタスクは、ログファイルの各部分に「INFO」、「WARN」、「ERROR」、および「DEBUG」が出現する回数をカウントするために使用されます。カウントタスクでは、InstanceCount を 3 に設定する必要があります。これは、3 つのカウントタスクが同時に開始されることを示します。
  • マージタスクは、すべてのカウント結果をマージするために使用されます。

[DAG]

1.1. OSS にデータファイルをアップロードする

この例で使用されるデータファイルをダウンロードします: log-count-data.txt

log-count-data.txt ファイルを次の場所にアップロードします。

oss://your-bucket/log-count/log-count-data.txt

  • your-bucket は、自分で作成したバケットを示します。この例では、リージョンが cn-shenzhen であると想定しています。
  • ファイルを OSS にアップロードする方法については、「OSS にファイルをアップロードする」をご参照ください。

1.2. サンプルコードを使用する

ここでは、Java を使用してジョブのタスクをコンパイルします。具体的には、Maven を使用してコンパイルします。IDEA をお勧めします。IDEA の無料 Community バージョンは、https://www.jetbrains.com/idea/download/ からダウンロードできます。

サンプルプログラムをダウンロードします: java-log-count.zip

これは Maven プロジェクトです。

  • 注: コードを変更する必要はありません。

1.3. コードをコンパイルしてパッケージ化する

次のコマンドを実行して、コードをコンパイルしてパッケージ化します。

mvn package

target ディレクトリの下に、次の .jar パッケージが取得されます。

batchcompute-job-log-count-1.0-SNAPSHOT-Split.jar
batchcompute-job-log-count-1.0-SNAPSHOT-Count.jar
batchcompute-job-log-count-1.0-SNAPSHOT-Merge.jar

次のコマンドを実行して、3 つの .jar パッケージを tar.gz ファイルにパッケージ化します。

> cd target  # target ディレクトリに切り替える
> tar -czf worker.tar.gz *SNAPSHOT-*.jar # パッケージ化

次のコマンドを実行して、パッケージの内容が正しいかどうかを確認します。

> tar -tvf worker.tar.gz
batchcompute-job-log-count-1.0-SNAPSHOT-Split.jar
batchcompute-job-log-count-1.0-SNAPSHOT-Count.jar
batchcompute-job-log-count-1.0-SNAPSHOT-Merge.jar
  • 注: Batch Compute は、拡張子が tar.gz の圧縮パッケージのみをサポートしています。パッケージ化には、前述の方法 (gzip) を使用してください。そうしないと、パッケージを解析できません。

1.4. OSS にパッケージをアップロードする

この例では、worker.tar.gz を OSS の your-bucket にアップロードします。

oss://your-bucket/log-count/worker.tar.gz

  • この例でジョブを実行するには、独自のバケットを作成する必要があります。また、worker.tar.gz を独自のバケットのパスにアップロードする必要があります。

2. SDK を使用してジョブを作成 (送信) する

2.1. Maven プロジェクトを作成する

pom.xml に次の依存関係を追加します。

    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-batchcompute</artifactId>
            <version>5.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.2.3</version>
        </dependency>
    </dependencies>
  • 最新バージョンの SDK を使用していることを確認してください。詳細については、「Java SDK」をご参照ください。

2.2. Java クラスを作成する: Demo.java

ジョブを送信するときは、クラスタ ID を指定するか、AutoCluster パラメータを使用する必要があります。

この例では、AutoCluster を使用します。AutoCluster には、次のパラメータを設定する必要があります。

  • 使用可能なイメージ ID。システムが提供するイメージを使用するか、イメージをカスタマイズできます。イメージをカスタマイズする方法の詳細については、「イメージを使用する」をご参照ください。
  • InstanceType。インスタンスタイプの詳細については、「現在サポートされているインスタンスタイプ」をご参照ください。

StdoutRedirectPath (プログラム出力) と StderrRedirectPath (エラーログ) を OSS に格納するためのパスを作成します。この例では、作成されたパスは oss://your-bucket/log-count/logs/ です。

  • この例でプログラムを実行するには、前述の変数と OSS パス変数に基づいて、プログラム内のコメント付き変数を変更します。

以下は、Java SDK を使用してジョブを送信するサンプルプログラムです。プログラムのパラメータの具体的な意味については、「SDK インターフェースの説明」をご参照ください。

Demo.java:

/*
* IMAGE_ID: ECS イメージ。前述の説明に従って取得できます。
* INSTANCE_TYPE: インスタンスタイプ。前述の説明に従って取得できます。
* REGION_ID: リージョンは青島または杭州です。現在、Batch Compute サービスは青島でのみ提供されています。リージョンは、OSS で worker.tar.gz を格納するために使用するバケットのリージョンと一致している必要があります。
* ACCESS_KEY_ID: AccessKeyID は、前述の説明に従って取得できます。
* ACCESS_KEY_SECRET: AccessKeySecret は、前述の説明に従って取得できます。
* WORKER_PATH: worker.tar.gz がパッケージ化されてアップロードされる OSS ストレージパス。
* LOG_PATH: エラーフィードバックとタスク出力のストレージパス。
 */
 import com.aliyuncs.batchcompute.main.v20151111.*;
 import com.aliyuncs.batchcompute.model.v20151111.*;
 import com.aliyuncs.batchcompute.pojo.v20151111.*;
 import com.aliyuncs.exceptions.ClientException;

 import java.util.ArrayList;
 import java.util.List;

 public class Demo {

     static String IMAGE_ID = "img-ubuntu";;  // ECS イメージ ID を入力します
     static String INSTANCE_TYPE = "ecs.sn1.medium"; // リージョンに基づいて適切なインスタンスタイプを入力します

     static String REGION_ID = "cn-shenzhen";   // リージョンを入力します
     static String ACCESS_KEY_ID = "";  //"your-AccessKeyId"; AccessKeyID を入力します
     static String ACCESS_KEY_SECRET = ""; //"your-AccessKeySecret"; AccessKeySecret を入力します
     static String WORKER_PATH = ""; //"oss://your-bucket/log-count/worker.tar.gz"; //  worker.tar.gz がアップロードされる OSS ストレージパスを入力します
     static String LOG_PATH = ""; // "oss://your-bucket/log-count/logs/"; // エラーフィードバックとタスク出力の OSS ストレージパスを入力します
     static String MOUNT_PATH = ""; // "oss://your-bucket/log-count/";


     public static void main(String[] args){

         /** BatchCompute クライアントを構築する */
         BatchCompute client = new BatchComputeClient(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

         try{

             /** ジョブオブジェクトを構築する */
             JobDescription jobDescription = genJobDescription();

             // ジョブを作成する
             CreateJobResponse response = client.createJob(jobDescription);

             // 作成が成功すると、jobId が返されます
             String jobId = response.getJobId();

             System.out.println("ジョブの作成に成功しました。jobId: "+jobId);


             // ジョブステータスを照会する
             GetJobResponse getJobResponse = client.getJob(jobId);

             Job job = getJobResponse.getJob();

             System.out.println("ジョブの状態:"+job.getState());

         } catch (ClientException e) {
             e.printStackTrace();

             System.out.println("ジョブの作成に失敗しました。エラーコード:"+ e.getErrCode()+", エラーメッセージ:"+e.getErrMsg());
         }
     }

     private static JobDescription genJobDescription(){



         JobDescription jobDescription = new JobDescription();

         jobDescription.setName("java-log-count");
         jobDescription.setPriority(0);
         jobDescription.setDescription("log-count デモ");
         jobDescription.setJobFailOnInstanceFail(true);
         jobDescription.setType("DAG");

         DAG taskDag = new DAG();


         /** 分割タスクを追加する */

         TaskDescription splitTask =  genTaskDescription();
         splitTask.setTaskName("split");
         splitTask.setInstanceCount(1);
         splitTask.getParameters().getCommand().setCommandLine("java -jar batchcompute-job-log-count-1.0-SNAPSHOT-Split.jar");
         taskDag.addTask(splitTask);

         /** カウントタスクを追加する */
         TaskDescription countTask =  genTaskDescription();
         countTask.setTaskName("count");
         countTask.setInstanceCount(3);
         countTask.getParameters().getCommand().setCommandLine("java -jar batchcompute-job-log-count-1.0-SNAPSHOT-Count.jar");
         taskDag.addTask(countTask);

         /** マージタスクを追加する */
         TaskDescription mergeTask =  genTaskDescription();
         mergeTask.setTaskName("merge");
         mergeTask.setInstanceCount(1);
         mergeTask.getParameters().getCommand().setCommandLine("java -jar batchcompute-job-log-count-1.0-SNAPSHOT-Merge.jar");
         taskDag.addTask(mergeTask);



         /** タスクの依存関係を追加する: split-->count-->merge  */

         List<String> taskNameTargets = new ArrayList();
         taskNameTargets.add("merge");
         taskDag.addDependencies("count", taskNameTargets);

         List<String> taskNameTargets2 = new ArrayList();
         taskNameTargets2.add("count");
         taskDag.addDependencies("split", taskNameTargets2);

         //dag
         jobDescription.setDag(taskDag);

         return jobDescription;
     }

     private static TaskDescription genTaskDescription(){

         AutoCluster autoCluster = new AutoCluster();
         autoCluster.setInstanceType(INSTANCE_TYPE);
         autoCluster.setImageId(IMAGE_ID);
         //autoCluster.setResourceType("OnDemand");

         TaskDescription task = new TaskDescription();
         //task.setTaskName("Find");

        // VPC インスタンスを使用する場合は、CIDR ブロックを設定し、CIDR ブロックの競合を回避します
        Configs configs = new Configs();
        Networks networks = new Networks();
        VPC vpc = new VPC();
        vpc.setCidrBlock("192.168.0.0/16");
        networks.setVpc(vpc);
        configs.setNetworks(networks);
        autoCluster.setConfigs(configs);

         // パッケージ化とアップロードのためのジョブの完全な OSS パス
         Parameters p = new Parameters();
         Command cmd = new Command();
         //cmd.setCommandLine("");
         // パッケージ化とアップロードのためのジョブの完全な OSS パス
         cmd.setPackagePath(WORKER_PATH);
         p.setCommand(cmd);
         // エラーフィードバックのストレージパス
         p.setStderrRedirectPath(LOG_PATH);
         // 最終結果のストレージパス
         p.setStdoutRedirectPath(LOG_PATH);

         task.setParameters(p);
         task.addInputMapping(MOUNT_PATH, "/home/input");
         task.addOutputMapping("/home/output",MOUNT_PATH);

         task.setAutoCluster(autoCluster);
         //task.setClusterId(clusterId);
         task.setTimeout(30000); /* 30000 秒*/
         task.setInstanceCount(1); /** 1 つのインスタンスを使用してプログラムを実行する */

         return task;
     }
 }

通常の出力の例:

ジョブの作成に成功しました。jobId: job-01010100010192397211
ジョブの状態: 待機中

3. ジョブステータスを確認する

ジョブステータスは、「ジョブ情報を取得する」を参照して表示できます。

// ジョブステータスを照会する
GetJobResponse getJobResponse = client.getJob(jobId);
Job job = getJobResponse.getJob();
System.out.println("ジョブの状態:"+job.getState());

ジョブは、待機中、実行中、完了、失敗、停止のいずれかの状態になります。

4. ジョブの実行結果を確認する

Batch Compute コンソール にログインして、ジョブステータスを表示できます。

ジョブの実行が完了したら、OSS コンソール にログインし、your-bucket の下の次のファイルを確認できます: /log-count/merge_result.json。

予想される結果は次のとおりです。

{"INFO": 2460, "WARN": 2448, "DEBUG": 2509, "ERROR": 2583}

または、「OSS SDK」を使用して結果を取得することもできます。