как лучше структурировать линейное программирование с помощью Spark - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно решить большое количество (от 2 до 10 миллионов) очень похожих небольших (может быть, 100 ограничений) задач, где только небольшое количество ограничений, всегда одно и то же изменение.

По сути, я хочу минимизировать стоимость покрытия потребления. Правила более или менее следующие:

Каждый покупатель (у нас их миллионы) потребляет несколько единиц разных предметов, это для каждого покупателя разное. У нас есть несколько продуктов, каждый из которых включает в себя один или несколько товаров по определенной стоимости. Продукты и цены являются общими для всех клиентов Кроме того, существуют некоторые дополнительные ограничения, которые связывают, какие продукты могут быть объединены для каждого клиента, но ограничения снова одинаковы для всех клиентов. Я планирую решить эту проблему с помощью Spark, и я не знаком с производительностью его алгоритмов для этой проблемы, и мой вопрос заключается в том, должен ли я попытаться решить очень большое количество небольших проблем или объединить их в повторяющуюся большую проблему ограничения между продуктами для каждого клиента?

Может быть, объединить несколько сотен тысяч клиентов?

В качестве альтернативы, могу ли я как-то использовать, чтобы отдельные проблемы были очень похожи для их быстрого решения?

Спасибо

1 Ответ

0 голосов
/ 10 мая 2018

Как Spark обычно решает проблемы

Spark - это крупномасштабный механизм распределенных вычислений, основной целью которого является передача вычислений к данным и решение проблем параллельного использования операций с памятью в виденасколько это возможно.

Как правило, вы просто загружаете все свои данные в наборы данных или кадры данных (например, таблицы SQL), а затем пишете псевдо-SQL для решения вашей проблемы.

записи клиентов будут просто строками в ваших различных таблицах.Spark будет ждать, пока вы укажете шаг вывода (запись в файл / db / etc), и в этот момент он сгенерирует оптимизированный план запросов для выполнения ваших операций самым умным способом, который он знает.

Scaling Spark

Если он слишком медленный или дает сбой, вы обычно масштабируете, предоставляя spark больше ядер, больше памяти, больше исполнителей и более разумно разделяя ваши данные (разделы являются единицами параллелизма; sparkSQL использует 200 по умолчанию).Spark предназначен для работы на кластере компьютеров, достаточно больших для одновременного решения ваших проблем.Например, мы успешно обрабатываем миллиарды строк одновременно в кластере из 8 узлов.

Если у вас нет реального кластера или кластера, достаточно большого для решения вашей проблемы, вы можете выполнить пакетные вычисления, которыеЭто хорошо;но общий подход был бы аналогичным.

Специальные библиотеки

Существуют специальные библиотеки для работы с графами (GraphX), машинного обучения и специальные алгоритмические библиотеки;но не похоже, что вам нужны такие вещи.

...