このセクションでは、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 packagetarget ディレクトリの下に、次の .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」を使用して結果を取得することもできます。