2013-06-26 11 views
5

sorunları sorundur. Bir masmavi masada yaklaşık 40 milyon varlığı güncellemem gerekiyor. Bunu tek bir örnekle yapmak (seçim -> orijinali sil -> yeni bölümle ekle) yaklaşık Noel'e kadar sürer.güncelleme 40+ milyon kişiler Yani burada

Benim düşünce kaç örneğini çalıştıran bir gök mavisi işçi rol kullanmaktır. Buradaki problem, en büyük 1000 kaydı ele alıyor. Bu bir örnekle iyi ama seçimlerini 20 yürütmek ile kesinlikle örtüşecek .. çok. Bu, başka bir örnek tarafından zaten silinmiş kayıtları güncellemeye çalışan ve zaten güncellenmiş bir kaydı güncelleyen çok fazla boşa harcanan hesaplama ile sonuçlanır.

Birkaç fikirler üzerinden çalışmasını, ama ben var iyi seçenek ardından işçiler sıradan çıkarma sahip roller bölüm ve satır tuşlarıyla bir kuyruk doldurmak zorunda ve fiili işlemeyi yapmak nedir?

Daha iyi bir fikir?

cevap

3

, sen işlemek için her işçi için kabaca eşit büyüklükte ayrık listelere bölün deneyebilir. Örneğin, Worker1, 'C' ile başlayan ve 'C' ile başlayan anahtarları işler, Worker2 'F' ile başlayan ve D ile başlayan tuşları işler.

Bu uygun değilse, kuyruk çözümünüz işe yarayacaktır. Fakat yine de, her sıra mesajının mümkünse bir dizi anahtarı temsil ettiğini öneriyorum. Örneğin, tek bir kuyruk mesajı, 'A' ile 'C' arasındaki herşeyi silmek veya bunun gibi bir şeyi belirtir.

Her durumda, aynı PartitionKey'de birden fazla varlığa sahipseniz, hem toplu iş işlemini hem de ekleme ve silme için toplu işlemlerden yararlanın. Bu, işlem sayısını en iyi durumda neredeyse on kat azaltabilir. Ayrıca, her bir işçi rolünde paralellik kullanmalısınız. İdeal olarak, yazma işlemini yapmak için async yöntemlerini (Begin/End veya * Async) kullanın ve paralel olarak birkaç işlemi (12 muhtemelen iyi bir sayı) çalıştırın. Birden fazla iş parçacığı da çalıştırabilirsiniz, ancak bu biraz daha az verimli. Her iki durumda da, tek bir çalışan tablo işlemiyle lot işlemlerini zorlayabilir. "-> Ekle Yeni -> Eski Sil Seç" Bir yan not olarak

, sizin süreç gitmek gerekir. "Seç -> Eski Sil -> Yeni Ekle" seçeneği, 2 & 3 numaralı adımları arasında bir hata oluşursa kalıcı veri kaybına neden olabilir.

+0

FWIW, sadece şimdi ben hiç asenkronisi ile bir işçinin üzerinde bir iş parçacığı kullanarak bir SQL veritabanına 5.35M masa varlıkları çıkarılan. 75 dakika sürdü ve bence SQL bu durumda darboğazdı. –

2

sana cevap olarak sorunuzu işaretlemek gerektiğini düşünüyorum;) ben senin bölüm ve satır tuşları neye benzediğini bilmiyorum çünkü daha iyi bir çözüm düşünemiyorum. Ancak çözümünüzü geliştirmek için, işlem maliyetinden tasarruf etmek için her sıraya birden çok bölüm/satır anahtarı pompalamayı seçebilirsiniz. Ayrıca, kuyruktan tüketirken, onları 32'lik partilere alın. Zaman uyumsuz olarak işleme. SQL sunucusundan (Azure) 170 milyon kayıt bir günden daha kısa sürede Masa depolama birimine aktarabiliyordum. senin PartitionKeys ve/veya RowKeys bilinen bir aralıkta içine düşerse

5

Çok ilginç bir soru! @Brian Reischl yanıtını genişletme (ve bir sürü :) bu yüzden bana sabırlı olmanızı rica ederiz sesli düşünerek edilir)

Varsayımları:

  • Kişisel varlıklar bazı şekil veya form seri hale getirilebilir. XML formatında ham veri alacağınızı varsayardım.
  • Tüm varlık okumasını yapan ayrı bir çalışan rolünüz var.
  • Değiştirilmiş öğeler yazmak için kaç tane işçi rolüne ihtiyaç duyulur biliyorsunuz.Tartışma uğruna, bahsettiğin gibi 20 olduğunu varsayalım.

Olası Çözüm:

Önce 20 damla kapları yaratacaktır. Onlara konteyner-00, konteyner-01, ... konteyner-19 adını verelim. Bir seferde 1000 -

Sonra varlıkları okumaya başlayın. XML formatındaki ham verileri masa deposundan çıkardığınız için, bir XML dosyası oluşturursunuz ve bu 1000 varlığı konteyner-00'da saklarsınız. Sonraki varlıklar kümesini getirip konteyner-01'de XML biçiminde kaydedip, 19'a kadar kazandığınız zamana kadar. Sonra bir sonraki varlıklar konteyner-00'a gider. Bu şekilde, varlıklarınızı tüm 20 konteynere eşit olarak dağıtıyorsunuz. Bütün varlıklar yazılır sonra

, bu varlıkları üzerinde işlem yapmak üzere işçi rol resmin içine gelirdi. Biz, Windows Azure örnekleri sıralı olarak sıralanır biliyoruz olduğundan, vb ... WorkerRole_IN_0, WorkerRole_IN_1 gibi örnek adlarını almak ve.

Yapacağınız şey, örnek adını almak, "0", "1" sayısını almaktır. Buna bağlı olarak, hangi işçi bloğu örneğinin hangi blob kutusundan okunacağını belirlersiniz ... WorkerRole_IN_0, dosyaları okunacak container-00, WorkerRole_IN_1, konteyner-01'deki dosyaları vb. okuyacaktır.

Şimdi, bu XML dosyasından varlıkları oluşturmak, XML dosyasını okumak bu varlıkları güncelleme ve masa depoya geri kazandıracak bireysel işçi rol örneği. Bu işlem yapıldıktan sonra, XML dosyasını sildiniz ve o kapsayıcıdaki bir sonraki dosyaya geçersiniz. Tüm dosyalar okunduktan ve işlendikten sonra, kabı silebilirsiniz.

Daha önce de söylediğim gibi, bu türde bir çözüm "sesli düşünerek" bir çok şey var ve bazı şeyler "okuyucu" işçi rolü aşağı ve diğer şeyler gittiğinde ne olur gibi düşünülmelidir.