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. Если ваше приложение зависит от расположения данных в выводе, необходимо отсортировать данные согласно собственным требованиям.