쿼리를 만들어서 효율적으로 Batch 리소스 나열

대부분의 Azure Batch 애플리케이션은 Batch 서비스를 쿼리하는 모니터링 또는 기타 작업을 수행합니다. 이러한 목록 쿼리는 종종 정기적으로 발생합니다. 예를 들어 작업에서 대기 중인 태스크를 확인하려면 먼저 해당 작업의 모든 태스크에 대한 데이터를 가져와야 합니다. Batch 서비스에서 쿼리에 대해 반환하는 데이터의 양을 줄이면 애플리케이션의 성능이 향상됩니다. 이 문서에서는 효율적인 방법으로 이러한 쿼리를 만들고 실행하는 방법에 대해 설명합니다. Azure.Compute.Batch 라이브러리를 사용하여 Batch 작업, 태스크, 컴퓨팅 노드 및 기타 리소스에 대한 필터링된 쿼리를 만들 수 있습니다.

참고

Batch 서비스는 작업 내 태스크 개수를 계산하고 Batch 풀의 컴퓨팅 노드 개수를 계산하는 일반적인 시나리오에 대한 API 지원을 제공합니다. 목록 쿼리를 사용하는 대신, 태스크 수 가져오기풀 노드 수 나열 작업을 호출할 수 있습니다. 그러나 이러한 보다 효율적인 작업은 최신이 아닐 수 있는 좀 더 제한된 정보를 반환합니다. 자세한 내용은 상태별 태스크 및 컴퓨팅 노드 개수 계산을 참조하세요.

세부 정보 수준 지정

프로덕션 Batch 애플리케이션에는 작업, 태스크 및 컴퓨팅 노드와 같은 수천 개의 엔터티가 있을 수 있습니다. 리소스에 대해 만드는 각 쿼리에 대해 잠재적으로 많은 양의 데이터가 Batch 서비스에서 애플리케이션으로 이동합니다. 성능 향상을 위해 쿼리가 반환하는 항목 수와 정보를 제한합니다.

Azure.Compute.Batch API 코드 조각은 작업(job)과 연결된 모든 태스크를 각 태스크의 모든 속성과 함께 나열합니다.

// Get a collection of all of the tasks and all of their properties for job-001
AsyncPageable<BatchTask> allTasks = batchClient.GetTasksAsync("job-001");

세부 정보를 쿼리에 적용하여 정보를 보다 효율적으로 나열합니다. filter, select, expand 문자열을 BatchClient.GetTasks 메서드에 전달합니다. 이 코드 조각은 완료된 태스크의 ID, 명령줄 및 컴퓨팅 노드 정보 속성만 반환합니다.

// Specify filter and select strings to return only a subset of tasks and their properties.
AsyncPageable<BatchTask> completedTasks = batchClient.GetTasksAsync(
    jobId: "job-001",
    filter: "state eq 'completed'",
    select: new[] { "id", "commandLine", "nodeInfo" });

이 예제 시나리오에서 수천 개의 태스크가 작업에 있다면 두 번째 쿼리의 결과는 대개 첫 번째 쿼리의 결과보다 훨씬 더 빨리 반환됩니다. Azure.Compute.Batch API에서 filter, selectexpand 매개 변수를 사용하는 방법에 대한 자세한 내용은 Azure.Compute.Batch의 효율적인 쿼리 섹션을 참조하세요.

중요

애플리케이션의 최대 효율성과 성능을 위해 항상 filter, selectexpand 문자열을 .NET API 목록에 제공하는 것이 좋습니다. 세부 정보 수준을 지정하여 Batch 서비스 응답 시간을 낮추고, 네트워크 사용률을 개선하며 클라이언트 애플리케이션의 메모리 사용을 최소화하는 데 도움이 될 수 있습니다.

쿼리 문자열 사용

Azure.Compute.BatchBatch REST API를 사용하여 쿼리에서 반환되는 항목 수와 각 항목에 대해 반환되는 정보의 양을 줄일 수 있습니다. 쿼리 범위를 좁히는 데 사용할 수 있는 세 가지 쿼리 문자열 유형은 $filter, $select$expand입니다.

Azure. Compute.Batch API는 사용하려는 , filterselect 매개 변수를 사용하는 목록 메서드에 대한 expand 참조를 참조하세요. 또한 Azure.Compute.Batch의 효율적인 쿼리 섹션을 검토하세요.

Batch REST API의 경우 Batch REST API 참조를 참조하세요. 쿼리할 리소스에 대해 목록 참조를 찾습니다. 그런 다음, URI 매개 변수 섹션을 검토하여 , $filter, $select$expand에 대한 자세한 내용을 확인합니다. 예를 들어 풀에 대한 URI 매개 변수 - 목록을 참조하세요. 또한 Azure CLI를 사용하여 효율적인 Batch 쿼리를 만드는 방법도 참조하세요.

참고

세 가지 쿼리 문자열 형식 중 하나를 구성할 때 속성 이름 및 사례가 해당 REST API 요소와 일치해야 합니다. 예를 들어 .NET BatchTask 클래스로 작업하는 경우 .NET 속성이 BatchTask.State인 경우에도 State 대신 state 지정해야 합니다. 자세한 내용은 .NET 및 REST API 간의 속성 매핑을 참조하세요.

필터

$filter 식 문자열은 반환되는 항목의 수를 줄입니다. 예를 들어 작업과 관련해서 실행 중인 태스크만 나열하거나 태스크를 실행할 준비가 된 컴퓨팅 노드만 나열할 수 있습니다.

이 문자열은 하나 이상의 식으로 구성된 문자열로 구성됩니다. 식은 속성 이름, 연산자, 값으로 이루어져 있습니다. 각 속성에 대해 지원되는 연산자의 경우처럼 지정할 수 있는 속성은 쿼리한 항목 마다 고유합니다. andor 논리 연산자를 사용하면 여러 식을 결합할 수 있습니다.

(state eq 'running') and startswith(id, 'renderTask') 예제는 실행 중인 렌더링 태스크만 나열합니다.

선택

$select 식 문자열은 각 항목에 대해 반환되는 속성 값을 제한합니다. 쉼표로 구분된 속성 이름의 목록을 지정하고 해당 속성 값은 쿼리 결과의 항목에 대해 반환됩니다. 쿼리 중인 엔터티 형식에 대한 속성을 지정할 수 있습니다.

id, state, stateTransitionTime 예제는 각 태스크에 대해 반환되어야 하는 세 가지 속성 값만 지정하고 있습니다.

확장

$expand 식 문자열은 특정 정보를 얻는 데 필요한 API 호출 수를 줄입니다. 이 문자열을 사용하여 단일 API 호출을 통해 각 항목에 대한 자세한 정보를 얻을 수 있습니다. 이 메서드는 API 호출을 줄여 성능을 향상시키는 데 도움이 됩니다. 엔터티 목록을 가져오고 각 목록 항목에 대한 정보를 요청하는 대신 $expand 문자열을 사용합니다.

$select와 비슷하게, $expand는 특정 데이터가 목록 쿼리 결과에 포함되어 있는지 여부를 제어합니다. 모든 속성이 필요하고 선택 문자열이 지정되지 $expand않은 경우 통계 정보를 가져오는 데 사용해야 합니다 . select 문자열을 사용하여 속성 하위 집합을 가져올 경우 select 문자열에서 stats를 지정할 수 있으며 $expand는 지정하지 않아도 됩니다.

이 문자열의 지원되는 용도에는 작업, 작업 일정, 태스크 및 풀 나열이 포함됩니다. 현재 이 문자열은 통계 정보만 지원합니다.

stats 예제는 목록에서 각 항목에 대해 반환되어야 하는 통계 정보를 지정합니다.

Filter, select 및 expand 문자열 규칙

  • filter, select 및 expand 문자열의 속성 이름이 Batch REST API에서와 같이 표시되는지 확인합니다. 이 규칙은 Azure.Compute.Batch 또는 다른 Batch SDK 중 하나를 사용하는 경우에도 적용됩니다.
  • 모든 속성 이름은 대/소문자를 구분하지만, 속성 값은 대/소문자를 구분하지 않습니다.
  • 날짜/시간 문자열은 두 형식 중 하나가 될 수 있으며 DateTime으로 시작해야 합니다.
    • W3C-DTF 형식 예제: creationTime gt DateTime'2011-05-08T08:49:37Z'
    • RFC 1123 형식 예제: creationTime gt DateTime'Sun, 08 May 2011 08:49:37 GMT'
  • 부울 문자열은 true 또는 false입니다.
  • 잘못된 속성이나 연산자를 지정한 경우 400 (Bad Request) 오류가 발생합니다.

Azure.Compute.Batch에서 효율적인 쿼리

Azure.Compute.Batch API에서 BatchClient의 목록 메서드는 filter, selectexpand 매개 변수를 직접 받습니다.

  • filter: 반환되는 항목 수를 제한합니다.
  • select: 각 항목과 함께 반환되는 속성 값을 지정합니다.
  • expand: 각 항목에 대한 별도의 호출 대신 단일 API 호출의 모든 항목에 대한 데이터를 검색합니다.

다음 코드 조각에서는 Azure.Compute.Batch API를 사용하여 특정 풀 집합의 통계를 Batch 서비스에서 효율적으로 쿼리합니다. Batch 사용자는 테스트 및 프로덕션 풀을 가집니다. 테스트 풀 ID는 "test"를 접두사로 사용하고 프로덕션 풀 ID는 "prod"를 접두사로 사용합니다. myBatchClient 는 다음과 같은 BatchClient 클래스의 인스턴스를 적절하게 초기화합니다.

// Pull only the "test" pools, and limit the data crossing the wire by selecting only
// the Id and Statistics properties. Use expand="stats" so the .NET API pulls the
// statistics for the BatchPools in a single underlying REST API call. Note that we
// use the pool's REST API element name "stats" here as opposed to "Statistics" as it
// appears in the .NET API (BatchPool.Statistics).
List<BatchPool> testPools = new List<BatchPool>();
await foreach (BatchPool pool in myBatchClient.GetPoolsAsync(
    filter: "startswith(id, 'test')",
    select: new[] { "id", "stats" },
    expand: new[] { "stats" }))
{
    testPools.Add(pool);
}

반환되는 데이터의 양을 제한하기 위해 filter과 같은 적절한 Get 메서드에 동일한 selectexpand매개 변수와 매개 변수를 전달할 수도 있습니다.

Batch REST를 .NET API에 매핑

filter, select 및 expand 문자열의 속성 이름은 이름과 대소문자 모두 해당 REST API 항목을 반영해야 합니다. 다음 표는 .NET과 REST API 간의 매핑을 제공합니다.

필터 문자열에 대한 매핑

  • .NET list 메서드: 이 열의 각 .NET API 메서드는 filter, selectexpand 문자열 매개 변수를 허용합니다.
  • REST 목록 요청: 이 열에 나열된 각 REST API 페이지에는 filter 문자열에서 허용되는 속성과 연산을 포함하는 테이블이 있습니다. 문자열을 생성 filter 할 때 이러한 속성 이름 및 작업을 사용할 수 있습니다.
.NET 목록 메서드 REST 목록 요청
BatchAccountResource.GetBatchAccountCertificates 계정에 인증서 나열
BatchClient.GetTaskFiles 작업과 연관된 파일 나열
BatchClient.GetJobPreparationAndReleaseTaskStatuses 작업 준비 및 작업에 대한 작업 릴리스 태스크의 상태 나열
BatchClient.GetJobs 계정에 작업 나열
BatchClient.GetNodeFiles 노드에 파일 나열
BatchClient.GetTasks 작업과 연관된 태스크 나열
BatchClient.GetJobSchedules 계정에 작업 일정 나열
BatchClient.GetJobsFromSchedule 작업 일정과 연관된 작업 나열
BatchClient.GetNodes 풀에 컴퓨팅 노드 나열
BatchClient.GetPools 계정의 풀 목록 나열

특정 문자열 매핑

  • Azure. Compute.Batch 형식: Azure. Compute.Batch API 유형입니다.
  • REST API 엔터티: 이 열의 각 페이지에는 형식에 대한 REST API 속성 이름을 나열하는 하나 이상의 표가 들어 있습니다. 이러한 속성 이름은 select 문자열을 구성할 때 사용됩니다. 문자열을 생성 select 할 때 동일한 속성 이름을 사용합니다.
Azure.Compute.Batch 유형 REST API 개체
BatchJob 작업 정보 가져오기
배치 작업 일정 작업 일정 정보 가져오기
배치노드 노드 정보 가져오기
BatchPool 풀에 대한 정보 가져오기
BatchTask 작업 정보 가져오기

예: filter 문자열 구성

목록 메서드의 filter 매개 변수에 대한 필터 문자열을 생성하려면 해당 REST API 페이지를 찾습니다. 선택 가능한 속성 및 지원되는 연산자는 첫 번째 다중 행 테이블에 있습니다. 예를 들어, 종료 코드가 0이 아닌 모든 태스크를 검색하려면 작업과 연결된 태스크 목록에서 적용 가능한 속성 문자열과 허용 가능한 연산자를 확인합니다.

속성 허용되는 연산 유형
executionInfo/exitCode eq, ge, gt, le , lt Int

관련 필터 문자열은 다음과 같습니다.

(executionInfo/exitCode lt 0) or (executionInfo/exitCode gt 0)

예: select 문자열 구성

문자열을 select 생성하려면 나열할 엔터티에 해당하는 REST API 페이지를 찾습니다. 선택 가능한 속성 및 지원되는 연산자는 첫 번째 다중 행 테이블에 있습니다. 예를 들어, 목록의 각 태스크에 대해 ID 및 명령줄만 검색하려면 태스크에 대한 정보 가져오기를 확인합니다.

속성 유형 참고
id String The ID of the task.
commandLine String The command line of the task.

관련된 select 문자열은 다음과 같습니다.

id, commandLine

코드 샘플

효율적인 목록 쿼리

EfficientListQueries 샘플 프로젝트는 효율적인 목록 쿼리가 애플리케이션 성능에 어떤 영향을 미치는지를 보여 줍니다. 이 C# 콘솔 애플리케이션은 많은 작업을 만들고 또 작업에 추가합니다. 그런 다음, 애플리케이션은 BatchClient.GetTasks 메서드를 여러 번 호출하고 다른 filterselectexpand 매개 변수 값을 전달하여 반환할 데이터의 양을 변경합니다. 이러한 샘플은 다음과 비슷한 출력을 생성합니다.

Adding 5000 tasks to job jobEffQuery...
5000 tasks added in 00:00:47.3467587, hit ENTER to query tasks...

4943 tasks retrieved in 00:00:04.3408081 (ExpandClause:  | FilterClause: state eq 'active' | SelectClause: id,state)
0 tasks retrieved in 00:00:00.2662920 (ExpandClause:  | FilterClause: state eq 'running' | SelectClause: id,state)
59 tasks retrieved in 00:00:00.3337760 (ExpandClause:  | FilterClause: state eq 'completed' | SelectClause: id,state)
5000 tasks retrieved in 00:00:04.1429881 (ExpandClause:  | FilterClause:  | SelectClause: id,state)
5000 tasks retrieved in 00:00:15.1016127 (ExpandClause:  | FilterClause:  | SelectClause: id,state,environmentSettings)
5000 tasks retrieved in 00:00:17.0548145 (ExpandClause: stats | FilterClause:  | SelectClause: )

Sample complete, hit ENTER to continue...

이 예제에서는 반환되는 항목 수와 속성을 제한하여 쿼리 응답 시간을 크게 낮출 수 있음을 보여 줍니다. 이 샘플 프로젝트와 다른 샘플 프로젝트가 GitHub의 azure-batch-samples 리포지토리에 있습니다.

BatchMetrics 라이브러리

다음 BatchMetrics 샘플 프로젝트는 배치 API를 사용하여 Azure Batch 작업 진행률을 효율적으로 모니터링하는 방법을 보여 줍니다.

이 샘플에는 자체 프로젝트에 통합할 수 있는 .NET 클래스 라이브러리 프로젝트가 포함되어 있습니다. 라이브러리 사용을 연습하고 시연하는 간단한 명령줄 프로그램도 있습니다.

프로젝트 내의 샘플 애플리케이션은 다음 작업을 보여 줍니다.

  • 필요한 속성에 대해서만 다운로드하기 위해 특정 특성 선택
  • 마지막 쿼리 이후에 변경 내용만 다운로드하기 위해 상태 전환 시간에서 필터링

예를 들어 다음 메서드는 BatchMetrics 라이브러리에 나타납니다. 조회되는 엔터티에 대해 selectfilter 속성만 가져와야 하며, 지정된 id 매개 변수 이후 상태가 변경된 엔터티만 반환되어야 함을 지정하는 stateDateTime 문자열이 포함된 튜플을 반환합니다.

return (
    Filter: string.Format("stateTransitionTime gt DateTime'{0:o}'", time),
    Select: new[] { "id", "state" });

다음 단계