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. 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ı 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 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 gönderilir. 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ığı yalnızca tamamlanan görevlerin 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ı iyileş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 sorgunun kaç öğe döndürdüğü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'si için bkz. ODATADetailLevel Sınıfı özellikleri. Batch .NET'te verimli sorgulama bölümünü de gözden geçirin.
Batch REST API'si için bkz. Batch REST API başvurusu. Sorgulamak istediğiniz kaynağın Liste başvurusunu bulun. Ardından, , $select
ve $expand
hakkındaki $filter
ayrıntılar için URI Parametreleri 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.
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ık gelenleriyle 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 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 or
mantı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ç
İ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, $expand
istatistik 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, 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
DateTime
olması 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'
- W3C-DTF biçim örneği:
- Boole dizeleri veya
true
false
ş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ı, listeleme işlemleri için dizeleri filtreleme, seçme ve genişletme sağlar. sınıfı ODataDetailLevel
üç genel 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çirinODataDetailLevel
.
- ODATADetailLevel.FilterClause: Döndürülen öğe sayısını sınırlayın.
- ODATADetailLevel.SelectClause: Her öğeyle hangi özellik değerlerinin döndürüleceğini belirtin.
- ODATADetailLevel.ExpandClause: 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ığı, Batch hizmetini belirli bir havuz kümesinin istatistiklerini verimli bir şekilde sorgulamak için Batch .NET 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.
// 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 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 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.
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.
Ö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 listeleme 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 şöyledir:
id, commandLine
Kod örnekleri
Etkili 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. 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ış 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 belirten bir ODATADetailLevel döndürür. Ayrıca, yalnızca belirtilen DateTime
parametrenin döndürülmesi gerektiğinden bu yana durumu değiştirilmiş varlıkları 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
- Eşzamanlı düğüm görevleriyle Azure Batch işlem kaynağı kullanımını en üst düzeye çıkarın. Bazı iş yükü türleri, daha büyük (ancak daha az) işlem düğümünde paralel görevlerin yürütülmesinden yararlanabilir. Bu tür bir senaryoyla ilgili ayrıntılar için makaledeki örnek senaryoya göz atın.
- Görevleri ve düğümleri duruma göre sayarak Batch çözümlerini izleme