Angenommen, ich habe 50 Computer in meinem LAN. Jeder Computer verfügt über eine Geodatabase für alle Paketpolygone in einem bestimmten Bundesstaat in den USA.
Ich möchte eine Geoverarbeitungsaufgabe schreiben, bei der alle Flurstücke mit einem Wert über x $ / Morgen innerhalb von y Fuß eines anderen Flurstücks mit einem Wert von weniger als z $ / Morgen gefunden werden.
Ich möchte diese Abfrage formulieren und ausführen, ohne zu wissen oder zu beachten, dass die Daten auf 50 Computer verteilt sind. Beachten Sie die Randbedingungen: Ich möchte auch, dass die Abfrage Fälle zurückgibt, in denen teure Pakete in einem Bundesstaat in einem anderen Bundesstaat nahezu kostengünstige Pakete sind.
Gibt es eine Architektur, die diese Art der verteilten Geoverarbeitung unterstützt?
Die Architektur kann abstrakt oder als Implementierung speziell für Azure oder Amazon Web Services beschrieben werden. Oder vorzugsweise als typisches Büro, in dem Computer mit zahlreichen ArcGIS-Desktop-Lizenzen nachts im Leerlauf arbeiten.
quelle
Antworten:
Der offensichtliche Fehlerfall besteht darin, dass Ihr Interessensradius in der Paketabfrage so groß wird, dass große Teile Ihres Datensatzes potenzielle Kandidaten für die Übereinstimmung mit jedem Paket sind.
quelle
Im September gab es in Barcelona einen interessanten Slot zu FOSS4G: http://2010.foss4g.org/presentations_show.php?id=3584
Es wurde mehr zu einer Podiumsdiskussion als zu einer Präsentation.
In der Mitte dieses Blogposts gibt Paul Ramsey eine Art Zusammenfassung davon.
quelle
Schauen Sie sich vielleicht das Whitepaper "ArcGIS Server in Practice Series: Large Batch Geocoding" in den Whitepapers von esri an .
Es geht um die Geokodierung, aber der allgemeine Prozess der Verwendung eines asynchronen Geoverarbeitungs-Service ist möglicherweise auf Ihren Fall anwendbar.
quelle
Das erste, was Sie mit diesem Problem zu tun haben, ist, welche Daten wo und wann benötigt werden. Dazu beginne ich normalerweise mit der blöden, seriellen Version des Problems.
Finden Sie alle Pakete mit einem Wert über x $ / Morgen, die sich innerhalb von y Fuß eines anderen Pakets mit einem Wert von weniger als z $ / Morgen befinden.
Dieser Algorithmus ist zwar nicht optimiert, löst jedoch das Problem.
Ein ähnliches Problem habe ich für meine Masterarbeit gelöst, bei der für jeden Punkt eines Datensatzes das nächstgelegene Paket gefunden wurde. Ich habe die Lösung in PostGIS , Hadoop und MPI implementiert . Die Vollversion meiner Dissertation ist hier , aber ich werde die wichtigen Punkte zusammenfassen, die für dieses Problem gelten.
MapReduce ist keine gute Plattform, um dieses Problem zu lösen, da für die Verarbeitung eines einzelnen Pakets der Zugriff auf den gesamten Datensatz (oder eine sorgfältig ausgewählte Teilmenge) erforderlich ist. MapReduce verarbeitet sekundäre Datasets nicht gut.
MPI kann dies jedoch recht handlich lösen. Am schwierigsten ist es, zu bestimmen, wie die Daten aufgeteilt werden sollen. Diese Aufteilung basiert darauf, wie viele Daten vorhanden sind, auf wie vielen Prozessoren Sie sie ausführen müssen und wie viel Speicher Sie pro Prozessor haben. Für eine optimale Skalierung (und damit Leistung) müssen Sie mehrere Kopien des Paketdatensatzes gleichzeitig (auf allen Ihren Computern) im Speicher haben.
Um zu erklären, wie dies funktioniert, gehe ich davon aus, dass jeder Ihrer 50 Computer über 8 Prozessoren verfügt. Ich werde dann jedem Computer die Verantwortung übertragen, 1/50 der Pakete zu prüfen. Diese Überprüfung wird von 8 Prozessen auf dem Computer ausgeführt, von denen jeder eine Kopie desselben 1/50 Teils der Pakete und 1/8 des Paketdatensatzes hat. Bitte beachten Sie, dass die Gruppen nicht auf eine einzelne Maschine beschränkt sind, sondern Maschinengrenzen überschreiten können.
Der Prozess führt den Algorithmus aus und erhält die Pakete für p aus der 1/50-Menge von Paketen und die Pakete für q aus der 1/8-Menge. Nach der inneren Schleife sprechen alle Prozesse auf demselben Computer miteinander, um zu bestimmen, ob das Paket gesendet werden soll.
Ich habe einen ähnlichen Algorithmus für mein Problem implementiert. Die Quelle finden Sie hier .
Sogar mit dieser Art von nicht optimiertem Algorithmus konnte ich beeindruckende Ergebnisse erzielen, die für die Programmiererzeit stark optimiert waren (was bedeutete, dass ich einen dummen einfachen Algorithmus schreiben konnte und die Berechnung dennoch schnell genug sein würde). Der nächste zu optimierende Punkt (wenn Sie ihn wirklich benötigen) ist das Einrichten eines Quadtree-Index des zweiten Datensatzes (von dem Sie q erhalten) für jeden Prozess.
Um die ursprüngliche Frage zu beantworten. Es gibt eine Architektur: MPI + GEOS. Wenn Sie ein wenig Hilfe von meiner ClusterGIS-Implementierung einbringen, können Sie eine ganze Menge tun. All diese Software kann als Open Source gefunden werden, daher fallen keine Lizenzgebühren an. Ich bin mir nicht sicher, wie portabel es für Windows ist (vielleicht mit Cygwin), da ich unter Linux daran gearbeitet habe. Diese Lösung kann auf EC2, Rackspace oder einer beliebigen verfügbaren Cloud bereitgestellt werden. Als ich es entwickelte, verwendete ich einen dedizierten Computercluster an einer Universität.
quelle
Die Parallelprogrammierungsmethode der alten Schule besteht darin, nur einen Zustand + die Pakete, die ihn berühren, auf jedem Prozessor zu speichern, und es ist dann peinlich einfach, sie zu parallelisieren. Angesichts der unterschiedlichen Größe der US-Bundesstaaten erzielen Sie jedoch eine bessere Leistung, wenn Sie das Land in Gitterzellen aufteilen (wiederum mit dem berührenden Halo von Paketen) und jede Gitterzelle mithilfe einer Master-Slave-Konfiguration an Prozessoren senden.
quelle
Vielleicht möchten Sie Appistry einen Blick geben. Es soll die Migration bestehender Anwendungen auf private Cloud-Infrastrukturen ermöglichen. Möglicherweise gibt es andere Projekte mit einem ähnlichen Ziel: Anstatt für jede Anwendung immer wieder herauszufinden, wie komplex es ist, Aufgaben zu zerlegen und an die parallele Verarbeitung zu verteilen, erstellen Sie eine Bibliothek oder Plattform, die dies automatisch erledigt.
quelle
Für diese Art von Problem würde ich ein Map / Reduce-Framework verwenden. Das "rohe" Appistry-Framework eignet sich hervorragend für "peinlich parallele" Probleme, denen dieses nahe steht. Die Randbedingungen lassen es nicht zu. Map / Reduce (der Google-Ansatz für verteiltes Computing) ist bei dieser Art von Problem großartig.
Der größte Fortschritt bei Appistry seit dem 08-Papier ist die Veröffentlichung des CloudIQ Storage-Produkts. Dies ermöglicht eine "s3" -ähnliche Speichereinrichtung, bei der die Festplatten auf Ihren lokalen Servern verwendet werden. Dann kann das CloudIQ Engine-Produkt hochvolumige Dienste oder Anwendungen im Scatter / Gather-Stil jeder Art ermöglichen (wir haben die Skalierbarkeit mit ESRI-Laufzeit und anderen Open Source-Bibliotheken bewiesen). Wenn Sie dateibasierte Daten verarbeiten, verteilen Sie diese mit CloudIQ Storage und leiten Verarbeitungsaufträge an die lokalen Dateireplikate weiter, damit diese nicht im Netzwerk verschoben werden müssen. (so dass nicht jeder Knoten alle Daten benötigt)
Für Map / Reduce können Sie so etwas wie Hadoop (Open Source M / R Framework) auf CloudIQ Storage legen. Ich würde Hadoop nach dem beschriebenen Problem untersuchen, aber Sie müssen wirklich eintauchen, es ist nicht einfach, damit anzufangen, und M / R ist ein Gehirnbrecher. Es gibt auch eine kommerziell unterstützte Distribution, die von Cloudera angeboten wird. Es gibt ein anderes Appistry-Produkt, CloudIQ Manger, das eine gute Ergänzung zu Hadoop (Cloudera oder anders) für Vertrieb und Verwaltung darstellt.
Ich würde mit Hadoop (M / R- und HDFS-Dateisystem) beginnen. Wenn Sie eine kommerziell besser unterstützte skalierbare Lösung benötigen, schauen Sie sich Appistry CloudIQ Manager und Storage in Verbindung mit Cloudera Hadoop Distribution an.
Wenn Sie eine einfachere Architektur für "peinlich parallele" Aufgaben wünschen, schauen Sie sich auch CloudIQ Engine an. (Die Ansätze in dem Artikel, auf den Kirk verweist, sind weiterhin gültig.)
quelle
Schauen Sie sich OGSA-DQP an. "Mit DQP können Tabellen aus mehreren verteilten relationalen Datenbanken mithilfe von SQL abgefragt werden, als befänden sich mehrere Tabellen in einer einzigen Datenbank." Http://ogsa-dai.sourceforge.net/documentation/ogsadai4.0/ogsadai4.0- axis / DQPOverview.html
quelle