Supposons que j'ai 50 ordinateurs sur mon LAN. Aux États-Unis, chaque ordinateur possède une géodatabase pour tous les polygones de parcelles dans un état particulier.
Je voudrais écrire une tâche de géotraitement qui trouve tous les colis d'une valeur plus x $ / acre qui sont à y pieds d' une autre parcelle qui est évaluée à moins de z $ / acre.
Je voudrais formuler et exécuter cette requête sans savoir ni se soucier que les données sont réparties sur 50 ordinateurs. Gardez à l'esprit les conditions aux limites: je souhaite également que la requête renvoie les cas dans lesquels des colis coûteux dans un État sont proches de colis bon marché dans un autre.
Existe-t-il une architecture qui prend en charge ce type de géotraitement distribué?
L'architecture peut être décrite de manière abstraite ou comme une implémentation spécifique à Azure ou Amazon Web Services. Ou, de préférence, comme un bureau typique où les ordinateurs restent inactifs la nuit avec de nombreuses licences de bureau ArcGIS.
la source
Réponses:
Le cas d'échec évident est que votre rayon d'intérêt dans la requête de parcelle augmente suffisamment pour que de grandes parties de votre ensemble de données soient des candidats potentiels pour correspondre à chaque parcelle.
la source
Il y avait une fente intéressante sur FOSS4G en septembre à Barcelone à ce sujet: http://2010.foss4g.org/presentations_show.php?id=3584
C'est devenu plus une table ronde qu'une présentation.
Au milieu de ce billet de blog, Paul Ramsey en donne une sorte de résumé.
la source
Consultez peut-être le livre blanc «ArcGIS Server in Practice Series: Large Batch Geocoding» sur les livres blancs esri .
Il s'agit de géocodage, mais le processus général d'utilisation d'un service de géotraitement asynchrone peut s'appliquer à votre cas.
la source
La première chose à se préoccuper de ce problème est de savoir quelles données sont nécessaires où et quand. Pour ce faire, je commence généralement par la version série stupide du problème.
Trouvez toutes les parcelles d'une valeur supérieure à x $ / acre qui se trouvent à moins de y pieds d'une autre parcelle d'une valeur inférieure à z $ / acre.
Bien que cet algorithme ne soit pas optimisé, il résoudra le problème.
J'ai résolu un problème similaire pour ma thèse de maîtrise qui a trouvé la parcelle la plus proche pour chaque point d'un ensemble de données. J'ai implémenté la solution dans PostGIS , Hadoop et MPI . La version complète de ma thèse est ici , mais je vais résumer les points importants en ce qui concerne ce problème.
MapReduce n'est pas une bonne plate-forme pour résoudre ce problème car il nécessite l'accès à l'ensemble de données (ou à un sous-ensemble soigneusement sélectionné) pour traiter une parcelle unique. MapReduce ne gère pas bien les jeux de données secondaires.
MPI, cependant, peut résoudre ce problème très facilement. La partie la plus difficile consiste à déterminer comment diviser les données. Cette répartition est basée sur la quantité de données, le nombre de processeurs sur lesquels vous devez les exécuter et la quantité de mémoire dont vous disposez par processeur. Pour une meilleure mise à l'échelle (et donc des performances), vous devrez disposer de plusieurs copies du jeu de données de parcelles en mémoire (sur tous vos ordinateurs) à la fois.
Pour expliquer comment cela fonctionne, je suppose que chacun de vos 50 ordinateurs possède 8 processeurs. J'attribuerai ensuite à chaque ordinateur la responsabilité de contrôler 1/50 des colis. Cette vérification sera exécutée par 8 processus sur l'ordinateur, chacun ayant une copie de la même partie 1/50 des colis et 1/8 du jeu de données de colis. Veuillez noter que les groupes ne sont pas limités à une seule machine, mais peuvent traverser les limites des machines.
Le processus exécutera l'algorithme, obtenant les parcelles pour p à partir du 1 / 50e ensemble de parcelles, et les parcelles pour q à partir du 1 / 8e ensemble. Après la boucle interne, tous les processus sur le même ordinateur parleront ensemble pour déterminer si le colis doit être émis.
J'ai implémenté un algorithme similaire à celui-ci pour mon problème. Vous pouvez trouver la source ici .
Même avec ce type d'algorithme non optimisé, j'ai pu obtenir des résultats impressionnants qui étaient hautement optimisés pour le temps du programmeur (ce qui signifie que je pouvais écrire un algorithme simple stupide et que le calcul serait encore assez rapide). Le point suivant à optimiser (si vous en avez vraiment besoin), est de configurer un index quadtree du deuxième ensemble de données (d'où vous obtenez q) pour chaque processus.
Pour répondre à la question d'origine. Il existe une architecture: MPI + GEOS. Ajoutez un peu d'aide de mon implémentation ClusterGIS et beaucoup peut être fait. Tous ces logiciels peuvent être trouvés en open source, donc pas de frais de licence. Je ne sais pas à quel point il est portable pour Windows (peut-être avec Cygwin) car j'ai travaillé dessus sous Linux. Cette solution peut être déployée sur EC2, Rackspace ou tout autre cloud disponible. Quand je l'ai développé, j'utilisais un cluster de calcul dédié dans une université.
la source
La méthodologie de programmation parallèle de la vieille école consiste à simplement stocker un état + les parcelles qui le touchent sur chaque processeur, puis il est embarrassamment facile de paralléliser. Mais étant donné la variation de la taille des États américains, vous obtiendrez de meilleures performances en divisant le pays en cellules de grille (encore une fois avec le halo touchant des parcelles) et en envoyant chaque cellule de grille aux processeurs en utilisant une configuration maître-esclave.
la source
Vous voudrez peut-être jeter un œil à Appistry . Il prétend permettre la migration des applications existantes vers des infrastructures de cloud privé. Il peut y avoir d'autres projets avec un objectif similaire: plutôt que de trouver encore et encore pour chaque application l'écrou très complexe de la décomposition et de la distribution des tâches au traitement parallèle, créer une bibliothèque ou une plate-forme qui le fait automatiquement.
la source
Pour ce type de problème, j'utiliserais un cadre de carte / réduire. Le cadre d'application "brut" est idéal pour les problèmes "embarrassamment parallèles", dont celui-ci est proche. Les conditions de bord ne le permettent pas. Map / Reduce (l'approche de Google pour l'informatique distribuée) est parfait pour ce type de problème.
La plus grande avancée d'Appistry depuis la publication du 08 est la sortie du produit CloudIQ Storage. Cela permet une installation de stockage de type «s3» en utilisant les disques sur vos serveurs locaux. Ensuite, le produit CloudIQ Engine peut activer des services à volume élevé ou des applications de style diffusion / collecte de toute sorte (nous avons prouvé l'évolutivité en utilisant le runtime ESRI et d'autres bibliothèques open source). Si vous utilisez des données basées sur des fichiers, vous les distribuez à l'aide de CloudIQ Storage et acheminez les travaux de traitement vers les réplicas de fichiers locaux afin qu'ils n'aient pas à être déplacés sur le réseau. (donc chaque nœud n'a pas besoin de toutes les données)
Pour Map / Reduce, vous pouvez superposer quelque chose comme Hadoop (framework open source M / R) sur CloudIQ Storage. Je regarderais Hadoop pour le problème tel que décrit, mais vous avez vraiment besoin de plonger, ce n'est pas facile de commencer, et M / R est un casse-tête. Cloudera propose également une distribution commerciale. Il existe un autre produit Appistry, CloudIQ Manger, qui est un bon complément à Hadoop (Cloudera ou autre) pour la distribution et la gestion.
Je commencerais par Hadoop (système de fichiers M / R et HDFS), et si vous avez besoin d'une solution évolutive prise en charge plus commercialement, regardez Appistry CloudIQ Manager and Storage, en conjonction avec la distribution Cloudera Hadoop.
Si vous voulez une architecture plus simple pour des tâches "parallèlement embarrassantes", regardez également CloudIQ Engine. (les approches décrites dans l'article référencé par Kirk sont toujours valides)
la source
Jetez un oeil à OGSA-DQP. "DQP permet d'interroger les tables de plusieurs bases de données relationnelles distribuées, en utilisant SQL, comme s'il y avait plusieurs tables dans une seule base de données" http://ogsa-dai.sourceforge.net/documentation/ogsadai4.0/ogsadai4.0- axis / DQPOverview.html
la source