Esiste un'architettura per il geoprocessing distribuito?


24

Supponiamo di avere 50 computer sulla mia LAN. Ogni computer ha un geodatabase per tutti i poligoni dei pacchi in uno stato particolare negli Stati Uniti.

Vorrei scrivere un'attività di geoprocessing che trova tutti i pacchi valutati su x $ / acro che sono entro y piedi da un altro pacco che è valutato a meno di z $ / acre.

Vorrei formulare ed eseguire questa query senza sapere o preoccuparsi che i dati siano distribuiti su 50 computer. Tieni a mente le condizioni al contorno: voglio anche che la query restituisca casi in cui pacchi costosi in uno stato sono pacchi quasi economici in un altro.

Esiste un'architettura che supporta questo tipo di geoprocessing distribuito?

L'architettura può essere descritta in modo astratto o come un'implementazione specifica per Azure o Amazon Web Services. O, preferibilmente, come un tipico ufficio in cui i computer restano inattivi durante la notte con abbondanti licenze desktop ArcGIS.


1
Bella domanda In questo esempio particolare è necessario un modo per parallelizzare automaticamente la costruzione e l'uso di una struttura di dati spaziali come un quadrifoglio. Se non lo fai e invece distribuisci una ricerca di forza bruta su 50 computer, potresti effettivamente rallentare la query piuttosto che accelerarla. Sono abbastanza sicuro che non esista ancora un'architettura generale come questa, quindi potresti avere più fortuna considerando innanzitutto quali tipi di query potrebbero trarre vantaggio dall'elaborazione distribuita e quindi esaminando le architetture di cui hanno bisogno. Forse pubblicare questa domanda sul sito TCS?
whuber

@whuber Grazie, qual è il sito TCS?
Kirk Kuykendall,

@Kirk scusa per essere criptico - ero pigro. cstheory.stackexchange.com
whuber

1
la teoria CS di base probabilmente non aiuterà poiché i ragazzi CS raramente diventano spaziali :-)
Ian Turton

1
@iant Non ci sono troppe persone GIS là fuori che sapranno molto sugli aspetti pratici del calcolo distribuito (non lancio alcuna aspersione sui membri di questo sito che ovviamente sono eccezionali). Credo che le persone del TCS avranno le conoscenze per rispondere alla domanda originale sull'esistenza di un'architettura. La mia unica preoccupazione è se troverebbero la domanda interessante! Penso che se è messo nel modo giusto che potrebbero. (Ad esempio, si potrebbe riformularlo in termini di strutture di dati.)
whuber

Risposte:


13
  1. conservare tutti i pacchi in un database centrale
  2. formula una griglia sopra gli Stati Uniti fatta di quadrati N piedi su un lato, dove N è tale che il numero di pacchi che si adattano all'interno di N non farà esplodere la memoria su uno dei tuoi nodi
  3. creare una tabella nel database con una riga per quadrato della griglia, una colonna id una colonna geometrica e una colonna di stato
  4. ogni nodo esegue un piccolo programma che
    1. trova il prossimo quadrato non elaborato
    2. lo contrassegna come in-process
    3. tira tutti i pacchi ST_DWithin (quadrato, pacco, maxfeet)
    4. esegue la query effettiva
    5. riscrive la risposta alla query in una tabella della soluzione nel database centrale
    6. segna il quadrato come completo
    7. ritorna a 1

L'ovvio caso di fallimento è dato dal fatto che il raggio di interesse per la query sui pacchi diventa abbastanza grande da consentire che grandi parti del set di dati siano potenziali candidati per abbinare ciascun pacco.


Grazie Paul, avrei bisogno di un nodo che funga da coordinatore per gli altri nodi?
Kirk Kuykendall,

Il database funge da "coordinatore" implicito in quanto contiene lo stato della coda, ma i nodi non devono essere coordinati oltre a essere avviati e puntati sul database. Non sono sicuro se questa è una risposta o meno.
Paul Ramsey,

7

A settembre a Barcellona a Barcellona è stato presentato uno slot interessante su FOSS4G: http://2010.foss4g.org/presentations_show.php?id=3584

È diventato più una discussione di gruppo che una presentazione.

Nel mezzo di questo post sul blog, Paul Ramsey fornisce una sorta di riassunto di ciò.


Sembra promettente, hanno pubblicato la presentazione ovunque?
Kirk Kuykendall,

Bene, da quando Schuyler Erle è diventato un moderatore per la discussione del panel invece di accodare alla presentazione pianificata, non credo che ci saranno molte più informazioni al riguardo. Ma dal momento che Erle aveva pianificato quella presentazione, probabilmente ha alcune informazioni al riguardo. È ovunque se fai una ricerca su Google. Potrebbe essere un'idea chiederglielo direttamente. Non lo so. La maggior parte delle discussioni è stata al di sopra della mia comprensione, quindi non posso dare un curriculum migliore di Paul nel suo blog.
Nicklas Avén,

4

Forse dai un'occhiata al white paper "ArcGIS Server in Practice Series: Large Batch Geocoding " ai white paper di esri .

Si tratta di geocodifica ma il processo generale di utilizzo di un servizio di geoprocessing asincrono potrebbe essere applicabile al tuo caso.


Sembra buono, mi chiedo se questo potrebbe essere generalizzato ad altre forme di geoprocessing. Sembra però che dovrei sovrapporre i miei set di dati.
Kirk Kuykendall,

3

La prima cosa di cui preoccuparsi per questo problema è quali dati sono necessari dove e quando. Per fare ciò, di solito inizio con la stupida versione seriale del problema.

Trova tutti i pacchi del valore di x $ / acro che si trovano entro i piedi di y di un altro pacco che è valutato a meno di z $ / acro.

foreach p in parcels {
  if value(p) > x {
    foreach q in parcels {
      if (dist(p,q) <= y) and (value(q) < z) {
        emit(p)
      }
    }
  }
}

Sebbene questo algoritmo non sia ottimizzato, risolverà il problema.

Ho risolto un problema simile per la tesi del mio Master che trovava il pacco più vicino per ogni punto in un set di dati. Ho implementato la soluzione in PostGIS , Hadoop e MPI . La versione completa della mia tesi è qui , ma riassumerò i punti importanti in quanto si applica a questo problema.

MapReduce non è una buona piattaforma su cui risolvere questo problema perché richiede l'accesso all'intero set di dati (o un sottoinsieme accuratamente selezionato) per elaborare un singolo pacchetto. MapReduce non gestisce bene i set di dati secondari.

MPI, tuttavia, può risolverlo abbastanza facilmente. La parte più difficile è determinare come dividere i dati. Questa suddivisione si basa sulla quantità di dati disponibili, sul numero di utenti che devono essere eseguiti e sulla quantità di memoria disponibile per processore. Per il miglior ridimensionamento (e quindi le prestazioni) è necessario disporre di più copie del set di dati dei pacchi in memoria (su tutti i computer) contemporaneamente.

Per spiegare come funziona, suppongo che ognuno dei tuoi 50 computer abbia 8 processori. Assegnerò quindi a ciascun computer la responsabilità di controllare 1/50 dei pacchi. Questo controllo verrà eseguito da 8 processi sul computer, ognuno dei quali ha una copia della stessa parte 1/50 dei pacchi e 1/8 del set di dati del pacco. Si noti che i gruppi non sono limitati a una singola macchina, ma possono oltrepassare i limiti della macchina.

Il processo eseguirà l'algoritmo, ottenendo i pacchi per p dal set 1/50 di pacchi e i pacchi per q dal set 1/8. Dopo il ciclo interno, tutti i processi sullo stesso computer parleranno insieme per determinare se il pacco debba essere emesso.

Ho implementato un algoritmo simile a questo per il mio problema. Puoi trovare la fonte qui .

Anche con questo tipo di algoritmo non ottimizzato sono stato in grado di ottenere risultati impressionanti che erano altamente ottimizzati per il tempo del programmatore (il che significa che avrei potuto scrivere uno stupido algoritmo semplice e il calcolo sarebbe ancora abbastanza veloce). Il prossimo punto da ottimizzare (se proprio ne hai bisogno), è impostare un indice quadtree del secondo set di dati (da cui ottieni q) per ogni processo.


Per rispondere alla domanda originale. C'è un'architettura: MPI + GEOS. Aggiungete un piccolo aiuto dalla mia implementazione ClusterGIS e si può fare molto. Tutto questo software può essere trovato come open source, quindi senza costi di licenza. Non sono sicuro di quanto sia portatile su Windows (forse con Cygwin) mentre ci lavoravo su Linux. Questa soluzione può essere implementata su EC2, Rackspace o qualunque cloud sia disponibile. Quando l'ho sviluppato utilizzavo un cluster di calcolo dedicato presso un'università.


2

La metodologia di programmazione parallela della vecchia scuola è di memorizzare solo uno stato + i pacchi che lo toccano su ciascun processore, quindi è imbarazzantemente facile parallelizzare. Ma data la variazione delle dimensioni degli stati degli Stati Uniti, otterresti prestazioni migliori dividendo il paese in celle della griglia (di nuovo con il tocco toccante dei pacchi) e inviando ciascuna cella della griglia ai processori utilizzando una configurazione master slave.


Invece di pacchi che si toccano, avrei bisogno di pacchi dagli stati adiacenti a una distanza di y.
Kirk Kuykendall,

Suppongo che Y sia abbastanza piccolo da non essere significativamente più grande di un piccolo numero di pacchi. Se si tratta di una grande frazione di uno stato, probabilmente saresti meglio usare semplicemente una griglia arbitraria per fare i calcoli.
Ian Turton

2

Potresti dare un'occhiata a Appistry . Si prefigge di consentire la migrazione delle applicazioni esistenti verso le infrastrutture del cloud privato. Potrebbero esserci altri progetti con un obiettivo simile: piuttosto che capire ancora e ancora per ogni applicazione il dado molto complesso di scomporre e distribuire compiti all'elaborazione parallela, creare una libreria o piattaforma che lo fa automaticamente.


Grazie Matt, sembra promettente. Googling Ho trovato questa presentazione da FedUC 2008 procedure.esri.com/library/userconf/feduc08/papers/… . Sarei curioso di vedere un aggiornamento su ciò che hanno fatto da allora.
Kirk Kuykendall,

2

Per questo tipo di problema, userei una mappa / riduci il framework. Il framework "grezzo" di Appistry è ottimo per problemi "imbarazzanti parallelamente", a cui questo è vicino. Le condizioni del bordo non lo consentono. Map / Reduce (l'approccio di Google al calcolo distribuito) è ottimo per questo tipo di problema.

Il più grande progresso di Appistry dall'articolo 08 è il rilascio del prodotto CloudIQ Storage. Ciò consente la funzione di archiviazione "s3" utilizzando i dischi sui server locali. Quindi, il prodotto CloudIQ Engine può abilitare servizi ad alto volume o applicazioni di tipo scatter / gather di qualsiasi tipo (abbiamo dimostrato la scalabilità utilizzando il runtime ESRI e altre librerie open source). Se stai operando su dati basati su file, li distribuisci utilizzando CloudIQ Storage e instrada i processi di elaborazione alle repliche di file locali in modo che non debbano essere spostati sulla rete. (quindi ogni nodo non ha bisogno di tutti i dati)

Per Map / Reduce, puoi sovrapporre qualcosa come Hadoop (framework M / R open source) su CloudIQ Storage. Vorrei esaminare Hadoop per il problema come descritto, ma è davvero necessario immergersi, non è facile iniziare e M / R è un rompicapo. Esiste anche una distribuzione supportata commercialmente offerta da Cloudera. C'è un altro prodotto Appistry, CloudIQ Manger che è un bel complemento di Hadoop (Cloudera o altro) per la distribuzione e la gestione.

Vorrei iniziare con Hadoop (file system M / R e HDFS) e, se hai bisogno di una soluzione scalabile più commercialmente supportata, dai un'occhiata a Appistry CloudIQ Manager e Storage, insieme alla distro Cloudera Hadoop.

Se vuoi un'architettura più semplice per attività "imbarazzanti parallele", guarda anche CloudIQ Engine. (gli approcci delineati nel documento a cui fa riferimento Kirk sono ancora validi)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.