Biz bir perakende ağının teknoloji geliştirme departmanıyız. Bir gün yönetim, Apache Ignite'ı MSSQL ile birlikte kullanarak büyük ölçekli hesaplamaları hızlandırma görevini üstlendi ve güzel çizimler ve Java kodu örnekleri içeren bir web sitesi gösterdi. Siteyi hemen beğendim
1. Sorunun açıklaması
Sorunun özü aşağıdaki gibidir. Satış Noktası satış noktaları rehberi ve Sku (Stok Saklama Birimi) ürün rehberi bulunmaktadır. Satış noktasının “küçük” ve “büyük” değerlerine sahip “Mağaza tipi” özelliği bulunmaktadır. Her satış noktasına (DBMS'den yüklenen) bir ürün çeşidi (satış noktasının ürünlerinin listesi) bağlanır ve belirtilen tarihten itibaren belirtilen ürünün
ürün yelpazesinden çıkarıldı veya ürün yelpazesine eklendi.
Satış noktalarının bölümlenmiş bir önbelleğinin düzenlenmesi ve bağlı ürünlerle ilgili bilgilerin bir ay önceden saklanması gerekir. Savaş sistemiyle uyumluluk, Ignite istemci düğümünün verileri yüklemesini, formun bir toplamını hesaplamasını (Mağaza türü, Ürün kodu, gün, satış_noktası sayısı) ve bunu DBMS'ye geri yüklemesini gerektirir.
2. Edebiyat çalışması
Henüz bir tecrübem olmadığı için ocaktan dans etmeye başlıyorum. Yani, yayınların incelenmesinden.
2016 yazı
iyimser bir şekilde "Bir anda ayağa kalkacaksınız!" sözünü veriyor. İki Apache Ignite Essentials videosu izleyerek ortam değişkeni ayarlarını bulmaya çalışıyorum, ancak bunlar benim özel görevim için pek kullanışlı olmadı. Ignite'ı komut satırından "example-ignite.xml" standart dosyasıyla başarıyla başlatıyorum ve ilk uygulamayı oluşturuyorum
Daha fazlasını okudum ve orada örnek hemen affinityKey'i (daha önce bir SQL sorgusu aracılığıyla oluşturulmuş) kullanıyor ve hatta gizemli BinaryObject'i kullanıyor:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
saygın
Durumuma uyacak şekilde Hesaplama Uygulamasını yeniden yapıyorum. MSSQL'deki satış noktaları dizininin birincil anahtarı [id] [int] NOT NULL olarak tanımlanır, benzetme yoluyla bir önbellek oluştururum
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
Xml yapılandırmasında önbelleğin bölümlendiğini belirtiyorum
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
Satış noktasına göre bölümleme, orada bulunan salesPointCache kayıtları için her küme düğümünde gerekli toplamın oluşturulacağını ve ardından istemci düğümünün nihai toplamayı gerçekleştireceğini varsayar.
Dersi okuyorum
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
Toplama ve yükleme mantığını ekliyorum ve bunu bir test veri kümesinde çalıştırıyorum. Her şey geliştirme sunucusunda yerel olarak çalışır.
İki CentO test sunucusunu başlatıyorum, IP adreslerini default-config.xml dosyasında belirtiyorum, her birinde çalıştırıyorum
./bin/ignite.sh config/default-config.xml
Her iki Ignite düğümü de çalışıyor ve birbirini görebiliyor. İstemci uygulamasının xml yapılandırmasında gerekli adresleri belirtiyorum, başlıyor, topolojiye üçüncü bir düğüm ekliyor ve hemen tekrar iki düğüm oluyor. Günlük, satırda "ClassNotFoundException: model.SalesPoint" ifadesini gösterir
SalesPoint sp=salesPointCache.get(spId);
StackOverflow, hatanın nedeninin CentOs sunucularında özel bir SalesPoint sınıfının bulunmaması olduğunu söylüyor. Biz geldik. "Java kodunuzu her düğüme manuel olarak dağıtmanıza gerek yok" vb.'ye ne dersiniz? Yoksa “Java kodunuz” SalesPoint ile ilgili değil mi?
Muhtemelen bir şeyi kaçırdım - tekrar aramaya, okumaya ve tekrar aramaya başlıyorum. Bir süre sonra konuyla ilgili her şeyi okuduğum hissine kapılıyorum, artık yeni bir şey yok. Araştırırken ilginç yorumlarla karşılaştım.
Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.
Başka bir yetkili görüş:
Habre ile ilgili makale
That's it. Start (..) node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.
Gerçekten de bu kadar. İşte bu gizemli ikili formatın nedeni ortaya çıkıyor!
3.Tek Kavanoz
Denis benim kişisel derecelendirmemde birinci sırada yer aldı; IMHO mevcut tüm eğitimler arasında en yararlı olanıydı. onun içinde
Bunu aynı şekilde yapıyorum ve komut satırı argümanına bağlı olarak "veri düğümü" veya "istemci düğümü" başlatan tek bir jar dosyası alıyorum. Montaj başlar ve çalışır. Sıfır Dağıtım yenildi.
Megabaytlarca test verisinden onlarca gigabaytlık savaş verilerine geçiş, ikili formatın bir nedenden dolayı var olduğunu gösterdi. Düğümlerdeki bellek tüketimini optimize etmek gerekiyordu ve BinaryObject'in çok kullanışlı olduğu yer burasıydı.
4. bulgular
Apache Ignite proje belgelerinin belirsizliği konusunda karşılaşılan ilk suçlamanın adil olduğu ortaya çıktı; 2016'dan bu yana çok az şey değişti. Yeni başlayan birinin bir web sitesi ve/veya veri deposunu temel alarak işleyen bir prototip oluşturması kolay değildir.
Yapılan çalışmanın sonuçlarına dayanarak, Sıfır Dağıtımın yalnızca sistem düzeyinde çalıştığı izlenimi oluştu. Bunun gibi bir şey: BinaryObject, uzak küme düğümlerine özel sınıflarla çalışmayı öğretmek için kullanılır; Sıfır Dağıtım - dahili mekanizma
Apache Ignite kendisini ve sistem nesnelerini küme boyunca dağıtır.
Deneyimlerimin yeni Apache Ignite kullanıcılarına faydalı olacağını umuyorum.
Kaynak: habr.com