mapreduce
на параллельном пулеЕсли вам установили Parallel Computing Toolbox™, выполнение mapreduce
может открыть параллельный пул в кластере, заданном вашим профилем по умолчанию, для использования в качестве среды выполнения.
Можно установить параллельные настройки так, чтобы пул автоматически не открывался. В этом случае необходимо явным образом запустить пул, если вы хотите mapreduce
использовать его для распараллеливания его работы. Смотрите Задают Ваши Параллельные Настройки.
Например, следующий концептуальный код запускает пул, и некоторое время спустя использует тот открытый пул для mapreducer
настройка.
p = parpool('local',n);
mr = mapreducer(p);
outds = mapreduce(tds,@MeanDistMapFun,@MeanDistReduceFun,mr)
Примечание
mapreduce
может работать на любом кластере, который поддерживает параллельные пулы. Примеры в этой теме используют локальный кластер, который работает на все установки Parallel Computing Toolbox.
mapreduce
Следующий пример вычисляет среднюю задержку прибытия от datastore данных авиакомпании. Сначала это запускает mapreduce
на клиентском сеансе MATLAB затем это запускается параллельно в локальном кластере. mapreducer
функционируйте явным образом управляет средой выполнения.
Начните путем запуска параллельного пула в локальном кластере.
p = parpool('local',4);
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
Создайте два объекта MapReducer для определения различных сред выполнения для mapreduce
.
inMatlab = mapreducer(0); inPool = mapreducer(p);
Создайте и предварительно просмотрите datastore. Набор данных, используемый в этом примере, доступен в
.matlabroot
/toolbox/matlab/demos
ds = datastore('airlinesmall.csv','TreatAsMissing','NA',... 'SelectedVariableNames','ArrDelay','ReadSize',1000); preview(ds)
ArrDelay ________ 8 8 21 13 4 59 3 11
Затем запуститесь mapreduce
вычисление в MATLAB® клиентский сеанс. Map и reduce функции доступны в
.matlabroot
/toolbox/matlab/demos
meanDelay = mapreduce(ds,@meanArrivalDelayMapper,@meanArrivalDelayReducer,inMatlab);
******************************** * MAPREDUCE PROGRESS * ******************************** Map 0% Reduce 0% Map 10% Reduce 0% Map 20% Reduce 0% Map 30% Reduce 0% Map 40% Reduce 0% Map 50% Reduce 0% Map 60% Reduce 0% Map 70% Reduce 0% Map 80% Reduce 0% Map 90% Reduce 0% Map 100% Reduce 100%
readall(meanDelay)
Key Value __________________ ________ 'MeanArrivalDelay' [7.1201]
Затем выполните вычисление на текущем параллельном пуле. Обратите внимание на то, что синтезируемый текст указывает на параллель mapreduce
.
meanDelay = mapreduce(ds,@meanArrivalDelayMapper,@meanArrivalDelayReducer,inPool);
Parallel mapreduce execution on the parallel pool: ******************************** * MAPREDUCE PROGRESS * ******************************** Map 0% Reduce 0% Map 100% Reduce 50% Map 100% Reduce 100%
readall(meanDelay)
Key Value __________________ ________ 'MeanArrivalDelay' [7.1201]
С этим относительно небольшим набором данных повышение производительности с параллельным пулом маловероятно. Этот пример должен показать механизм для выполнения mapreduce
на параллельном пуле. Когда набор данных растет, или сами map и reduce функции становятся более в вычислительном отношении интенсивными, вы можете ожидать видеть улучшенную производительность с параллельным пулом, по сравнению с выполнением mapreduce
на клиентском сеансе MATLAB.
Примечание
При хождении параллельно под mapreduce
в кластере порядок пар "ключ-значение" в выходе отличается по сравнению с выполнением mapreduce
в MATLAB. Если ваше приложение зависит от расположения данных в выходе, необходимо отсортировать данные согласно собственным требованиям.