Uzun koşu istatistikleri işlemek - dil seçimine düşünceler?

3 Cevap java

Ben idare ediyorum, bir web sitesi için bir lamba yığını üzerinde duyuyorum. Orada (bizim masaüstü ürünle ilgili çeşitli şeyler) kullanım istatistikleri rulo için bir ihtiyaç olduğunu ve başlangıçta (zaten verilerle çalışmak için sınıfların bir grup vardı ki varlık) PHP ile sorunu ele alındı. Tüm 5.3 kullanıyordum benim dev kutusunda iyi çalıştı

Uzun lafın kısası, 5.1 bellek yönetimi çok kötü emmek gibi görünüyor, ve ben bir sabit bellek alanında çalıştırmak için komut uzun vadeli rulo almak için aptal yerine koyup kandırmaya bir sürü yapmak zorunda kalmıştım. Bizim sunucu adamlar şu anda php yükseltmek istemezler. Ben beri yüzden tekrar bu sorun haline çalıştırmak yok geri 5,1 benim dev sunucu hareket ettik ...

MySQL veritabanlarının madencilik potansiyel bu (bir cron programa karşıt olarak) gelecekte tüm zamanını yapan bir süreç çalışıyor, farklı dönemler ve çözünürlükler için istatistikleri rulo için, ne dil seçimi tavsiye edersiniz? (Ben bunu biliyorum daha fazla veya daha az), java (çok iyi bilmiyorum), php ile dışarı çıkmış (çok iyi biliyorum) Python bakıyordu.

Herhangi bir öneriniz için teşekkür ederiz.

Şaka

Edit: design clarification for commenter

Kararları: toplaması komut şu anda çalışır yolu, Ben kararlar ve kovaları tanımlamak için bazı sınıfları var olduğunu. Bu keyfi dönemi tarihe dayanmaktadır - her sınıf bu kova için zaman aralığını tanımlayan bir başlangıç ​​ve bitiş damgası veren bir "kova sayı" Verilen - I yıl, ay, hafta, gün var. Şu anda, o çalıştırıldı son kez bu yana her çözünürlük için sıvadı veri setini tamamlayacak, yani sistem, "tam" kayıtları tutar.

SQL Strat: Taban istatistikler birçok farklı şemalar ve tablolar yer almaktadır. Ben, o zaman insert için bir kayıt çoğunlukla her sıvamış stat için bireysel sorgular doldurmak yok. Sizin gibi iç içe alt sorgular öneriyorlar:

Rolled_up_stats (SOMEVAL, SOMEVAL, SOMEVAL, ...) VALUES (someschema2 dan AVG (somestat2) SELECT someschema dan SUM (somestat) SEÇ) INSERT

Bu alt sorgular doğru, geçici tablolar üretecek? Benim deneyim geçmişte pekmez gibi yavaş olmuştu olmasıdır. Daha iyi bir yaklaşım mı?

Edit 2: Adding some inline responses to the question

Dil 5.1 php durumunda bir darboğaz oldu - Ben aslında (komut 5.3 ince çalıştı ama) ben yanlış dil seçim yapılmış söylendi. Ben bu görev için kontrol ediyorum ki, python söz. Açık olmak gerekirse, ne yapıyorum ben bir masaüstü ürünün kullanım istatistikleri için bir yönetim aracı (günlükleri aslında mysql tabloları için bir EJB sunucusu tarafından yazılır) sağlanmasıdır. Ben apache günlük dosyası analizi, yanı sıra web tarafında daha fazla özel web raporlama yapmak, ama bu proje ayrı. Şimdiye kadar geçtiniz yaklaşım agrega masaları. Ben bu mesaj kuyruğu ürünler benim için yapabileceği ne emin değilim, ben bir göz atacağız.

Biraz daha ileri gitmek için - veri yönetimi ürünün nasıl kullanıldığını anlamak için izin vermek, hizmet ve müşteri düzeyinde zamanla aktivitesini grafik için kullanılıyor. Bir süre (1 Nisan-10 Nisan) seçin ve seçilen süre bağlı olarak farklı granularities (saat, gün, ay, vb) belli bir özelliğinin kullanımının toplam dakikalık grafiğini almak olabilir. Kullanım Onun aslında bir sonra-aslında analizi. Gerek gerçek zamanlı yönelmekte gibi görünüyor, ancak (kullanım son saatte bakmak)

3 Cevap

Orada bu soruna farklı yaklaşımlar çok hangi bazıları burada belirtilen vardır, ama ne veri sonrası toplaması ile yapıyoruz belli değil ...?

Eğer digg gibi 'X Diggs' sitenizde düğmelerini veya özet grafikler ya da sürekli olarak bir tür üzerinde kullanılabilir olması için ihtiyacı olan böyle bir şey sağlamak için bu verileri kullanmak istiyorsanız, aslında bunun için memcache kullanmak, ve olabilir kodunuzu uygun zamanlarda bunu arttırarak bugüne kadar belirli bir istatistik yukarı için önbellek anahtarı tutun.

Ayrıca, daha karmaşık raporlama için iyi çalışabilir, hangi veritabanında toplama tabloları tutmak olabilir. Bu durumda, ne ihtiyacı vardır size ne kadar veri ve bağlı olarak, bir saatlik tablo sahip kurtulmak mümkün olacak, ve sonra birkaç gün, hafta vb göstermek için bu temel tablo bağlı görünümler oluşturmak olabilir

Eğer ton ve veri ton var ve toplam tabloları gerekiyorsa, RabbitMQ veya ActiveMQ gibi bir kuyruğa istatistik koleksiyonu (ve belki veritabanı kendilerini sorgular) boşaltma içine bakmak gerekir. Sıranın diğer tarafta sadece oturur ve gerektiği gibi (belki de önbelleği ve) veritabanında şeyleri güncellemek, her zaman çalışan bir tüketici cini koydu.

Ayrıca düşünebilirsiniz tek şey, web sunucusunun günlükleri. Ben config günlük biçimi kurallara sadece küçük tweaks sonra web sunucusu günlükleri kendilerini gerekli istatistiklerin biraz büyük bir kısmını almak mümkün oldu örneklerini gördüm. Sen günlükleri her rulo, ve sonra bir raporlama veritabanı sonuçları kayıt, bunları çevrimdışı olarak işleme başlayabilirsiniz.

Ben dili Burada sınırlayıcı bir faktör ya da tıkanıklık olduğunu sanmıyorum ama, (Ben özellikle, loghetti Apache birleşik biçimi günlükleri ile ilgili yayımlanan) Python ile tüm bu şeyler yaptık. Ruby, Perl, Java, Scala, ya da (bazı durumlarda) bile awk çalışacak.

Ben geçmişte benzer bir şey yapmak için bir proje üzerinde çalışmış, bu yüzden performansı ile gerçek deneyime sahip. Sen zor. Bakın (değil "INSERT ... VALUES (SELECT ...)" "SELECT ... INSERT" performansını yenmek için basılı olacaktır http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

Avantaj olduğunu size MySQL işlemlerinde roll-up kod tutarsanız, özellikle, siz dışarıdan gereken tüm sağ sağ roll-up performans içine DB karıştırmak için sadece bir cron işi olduğunu, bunu ise kez - bir kabuk-senaryo gibi basit 'mysql <correct DB arguments etc.> "CALL RollupProcedure"'

Bu şekilde, (... makine sınırı boyunca hiçbir veri hareketli) kendinize sıfır bellek ayırma hataları yanı sıra, MySQL DB ayrı bir makinede olduğu zaman iyi bir performansa sahip garanti edilir

EDIT: Saatlik çözünürlük gayet iyi - sadece bir saatlik cron işi çalıştırmak ...

Eğer çoğunlukla SQL komutlarını çalıştırıyorsanız, neden sadece komut satırından MySQL vs kullanmak değil? Sen toplu veriler daha sonra mysql -u[user] -p[pass] < commands.sql bir dosyadan SQL geçmek gibi bir komutu çalıştırmak listeleyen basit bir tablo oluşturabilir.

Ya da, daha küçük parçalar halinde çalışmalarını bölünmüş ve (bu kolay eğer PHP dosyaları gibi) sırayla onları çalıştırmak.

Eğer gerçekten bir sürekli uzun süren bir süreç olması gerekir eğer bir döngü oluşturmak ve süresiz çalışmasını tutabilir beri sonra python veya java gibi bir programlama dili, daha iyi olurdu. PHP bu tür bir şey için uygun değildir. Java için herhangi bir PHP sınıfları dönüştürmek oldukça kolay olurdu.