Предположим, у меня есть 50 компьютеров в локальной сети. Каждый компьютер имеет базу геоданных для всех полигонов участков в определенном штате США.
Я хотел бы написать задачу геообработки, которая находит все участки стоимостью более x $ / акр, которые находятся в пределах y футов от другого участка стоимостью менее z $ / акр.
Я хотел бы сформулировать и выполнить этот запрос, не зная и не заботясь о том, что данные распределены по 50 компьютерам. Помните о граничных условиях: я также хочу, чтобы запрос возвращал случаи, когда дорогие посылки в одном штате находятся рядом с недорогими посылками в другом.
Существует ли архитектура, поддерживающая такого рода распределенную геообработку?
Архитектура может быть описана абстрактно или как реализация, специфичная для Azure или Amazon Web Services. Или, предпочтительно, в качестве типичного офиса, где компьютеры бездействуют ночью с многочисленными лицензиями ArcGIS для настольных ПК.
источник
Ответы:
Очевидный случай сбоя заключается в том, что ваш радиус интереса в запросе на посылку становится достаточно большим, так что большие части вашего набора данных являются потенциальными кандидатами для соответствия каждой посылке.
источник
В сентябре в Барселоне на FOSS4G был интересный слот на эту тему: http://2010.foss4g.org/presentations_show.php?id=3584
Это стало больше панельной дискуссией, чем презентацией.
В середине этого сообщения в блоге Пол Рэмси дает какое-то краткое изложение этого.
источник
Возможно, взгляните на технический документ «Серия ArcGIS Server на практике: геокодирование больших партий » на официальном документе esri .
Речь идет о геокодировании, но общий процесс использования асинхронной службы геообработки может быть применим в вашем случае.
источник
Первое, о чем нужно беспокоиться, это то, какие данные нужны, где и когда. Для этого я обычно начинаю с глупой, серийной версии проблемы.
Найти все участки стоимостью более x $ / акр, которые находятся в пределах y футов от другого участка стоимостью менее z $ / акр.
Хотя этот алгоритм не оптимизирован, он решит проблему.
Я решил аналогичную задачу для своей магистерской диссертации, которая нашла ближайшую посылку для каждой точки в наборе данных. Я реализовал решение в PostGIS , Hadoop и MPI . Полная версия моей диссертации находится здесь , но я суммирую важные моменты, которые относятся к этой проблеме.
Уменьшение карты не является хорошей платформой для решения этой проблемы, поскольку для обработки одной посылки требуется доступ ко всему набору данных (или тщательно отобранному подмножеству). MapReduce плохо обрабатывает вторичные наборы данных.
MPI, однако, может решить эту проблему довольно легко. Сложнее всего определить, как разделить данные. Это разделение основано на том, сколько данных имеется, сколько процессоров вам нужно для этого и сколько памяти у вас на процессор. Для лучшего масштабирования (и, следовательно, производительности) вам необходимо иметь несколько копий набора данных участков в памяти (на всех ваших компьютерах) одновременно.
Чтобы объяснить, как это работает, я предполагаю, что каждый из ваших 50 компьютеров имеет 8 процессоров. Затем я назначу каждому компьютеру ответственность за проверку 1/50 посылок. Эта проверка будет выполняться 8 процессами на компьютере, каждый из которых имеет копию одной и той же 1/50 части участков и 1/8 набора данных участков. Обратите внимание, что группы не ограничены одной машиной, но могут пересекать границы машины.
Процесс выполнит алгоритм, получив посылки для p из 1/50 набора, а посылки для q из 1/8 набора. После внутреннего цикла все процессы на одном компьютере будут взаимодействовать, чтобы определить, следует ли отправлять посылку.
Я реализовал алгоритм, аналогичный этому для моей проблемы. Вы можете найти источник здесь .
Даже с этим неоптимизированным алгоритмом я смог получить впечатляющие результаты, которые были сильно оптимизированы для программиста (это означало, что я мог бы написать глупый простой алгоритм, и вычисления все равно были бы достаточно быстрыми). Следующее место, которое нужно оптимизировать (если оно вам действительно нужно), - это установить индекс дерева ветвей второго набора данных (откуда вы получаете q) для каждого процесса.
Чтобы ответить на оригинальный вопрос. Есть архитектура: MPI + GEOS. Добавьте небольшую помощь от моей реализации ClusterGIS, и многое можно сделать. Все это программное обеспечение можно найти как открытый исходный код, поэтому никаких лицензионных сборов. Я не уверен, насколько она совместима с Windows (возможно, с Cygwin), так как я работал над ней в Linux. Это решение может быть развернуто в EC2, Rackspace или любом другом доступном облаке. Когда я его разрабатывал, я использовал выделенный вычислительный кластер в университете.
источник
Методология параллельного программирования старой школы заключается в том, чтобы просто хранить состояние + посылки, которые касаются его, на каждом процессоре, и тогда его очень легко распараллелить. Но, учитывая различия в размере штатов США, вы получите лучшую производительность, разделив страну на ячейки сетки (опять же с трогательным ореолом посылок) и отправив каждую ячейку сетки на процессоры, используя конфигурацию «ведущий-ведомый».
источник
Возможно, вы захотите взглянуть на Апстери . Предполагается включить миграцию существующих приложений в частные облачные инфраструктуры. Могут быть и другие проекты с аналогичной целью: вместо того, чтобы снова и снова выяснять для каждого приложения очень сложный орех разбиения и распределения задач на параллельную обработку, создайте библиотеку или платформу, которая делает это автоматически.
источник
Для этого типа проблемы, я бы использовал карту / уменьшить рамки. «Сырая» платформа Appistry отлично подходит для «смущающе параллельных» проблем, с которыми эта проблема близка. Краевые условия не позволяют этому быть. Map / Reduce (подход Google к распределенным вычислениям) хорош в этом типе проблем.
Самым большим достижением в Appistry со времени выхода статьи 08 является выпуск продукта CloudIQ Storage. Это позволяет использовать хранилище типа «s3», используя диски на локальных серверах. Затем продукт CloudIQ Engine может запускать сервисы большого объема или разбирать / собирать приложения любого типа (мы доказали масштабируемость, используя среду выполнения ESRI и другие библиотеки с открытым исходным кодом). Если вы работаете с данными на основе файлов, вы распространяете их с помощью CloudIQ Storage и перенаправляете задания на обработку в локальные файловые реплики, чтобы их не приходилось перемещать по сети. (поэтому каждому узлу не нужны все данные)
Для Map / Reduce вы можете создать что-то вроде Hadoop (M / R-фреймворк с открытым исходным кодом) в CloudIQ Storage. Я бы посмотрел на Hadoop для решения проблемы, как описано, но вам действительно нужно погрузиться в это, начать нелегко, а M / R - искривление мозга. Существует также коммерчески поддерживаемый дистрибутив, предлагаемый Cloudera. Есть еще один продукт Appistry, CloudIQ Manger, который является хорошим дополнением к Hadoop (Cloudera или иным образом) для распространения и управления.
Я бы начал с Hadoop (файловая система M / R и HDFS), и если вам нужно более коммерчески поддерживаемое масштабируемое решение, обратите внимание на Appistry CloudIQ Manager и Storage вместе с дистрибутивом Cloudera Hadoop.
Если вы хотите более простую архитектуру для «смущающе параллельных» задач, посмотрите на CloudIQ Engine. (подходы, изложенные в статье, на которую ссылается Кирк, остаются в силе)
источник
Посмотрите на OGSA-DQP. «DQP позволяет запрашивать таблицы из нескольких распределенных реляционных баз данных, используя SQL, как если бы в одной базе данных было несколько таблиц» http://ogsa-dai.sourceforge.net/documentation/ogsadai4.0/ogsadai4.0- ось / DQPOverview.html
источник