Aracılığıyla paylaş


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

Çoğu Azure Batch uygulama, Batch hizmetini sorgulayan izleme veya diğer işlemleri yapar. Bu tür liste sorguları genellikle düzenli aralıklarla gerçekleşir. Örneğin, bir işte 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. Batch .NET kitaplığıyla Batch işleri, görevler, işlem düğümleri ve diğer kaynaklar için filtrelenmiş sorgular oluşturabilirsiniz.

Not

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ı Alma ve Liste Havuzu Düğüm Sayıları 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 bkz . Görevleri ve işlem düğümlerini duruma göre sayma.

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 gider. Performansı artırmak için sorgunuzun döndürdüğü öğe sayısını ve hangi bilgileri sınırlayın.

Bu Batch .NET API kod parçacığı, bir işle ilişkili her görevi ve her görevin tüm özelliklerini listeler.

// Get a collection of all of the tasks and all of their properties for job-001
IPagedEnumerable<CloudTask> allTasks =
    batchClient.JobOperations.ListTasks("job-001");

Bilgileri daha verimli bir şekilde listelemek için sorgunuza ayrıntı düzeyi uygulayın. JobOperations.ListTasks yöntemine bir ODATADetailLevel nesnesi sağlayın. Bu kod parçacığı, tamamlanan görevlerin yalnızca kimlik, komut satırı ve işlem düğümü bilgi özelliklerini döndürür.

// Configure an ODATADetailLevel specifying a subset of tasks and
// their properties to return
ODATADetailLevel detailLevel = new ODATADetailLevel();
detailLevel.FilterClause = "state eq 'completed'";
detailLevel.SelectClause = "id,commandLine,nodeInfo";

// Supply the ODATADetailLevel to the ListTasks method
IPagedEnumerable<CloudTask> completedTasks =
    batchClient.JobOperations.ListTasks("job-001", detailLevel);

Bu örnek senaryoda, işte binlerce görev varsa, ikinci sorgunun sonuçları genellikle ilk sorgudan daha hızlı döndürülür. Batch .NET API'siyle öğeleri listelerken kullanma ODATADetailLevel hakkında daha fazla bilgi için Batch .NET'te verimli sorgulama bölümüne bakın.

Önemli

Uygulamanızın en yüksek verimlilik ve performansı için .NET API liste çağrılarınıza her zaman bir ODATADetailLevel nesne sağlamanızı kesinlikle öneririz. Bir ayrıntı düzeyi belirterek Batch hizmeti yanıt sürelerini azaltmaya, ağ kullanımını geliştirmeye ve istemci uygulamaları tarafından bellek kullanımını en aza indirmeye yardımcı olabilirsiniz.

Sorgu dizelerini kullanma

Batch .NET ve Batch REST API'lerini kullanarak bir sorgunun döndürdüğü öğe sayısını ve sorgunun her öğe için ne kadar bilgi döndürdüğünü azaltabilirsiniz. Sorgunuzu daraltmak için kullanabileceğiniz üç sorgu dizesi türü vardır: $filter, $select ve $expand.

Batch .NET API'sinde ODATADetailLevel Sınıfı özelliklerine bakın. Batch .NET'te verimli sorgulama bölümünü de gözden geçirin.

Batch REST API için bkz. Batch REST API başvurusu. Sorgulamak istediğiniz kaynağın Liste başvurusunu bulun. Ardından, , $selectve $expandhakkındaki $filterayrıntılar için URI Parametreleri bölümünü gözden geçirin. Örneğin, Havuz - Liste için URI parametrelerine bakın. Ayrıca Bkz. Azure CLI ile verimli Batch sorguları yapma.

Not

Üç 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ıklarıyla eşleştiğinden emin olmanız gerekir. Örneğin, .NET CloudTask sınıfıyla çalışırken.NET özelliği CloudTask.State olsa bile Stateyerine 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, bir iş için yalnızca çalışan görevleri 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 ormantıksal işleçleri and 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çim

İ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ı artırmaya 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 seçim dizesi belirtilmediğinde istatistik $expandbilgilerini almak için kullanılmalıdır. Özelliklerin bir alt kümesini almak için bir seçme dizesi kullanılıyorsa, stats seçim dizesinde belirtilebilir ve $expand belirtilmesi gerekmez.

Bu dizenin desteklenen kullanımları işleri, iş zamanlamalarını, görevleri ve havuzları listelemeyi içerir. Ş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'de olduğu gibi göründüğünden emin olun. Bu kural Batch .NET 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 ile DateTimeolması 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.

Batch .NET'te verimli sorgulama

Batch .NET API'sinde ODATADetailLevel sınıfı filtreleme, seçme ve genişletme işlemlerini listelemek için dizeler sağlar. sınıfı ODataDetailLevel üç ortak dize özelliğine sahiptir. Bu özellikleri oluşturucuda belirtebilir veya özellikleri doğrudan nesne üzerinde ayarlayabilirsiniz. Ardından, nesnesini ListPools, ListJobs ve ListTasks gibi çeşitli liste işlemlerine parametre olarak geçirin. ODataDetailLevel

Aşağıdaki kod parçacığı Batch .NET API'sini kullanarak Batch hizmetini belirli bir havuz kümesinin istatistikleri için verimli bir şekilde sorgular. 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.

// First we need an ODATADetailLevel instance on which to set the filter, select,
// and expand clause strings
ODATADetailLevel detailLevel = new ODATADetailLevel();

// We want to pull only the "test" pools, so we limit the number of items returned
// by using a FilterClause and specifying that the pool IDs must start with "test"
detailLevel.FilterClause = "startswith(id, 'test')";

// To further limit the data that crosses the wire, configure the SelectClause to
// limit the properties that are returned on each CloudPool object to only
// CloudPool.Id and CloudPool.Statistics
detailLevel.SelectClause = "id, stats";

// Specify the ExpandClause so that the .NET API pulls the statistics for the
// CloudPools 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 (CloudPool.Statistics)
detailLevel.ExpandClause = "stats";

// Now get our collection of pools, minimizing the amount of data that is returned
// by specifying the detail level that we configured above
List<CloudPool> testPools =
    await myBatchClient.PoolOperations.ListPools(detailLevel).ToListAsync();

İpucu

Select ve Expand yan tümceleriyle yapılandırılan ODATADetailLevel örneği, döndürülen veri miktarını sınırlamak için PoolOperations.GetPool gibi uygun Get yöntemlerine de geçirilebilir.

Batch REST ile .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 bir ODATADetailLevel nesnesini parametre olarak 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 ODATADetailLevel.FilterClause dizesi oluştururken bu özellik adlarını ve işlemlerini kullanabilirsiniz.
.NET liste yöntemleri REST listesi istekleri
CertificateOperations.ListCertificates Hesaptaki sertifikaları listeleme
CloudTask.ListNodeFiles Bir görevle ilişkili dosyaları listeleme
JobOperations.ListJobPreparationAndReleaseTaskStatus İş için iş hazırlama ve iş bırakma görevlerinin durumunu listeleme
JobOperations.ListJobs Hesaptaki işleri listeleme
JobOperations.ListNodeFiles Düğümdeki dosyaları listeleme
JobOperations.ListTasks Bir işle ilişkili görevleri listeleme
JobScheduleOperations.ListJobSchedules Hesaptaki iş zamanlamalarını listeleme
JobScheduleOperations.ListJobs bir iş zamanlaması ile ilişkili işleri listeleme
PoolOperations.ListComputeNodes Havuzdaki işlem düğümlerini listeleme
PoolOperations.ListPools Hesaptaki havuzları listeleme

Belirli dizeler için eşlemeler

  • Batch .NET türleri: Batch .NET 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ı , seçme dizeleri oluştururken kullanılır. Bir ODATADetailLevel.SelectClause dizesi oluştururken aynı özellik adlarını kullanırsınız.
Batch .NET türleri REST API varlıkları
Sertifika Sertifika hakkında bilgi alma
CloudJob İş hakkında bilgi alma
CloudJobSchedule İş zamanlaması hakkında bilgi alma
ComputeNode Düğüm hakkında bilgi alma
CloudPool Havuz hakkında bilgi alma
CloudTask Görev hakkında bilgi alma

Örnek: filtre dizesi oluşturma

ODATADetailLevel.FilterClause 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 listele seçeneğini işaretleyin:

Özellik İzin verilen işlemler Tür
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

ODATADetailLevel.SelectClause 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 Tür Notlar
id String The ID of the task.
commandLine String The command line of the task.

İlgili seçim dizesi:

id, commandLine

Kod örnekleri

Etkili liste sorguları

EfficientListQueries örnek projesi, liste sorgulamanın uygulama performansını ne kadar verimli etkilediğini gösterir. Bu C# konsol uygulaması bir işe çok sayıda görev oluşturur ve ekler. Ardından uygulama JobOperations.ListTasks yöntemine birden çok çağrı yapar ve ODATADetailLevel nesnelerini geçirir. Bu nesneler, döndürülecek veri miktarını değiştirmek için farklı özellik değerleriyle yapılandırılır. Bu örnek şuna benzer bir çıkış üretir:

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, özellikleri ve döndürülen öğ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şin ilerleme durumunun nasıl verimli bir şekilde izleneceğini 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
  • Yalnızca son sorgudan bu yana yapılan 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 belirten bir ODATADetailLevel döndürür. Ayrıca, yalnızca belirtilen DateTime parametreden bu yana durumu değiştirilmiş varlıkların döndürülmesi gerektiğini belirtir.

internal static ODATADetailLevel OnlyChangedAfter(DateTime time)
{
    return new ODATADetailLevel(
        selectClause: "id, state",
        filterClause: string.Format("stateTransitionTime gt DateTime'{0:o}'", time)
    );
}

Sonraki adımlar