Jak podzielić pracę na sieć komputerów?

11

Wyobraź sobie następujący scenariusz: Załóżmy, że masz centralny komputer, który generuje dużo danych. Dane te muszą zostać przetworzone, co niestety trwa dłużej niż ich wygenerowanie. Aby przetwarzanie mogło nadążać za czasem, podłączamy więcej komputerów podrzędnych.

Ponadto musimy wziąć pod uwagę możliwość wypadnięcia urządzeń podrzędnych z sieci w trakcie pracy, a także dodania dodatkowych urządzeń podrzędnych. Komputer centralny powinien upewnić się, że wszystkie zadania zostały zakończone w sposób satysfakcjonujący, a zadania odrzucone przez urządzenie podrzędne są przekierowywane do innego.

Główne pytanie brzmi: jakie podejście powinienem zastosować, aby to osiągnąć?

Ale być może poniższe informacje pomogłyby mi znaleźć odpowiedź: czy istnieje nazwa lub wzorzec projektowy tego, co próbuję zrobić?

Jakiej dziedziny wiedzy potrzebuję, aby osiągnąć cel polegający na tym, aby komputery te mogły ze sobą rozmawiać? (np. czy baza danych, o której mam trochę wiedzy, będzie wystarczająca, czy będzie to obejmowało gniazda, o których jeszcze nie mam wiedzy?)

Czy są jakieś przykłady takiego systemu? Główne pytanie jest nieco ogólne, więc dobrze byłoby mieć punkt początkowy / punkt odniesienia.

Uwaga: Zakładam ograniczenia c ++ i okien, więc rozwiązania wskazujące w tym kierunku będą mile widziane.

Morpork
źródło
1
Poszukaj systemów kolejki lub przepływu pracy, przykłady: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue itp. System kolejek może zająć się dystrybucją, sprawdzaniem i ponownym przypisywaniem.
Luc Franken,
2
Termin, którego szukasz, to równoległość . Zanim pójdziesz tą drogą, upewnij się, że problem można rozwiązać równolegle (np. Wynik dla pozycji n nie zależy od wyniku dla pozycji n-1 ).
Blrfl
Spójrz na boinc
@Blrfl Myślę, że równoległość zwykle nie jest z tym związana, równoległość jest zwykle związana z wykonywaniem wielowątkowym lub wieloprocesowym na jednym komputerze z wykorzystaniem wielu rdzeni / procesorów lub współbieżnym wykonywaniem na tym samym komputerze. Odnosi się do przetwarzania rozproszonego, aw jego opisie nie ma gwarancji współbieżności, tylko gwarancje asynchronii (czyli niedeterministycznego wykonania, które może być współbieżne, synchroniczne lub opóźnione w kolejce)
Jimmy Hoffa
3
Dziwię się, że nikt nie wspomniał o hadoopie.
Kevin

Odpowiedzi:

12

Czy są jakieś przykłady takiego systemu?

Tak. Ten wzorzec jest znany jako przetwarzanie rozproszone (lub rozproszone programowanie lub dowolne fajne słowo, które chcesz umieścić po rozproszeniu). Moją sugestią będzie, aby nie budować tego we własnym zakresie przed przyjrzeniem się innym rozwiązaniom. Możesz spojrzeć na pytanie o przepełnienie stosu dla różnych opcji. A następnie podejmij obliczoną decyzję.

Manoj R.
źródło
3
Nie zapomnij o nowym ulubionym słowie: chmura ! lub przetwarzanie w chmurze . Jeśli robisz to na własnych komputerach, ludzie nazywają je chmurą osobistą lub mini chmurą . Bzdury marketingowe, jest to znane, jak powiedziałeś, jako przetwarzanie rozproszone od lat, po prostu rzucając się tam, by OP dowiedział się, gdzie czyta o chmurze, o czym dokładnie mówi.
Jimmy Hoffa
3
@ JimmyHoffa: słowo „chmura” jest równie często używane, aby wskazać, że twoje dane, a także oprogramowanie, którego używasz do pracy z nim, znajduje się gdzieś w Internecie zamiast na lokalnej maszynie. A jeszcze innym razem oznacza to, że używasz maszyny wirtualnej działającej na klastrze, a nie na pojedynczym monolitycznym hoście VM; oczywistą zaletą jest przezroczysta praca w trybie failover bez przestojów.
tdammers
2
@tdammers to prawda, ale typ systemu opisany przez PO jest jednym z wielu wykorzystujących marketingowy przydomek Chmury, a także, jak zauważyłeś, praktycznie wszystko inne. To właśnie sprawia, że ​​jest to modne hasło, zostało wymyślone bez definicji, więc ludzie zastosowali go do mnóstwa różnych rzeczy, więc skutecznie oznacza wszystko i nic. Brawo dla modnych słów.
Jimmy Hoffa
1
@JimmyHoffa: To także sprawia, że ​​wzmianka o słowie „chmura” jest tutaj całkowicie niekonstruktywna.
tdammers
3
Może to stanowić dobre słowo przeciwko kierownictwu. „Jakie jest Twoje rozwiązanie tego problemu przetwarzania danych?” „Cóż, moglibyśmy dystrybuować go do sieci komputerów i obliczać je równolegle”. PUSTE SPOJRZENIE. „Możemy zbudować mini Cloud”. „OKAY CARRY ON”
Morpork,
4

Jak zauważył innych odpowiedzi, w tym polu została znany jako rozproszone , siatki obliczeniowej , Cluster Computing i wysokiej wydajności obliczeniowej .

Dodaję rozróżnienie, że gdy można zmienić rozmiar systemu po rozpoczęciu dopasowywania obciążenia, mówi się, że jest „ elastyczny ”, a to różni się od tradycyjnego przetwarzania gridowego. Jest to jeden z (nie marketingowych) powodów terminu „ przetwarzanie w chmurze ”: użytkownik nie musi planować pojemności, a liczba i lokalizacja komputerów przeprowadzających obliczenia pozostają dla niego bezwartościowe jako chmura.

Ponadto wymaganie, aby master ponownie planował nieudane zadania, nazywa się właściwością „ odporności na awarie ” tego systemu. (Obowiązkowy link do tej kreskówki )

Jakie podejście należy zastosować, aby zbudować własną, prywatną chmurę? W moim zamówieniu lub preferencjach:

  1. Nie buduj własnej chmury , korzystaj z infrastruktury zapewnianej przez innych. Amazon nazywa to Virtual Private Cloud , Rackspace po prostu Private Cloud ; Jestem pewien, że możesz znaleźć inne oferty i porównać.

  2. Nie buduj własnego silnika przetwarzania rozproszonego , użyj silnika dostarczonego przez innych. Jeśli nalegasz na używanie swoich maszyn, używaj co najmniej tyle oprogramowania, ile to możliwe, które jest dostarczane i testowane przez innych. Możesz używać Hadoop z C ++ poprzez interfejs Pipes lub z dowolnego pliku wykonywalnego za pośrednictwem Streaming API . Istnieje podobny interfejs Streaming w Spark .

  3. Nie koduj wszystkich komponentów od zera , używaj komponentów ze społeczności. Jeśli z jakiegoś powodu czytałeś do tej pory i chcesz wdrożyć własne komponenty chmurowe, nie zaczynaj od standardowej biblioteki C ++. Główne potrzebne elementy to:

    • system kolejkowania, jak zauważono w komentarzu , do wysyłania zadań z urządzenia nadrzędnego do węzłów przetwarzających i wysyłania potwierdzeń wyników z węzłów przetwarzania do urządzenia nadrzędnego
    • rozproszony system plików, dzięki czemu węzły przetwarzające mogą uzyskać dostęp do danych, na których będą działać.

    Istnieje wiele alternatyw dla obu. Do kolejkowania RabbitMQ ma instalator Windows, podobnie jak ZeroMQ . W przypadku rozproszonych systemów plików naprawdę nie mam wystarczającego doświadczenia w systemie Windows: wygląda na to, że możesz zorganizować udziały SMB w systemie plików DFS , ale nie mogę dać ci żadnej wskazówki. Jak można zauważyć w innej odpowiedzi, można pomyśleć o wykorzystaniu rozproszonej bazy danych, takiej jak MongoDB, do danych; działa w systemie Windows .

Możesz także pomyśleć o użyciu MPI (zwykle implementacji OpenMPI , zwykle poprzez opakowanie Boost ), ale zauważ, że programy MPI same w sobie nie są elastyczne ani odporne na uszkodzenia; musisz się tym zająć (przynajmniej zapewniają pewne mechanizmy, aby to osiągnąć ). Dlatego poleciłbym najpierw ocenić ramy dystrybucji, które mają takie właściwości.

logc
źródło