在并行池上运行 mapreduce
启动并行池
如果您安装了 Parallel Computing Toolbox™,执行 mapreduce
可以在您的默认配置文件指定的集群上打开一个并行池,作为执行环境。
您可以设置并行设置,使池不会自动打开。在这种情况下,如果您希望 mapreduce
使用它来并行化其工作,则必须明确启动一个池。要了解有关并行设置的详细信息,请参阅 指定并行设置。
例如,此概念代码启动了一个有 12 个工作单元的池。然后它使用 mapreducer
将执行环境设置为池,从而创建 MapReducer
对象 mr
。最后,它使用 mr
在转换后的数据存储 tds
上运行 mapreduce
。
p = parpool('Processes',12);
mr = mapreducer(p);
outds = mapreduce(tds,@MeanDistMapFun,@MeanDistReduceFun,mr)
注意
mapreduce
可以在任何支持并行池的集群上运行。本主题中的示例使用本地集群,适用于所有 Parallel Computing Toolbox 安装。
比较并行 mapreduce
以下示例根据航空数据存储来计算平均到达延迟。首先,它在 MATLAB® 客户端会话中运行 mapreduce
,然后在本地集群上并行运行。mapreducer
函数明确控制执行环境。
首先在本地集群上启动并行池。
p = parpool('Processes',4);
Starting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers.
创建两个 MapReducer 对象,用于为 mapreduce
指定不同的执行环境。
inMatlab = mapreducer(0); inPool = mapreducer(p);
创建并预览数据存储。本示例中使用的数据集可以在
中找到。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
接下来,在 MATLAB 客户端会话中运行 mapreduce
计算。
中提供了 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 函数本身的计算量越来越大,与在 MATLAB 客户端会话中运行 mapreduce
相比,您可能希望看到并行池的性能有所提高。
注意
在集群上并行运行 mapreduce
时,输出中的键值对的顺序与在 MATLAB 中运行 mapreduce
不同。如果您的应用程序依赖于输出中的数据排列,则必须根据自己的要求对数据进行排序。