Batch kaynaklarını verimli bir şekilde listelemek için sorgu oluşturma

Çoğu Azure Batch uygulaması, Batch hizmetini sorgulayan izleme veya diğer işlemleri gerçekleştirir. Bu tür liste sorguları genellikle düzenli aralıklarla gerçekleşir. Örneğin, bir işteki kuyruğa alınmış görevleri denetleyebilmeniz için önce bu işteki her görevle ilgili verileri almanız gerekir. Batch hizmetinin sorgular için döndürdüğü veri miktarını azaltmak uygulamanızın performansını artırır. Bu makalede, bu tür sorguları verimli bir şekilde oluşturma ve yürütme açıklanmaktadır. Azure.Compute.Batch kitaplığıyla Batch işleri, görevler, işlem düğümleri ve diğer kaynaklar için filtrelenmiş sorgular oluşturabilirsiniz.

Note

Batch hizmeti, bir işteki görevleri sayma ve Batch havuzundaki işlem düğümlerini sayma gibi yaygın senaryolar için API desteği sağlar. Liste sorgusu kullanmak yerine Görev Sayılarını Al ve Havuz Düğümü Sayılarını Listele işlemlerini çağırabilirsiniz. Ancak, bu daha verimli işlemler güncel olmayabilecek daha sınırlı bilgiler döndürür. Daha fazla bilgi için Görevleri ve işlem düğümlerini duruma göre sayma bölümüne bakın.

Ayrıntı düzeyi belirtme

Üretim Batch uygulamasında işler, görevler ve işlem düğümleri gibi binlerce varlık olabilir. Kaynaklar hakkında yaptığınız her sorgu için batch hizmetinden uygulamanıza büyük miktarda veri gönderilir. Performansı artırmak için sorgunuzun döndürdüğü öğe sayısını ve hangi bilgileri sınırlayın.

Bu Azure.Compute.Batch API kod parçacığı, bir işle ilişkilendirilmiş her görevi, her görevin tüm özellikleriyle birlikte listeler.

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

Bilgileri daha verimli bir şekilde listelemek için sorgunuza ayrıntı düzeyi uygulayın. , filterve select dizelerini expand yöntemine geçirin. Bu kod parçacığı yalnızca tamamlanan görevlerin kimlik, komut satırı ve işlem düğümü bilgi özelliklerini döndürür.

// 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" });

Bu örnek senaryoda, işte binlerce görev varsa, ikinci sorgunun sonuçları genellikle ilk sorgudan daha hızlı döndürülür. filter, select ve expand parametrelerinin Azure.Compute.Batch API'si ile kullanımı hakkında daha fazla bilgi için Efficient querying in Azure.Compute.Batch bölümüne bakın.

Önemli

Uygulamanızın en yüksek verimlilik ve performansı için .NET API listenize her zaman filter, select ve (uygun olduğunda) expand dizeleri sağlamanızı öneririz. Bir ayrıntı düzeyi belirterek Batch hizmeti yanıt sürelerini azaltmaya, ağ kullanımını iyileştirmeye ve istemci uygulamaları tarafından bellek kullanımını en aza indirmeye yardımcı olabilirsiniz.

Sorgu dizelerini kullanma

Bir sorgunun döndürdüğü öğe sayısını ve sorgunun her öğe için döndürdüğü bilgi miktarını azaltmak için Azure.Compute.Batch ve Batch REST API’lerini kullanabilirsiniz. Sorgunuzu daraltmak için kullanabileceğiniz üç sorgu dizesi türü vardır: $filter, $select ve $expand.

Azure.Compute.Batch API’si için, kullanmak istediğiniz filter, select ve expand parametrelerine sahip list yöntemi için BatchClient başvurusuna bakın. Ayrıca Azure.Compute.Batch'te Verimli sorgulama bölümünü gözden geçirin.

Batch REST API'si için Batch REST API referansına bakın. Sorgulamak istediğiniz kaynağın Liste başvurusunu bulun. Ardından, , ve $filterhakkındaki $selectayrıntılar için $expand bölümünü gözden geçirin. Örneğin, Pool - List için URI parametrelerine bakın. Ayrıca Azure CLI ile verimli Batch sorguları yapmayı öğrenin.

Note

Üç sorgu dizesi türünden herhangi birini oluştururken, özellik adlarının ve büyük/küçük harflerinin REST API öğesi karşılık gelenleriyle eşleştiğinden emin olmanız gerekir. Örneğin, .NET BatchTask sınıfıyla çalışırken, .NET özelliği BatchTask.State olsa bile State yerine state belirtmeniz gerekir. Daha fazla bilgi için bkz. .NET ve REST API'leri arasındaki özellik eşlemeleri.

Filtre

İfade $filter dizesi, döndürülen öğe sayısını azaltır. Örneğin, yalnızca bir işin çalışan görevlerini listeleyebilir veya yalnızca görevleri çalıştırmaya hazır işlem düğümlerini listeleyebilirsiniz.

Bu dize, bir özellik adı, işleci ve değerinden oluşan bir ifadeye sahip bir veya daha fazla ifadeden oluşur. Belirtilebilen özellikler, her özellik için desteklenen işleçler gibi sorguladığınız her varlık türüne özeldir. Ve andmantıksal işleçleri or kullanılarak birden çok ifade birleştirilebilir.

Bu örnekte yalnızca çalışan işleme görevleri listelenir: (state eq 'running') and startswith(id, 'renderTask').

Seç

İfade $select dizesi, her öğe için döndürülen özellik değerlerini sınırlar. Virgülle ayrılmış özellik adlarının listesini belirtirsiniz ve sorgu sonuçlarındaki öğeler için yalnızca bu özellik değerleri döndürülür. Sorguladığınız varlık türünün özelliklerinden herhangi birini belirtebilirsiniz.

Bu örnek, her görev için yalnızca üç özellik değerinin döndürülmesi gerektiğini belirtir: id, state, stateTransitionTime.

Genişlet

İfade $expand dizesi, belirli bilgileri almak için gereken API çağrılarının sayısını azaltır. Tek bir API çağrısıyla her öğe hakkında daha fazla bilgi edinmek için bu dizeyi kullanabilirsiniz. Bu yöntem, API çağrılarını azaltarak performansı geliştirmeye yardımcı olur. Varlık listesini almak ve her liste öğesi hakkında bilgi istemek yerine bir $expand dize kullanın.

benzer şekilde $select, $expand belirli verilerin liste sorgusu sonuçlarına eklenip eklenmeyeceğini denetler. Tüm özellikler gerekli olduğunda ve hiçbir seçme dizesi belirtilmediğinde, $expandistatistik bilgilerini almak için kullanılmalıdır. Özelliklerin bir alt kümesini almak için bir seçme dizesi kullanılıyorsa, stats seçme dizesinde belirtilebilir ve $expand belirtilmesi gerekmez.

Bu dizenin desteklenen kullanımları arasında işleri, iş zamanlamalarını, görevleri ve havuzları listeleme yer alır. Şu anda dize yalnızca istatistik bilgilerini destekler.

Bu örnek, listedeki her öğe için istatistik bilgilerinin döndürülmesi gerektiğini belirtir: stats.

Dizeleri filtreleme, seçme ve genişletme kuralları

  • Özelliklerin filtre, seçme ve genişletme dizelerindeki adlarının Batch REST API'sinde olduğu gibi göründüğünden emin olun. Bu kural, Azure.Compute.Batch veya diğer Batch SDK’larından birini kullandığınızda bile geçerlidir.
  • Tüm özellik adları büyük/küçük harfe duyarlıdır, ancak özellik değerleri büyük/küçük harfe duyarlı değildir.
  • Tarih/saat dizeleri iki biçimden biri olabilir ve önünde DateTime bulunması gerekir.
    • W3C-DTF biçim örneği: creationTime gt DateTime'2011-05-08T08:49:37Z'
    • RFC 1123 biçim örneği: creationTime gt DateTime'Sun, 08 May 2011 08:49:37 GMT'
  • Boole dizeleri veya truefalseşeklindedir.
  • Geçersiz bir özellik veya işleç belirtilirse hata 400 (Bad Request) oluşur.

Azure'da verimli sorgulama. Compute.Batch

Azure.Compute.Batch API’sinde, BatchClient üzerindeki liste yöntemleri filter, select ve expand parametrelerini doğrudan kabul eder:

  • filter: Döndürülen öğe sayısını sınırlayın.
  • select: Her öğeyle hangi özellik değerlerinin döndürüleceğini belirtin.
  • expand: Her öğe için ayrı çağrılar yerine tek bir API çağrısındaki tüm öğelerin verilerini alın.

Aşağıdaki kod parçacığı, belirli bir havuz kümesine ait istatistikler için Batch hizmetini verimli bir şekilde sorgulamak amacıyla Azure.Compute.Batch API'sini kullanır. Batch kullanıcısının hem test hem de üretim havuzları vardır. Test havuzu kimliklerine "test" ön eki eklenir ve üretim havuzu kimliklerine "prod" ön eki eklenir. myBatchClient , BatchClient sınıfının düzgün şekilde başlatılan bir örneğidir.

// 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);
}

Tip

Döndürülen veri miktarını sınırlamak için filter gibi uygun Get yöntemlerine de aynı select, expandve parametreleri geçirilebilir.

Toplu REST to .NET API eşlemeleri

Filtre, seçme ve genişletme dizelerindeki özellik adları hem ad hem de büyük/küçük harf olarak REST API karşılıklarını yansıtmalıdır. Aşağıdaki tablolarda .NET ve REST API'sinin karşılık gelenleri arasında eşlemeler sağlanır.

Filtre dizeleri için eşlemeler

  • .NET liste yöntemleri: Bu sütundaki .NET API yöntemlerinin her biri filter, select ve expand dize parametrelerini kabul eder.
  • REST listesi istekleri: Bu sütunda listelenen her REST API sayfası, filtre dizelerinde izin verilen özelliklere ve işlemlere sahip bir tablo içerir. Bir dize oluştururken filter bu özellik adlarını ve işlemlerini kullanabilirsiniz.
.NET liste yöntemleri REST listesi istekleri
BatchAccountResource.GetBatchAccountCertificates Hesaptaki sertifikaları listeleme
BatchClient.GetTaskFiles Bir görevle ilişkili dosyaları listeleme
BatchClient.GetJobPreparationAndReleaseTaskStatuses Bir işin iş hazırlama ve iş bırakma görevlerinin durumunu listeleme
BatchClient.GetJobs Hesaptaki işleri listeleme
BatchClient.GetNodeFiles Düğümdeki dosyaları listele
BatchClient.GetTasks Bir işle ilişkili görevleri listeleme
BatchClient.GetJobSchedules Hesaptaki iş zamanlamalarını listeleme
BatchClient.GetJobsFromSchedule İş zamanlaması ile ilişkili işleri listeleme
BatchClient.GetNodes Hesaplama düğümlerini havuzda listeleyin
BatchClient.GetPools Hesaptaki havuzları listeleme

Belirli dizeler için eşlemeler

  • Azure. Compute.Batch türleri: Azure. Compute.Batch API türleri.
  • REST API varlıkları: Bu sütundaki her sayfa türü için REST API özellik adlarını listeleyen bir veya daha fazla tablo içerir. Bu özellik adları select dizeleri oluştururken kullanılır. Bir dize oluştururken select aynı özellik adlarını kullanırsınız.
Azure.Compute.Batch türleri REST API varlıkları
BatchJob İş hakkında bilgi alma
BatchWorkSchedule İş zamanlaması hakkında bilgi alma
BatchNode Düğüm hakkında bilgi alma
BatchPool Havuz hakkında bilgi alma
BatchTask Bir görev hakkında bilgi alın

Örnek: filtre dizesi oluşturma

Liste yönteminin filter parametresi için bir filtre dizesi oluşturmak için ilgili REST API sayfasını bulun. Seçilebilir özellikler ve desteklenen işleçler ilk çok satırlı tabloda yer alır. Örneğin, çıkış kodu sıfır olmayan tüm görevleri almak için, geçerli özellik dizesi ve izin verilen işleçler için bir işle ilişkili görevleri listeleme seçeneğini işaretleyin:

Özellik İzin verilen işlemler Type
executionInfo/exitCode eq, ge, gt, le , lt Int

İlgili filtre dizesi:

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

Örnek: seçme dizesi oluşturma

Bir select dize oluşturmak için, listelediğiniz varlığa karşılık gelen REST API sayfasını bulun. Seçilebilir özellikler ve desteklenen işleçler ilk çok satırlı tabloda yer alır. Örneğin, bir listedeki her görevin yalnızca kimliğini ve komut satırını almak için Görev hakkında bilgi al'ı işaretleyin:

Özellik Type Notes
id String The ID of the task.
commandLine String The command line of the task.

İlgili seçim dizesi şöyledir:

id, commandLine

Kod örnekleri

Verimli liste sorguları

EfficientListQueries örnek projesi, liste sorgulamanın verimli bir şekilde uygulama performansını nasıl etkilediğini gösterir. Bu C# konsol uygulaması bir işe çok sayıda görev oluşturur ve ekler. Daha sonra uygulama BatchClient.GetTasks yöntemine birden çok çağrı yapar ve döndürülecek veri miktarını değiştirmek için farklı filter, selectve expand parametre değerlerini geçirir. Bu örnek şuna benzer bir çıkış oluşturur:

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...

Örnek, döndürülen özellikleri ve öğe sayısını sınırlayarak sorgu yanıt sürelerini büyük ölçüde azaltabileceğinizi gösterir. Bunu ve diğer örnek projeleri GitHub'daki azure-batch-samples deposunda bulabilirsiniz.

BatchMetrics kitaplığı

Aşağıdaki BatchMetrics örnek projesi, Batch API'sini kullanarak Azure Batch işinin ilerleme durumunu verimli bir şekilde izleme işlemini gösterir.

Bu örnek, kendi projelerinize ekleyebileceğiniz bir .NET sınıf kitaplığı projesi içerir. Ayrıca, kitaplığın kullanımını alıştırmak ve göstermek için basit bir komut satırı programı da vardır.

Proje içindeki örnek uygulama şu işlemleri gösterir:

  • Yalnızca ihtiyacınız olan özellikleri indirmek için belirli öznitelikleri seçme
  • Son sorgudan bu yana yalnızca değişiklikleri indirmek için durum geçiş sürelerini filtreleme

Örneğin, BatchMetrics kitaplığında aşağıdaki yöntem görüntülenir. Sorgulanan varlıklar için yalnızca id ve state özelliklerinin alınması gerektiğini ve yalnızca durumu belirtilen DateTime parametresinden bu yana değişmiş varlıkların döndürülmesi gerektiğini belirten select ve filter dizelerini içeren bir demet döndürür.

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

Sonraki Adımlar