Bok tamo! Kao dobavljač Combiner-a, u zadnje vrijeme dobivam puno pitanja o tome što je potrebno da Combiner bude niti siguran u MapReduce poslu. Pa sam mislio da ću vam to raščlaniti u ovom postu na blogu.
Za početak, kratko ponovimo što je Combiner u kontekstu MapReduce posla. Combiner je izborna funkcija koja se može koristiti za izvođenje lokalne agregacije na izlazu mapera prije nego što se pošalje reduktorima. To može značajno smanjiti količinu podataka koji se prenose preko mreže, što zauzvrat ubrzava cjelokupno izvršenje posla.
Sada, veliko pitanje je, koji su zahtjevi za Combiner da bude siguran za niti?
Nepromjenjivost ulaza i izlaza
Jedan od temeljnih zahtjeva za Combiner siguran za niti je nepromjenjivost njegovog ulaza i izlaza. Kada više niti istovremeno pristupa Combiner-u, ne želimo da bilo koja od njih mijenja podatke na način koji bi mogao utjecati na druge niti.
Na primjer, ako su ulazni podaci u Combiner promjenjivi, jedna nit može promijeniti vrijednosti dok ih druga pokušava pročitati ili obraditi. To može dovesti do nedosljednih rezultata. Slično tome, izlaz Combiner-a također bi trebao biti nepromjenjiv. Ako drugi dijelovi okvira MapReduce počnu modificirati izlaz Combiner-a dok ga još koriste druge niti, to može uzrokovati razne probleme.
Recimo da radimo na riječi - count MapReduce posao. Maper ispisuje parove ključ - vrijednost gdje je ključ riječ, a vrijednost broj. Combiner zbraja te brojeve za svaku riječ. Ako su parovi ključ-vrijednost promjenjivi, nit može promijeniti vrijednost broja dok druga nit pokušava izračunati ukupni broj za tu riječ. To bi rezultiralo netočnim konačnim zbrojem.
Atomske operacije
Atomske operacije su još jedan ključni aspekt niti - sigurnih kombinatora. Atomska operacija je operacija koja se ostatku sustava čini kao da se izvodi trenutno. U kontekstu Combiner-a, atomske operacije osiguravaju da više niti mogu izvoditi operacije na zajedničkim podacima bez međusobnog ometanja.
Na primjer, kada zbrajamo vrijednosti u Combiner-u, trebamo koristiti operacije atomskog povećanja ili zbrajanja. U Javi,AtomskiIntegerklasa pruža atomske operacije za cijele brojeve. Umjesto korištenja regularne varijable cijelog broja za praćenje brojanja, možemo koristitiAtomskiInteger. Na ovaj način, kada više niti pokuša povećati broj istovremeno, operacija je zajamčena kao atomska i nećemo imati nedosljedne rezultate.
Uzmimo ponovno primjer brojanja za riječ. Umjesto korištenja običnog cijelog broja za praćenje broja za svaku riječ, možemo koristiti anAtomskiInteger. Kada nit želi povećati broj za određenu riječ, može pozvatiincrementAndGet()metodaAtomskiInteger. Ova je metoda atomska, pa čak i ako više niti pokuša povećati broj u isto vrijeme, operacija će biti izvedena ispravno.
Mehanizmi sinkronizacije
Ponekad atomske operacije možda neće biti dovoljne i moramo koristiti mehanizme sinkronizacije kako bismo osigurali sigurnost niti. Sinkronizacija nam omogućuje kontrolu pristupa zajedničkim resursima tako da im samo jedna nit može pristupiti u isto vrijeme.
U Javi možemo koristitisinkroniziranoključna riječ za stvaranje sinkroniziranih metoda ili blokova. Na primjer, ako naš Combiner ima zajedničku strukturu podataka poput aHashMapza pohranjivanje agregiranih vrijednosti, možemo koristiti sinkronizirani blok kako bismo osigurali da samo jedna nit može pristupitiHashMapu isto vrijeme.

import java.util.HashMap; public class MyCombiner { private HashMap<String, Integer> countMap = new HashMap<>(); public void combine(String key, int value) { synchronized (this) { if (countMap.containsKey(key)) { countMap.put(key, countMap.get(key) + value); } else { countMap.put(ključ, vrijednost); } } } }
U ovom primjeru,kombiniratimetoda je sinkronizirana, što znači da samo jedna nit može izvršiti ovu metodu u isto vrijeme. Ovo osigurava daHashMapse pristupa i mijenja na nit - siguran način.
Izbjegavanje globalne države
Globalna država može biti noćna mora kada se radi o programiranju sigurnom niti. Ako se Combiner oslanja na globalne varijable ili zajedničke resurse koje može modificirati više niti, vrlo je vjerojatno da će naići na uvjete utrke i druge sigurnosne probleme niti.
Umjesto toga, trebali bismo pokušati održati stanje Combinera što je moguće lokalnim. Svaka nit treba imati vlastitu kopiju podataka s kojima treba raditi, a rezultate treba kombinirati u nit - siguran način na kraju.
Na primjer, umjesto korištenja globalneHashMapza pohranjivanje agregiranih vrijednosti, možemo koristiti lokalnuHashMapza svaku nit. Nakon što su sva lokalna združivanja gotova, možemo spojiti ove lokalneHashMapsu niti - siguran način.
Testiranje sigurnosti niti
Testiranje je bitan dio osiguravanja da je Combiner siguran za niti. Moramo testirati Combiner u različitim scenarijima s više niti kako bismo bili sigurni da daje dosljedne rezultate.
Jedan od načina testiranja sigurnosti niti je korištenje okvira za testiranje s više niti. Na primjer, JUnit se može koristiti za pisanje testnih slučajeva s više niti. Možemo stvoriti više niti koje istovremeno pozivaju Combiner i zatim provjeriti je li izlaz točan.
Također možemo koristiti alate kao što su FindBugs ili IntelliJ IDEA ugrađeni alati za statičku analizu za otkrivanje potencijalnih sigurnosnih problema niti u kodu. Ovi alati mogu identificirati uobičajene pogreške kao što je korištenje neatomarnih operacija na dijeljenim varijablama ili neispravna sinkronizacija pristupa zajedničkim resursima.
Naši proizvodi za kombiniranje
Kao dobavljač kombinira, nudimo niz visokokvalitetnih kombinira koji su dizajnirani imajući na umu sigurnost niti. Naše12-kanalni pasivni glavni kombinirači24-kanalni pasivni glavni kombiniračsavršeni su za MapReduce poslove gdje je sigurnost niti važna. Ovi kombajni izrađeni su pomoću najnovije tehnologije i rigorozno su testirani kako bi se osiguralo da zadovoljavaju najviše standarde performansi i pouzdanosti.
Ako ste na tržištu za nit - siguran Combiner za svoj MapReduce posao, voljeli bismo čuti vaše mišljenje. Bilo da ste mali programer ili velika tvrtka, imamo pravo rješenje za vas. Ne ustručavajte se kontaktirati i započeti razgovor o vašim specifičnim zahtjevima. Ovdje smo da vam pomognemo pronaći najbolji Combiner za vaše potrebe i osiguramo da vaši MapReduce poslovi teku glatko i učinkovito.
Reference
- Tom White. "Hadoop: Konačni vodič." O'Reilly Media, 2015.
- Brian Goetz i sur. "Java konkurentnost u praksi." Addison - Wesley Professional, 2006.
