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