随着数据采集设备的数量和类型每年都在增长,数据收集的规模和速度也在迅速扩大。这些大数据集可以包含千兆字节或千兆字节的数据,并且每天可以以兆字节或千兆字节的量级增长。虽然这些信息的收集为深入了解提供了机会,但也带来了许多挑战。大多数算法都不是为在合理的时间内或使用合理的内存处理大数据集而设计的。MapReduce允许您应对许多这样的挑战,从大型数据集中获得重要的见解。
MapReduce是一种编程技术,用于分析内存中不合适的数据集。您可能对Hadoop很熟悉®MapReduce,这是一个流行的实现,与Hadoop分布式文件系统(HDFS™)一起工作。MATLAB®控件提供了与MapReduce技术稍有不同的实现mapreduce
函数。
mapreduce
使用数据存储以小块的形式处理数据,这些小块分别适合于内存。每个数据块都经过一个Map阶段,该阶段对要处理的数据进行格式化。然后中间数据块经过一个Reduce阶段,该阶段将聚合中间结果以生成最终结果。Map和Reduce阶段用地图和减少函数,它们是mapreduce
.有无数的map和reduce函数组合来处理数据,因此这种技术对于处理大型数据处理任务既灵活又非常强大。
mapreduce
可以扩展到多个环境中运行。有关这些功能的更多信息,请参见使用其他产品加速和部署MapReduces manbetx 845.
的效用mapreduce
功能在于对大量数据集执行计算的能力。因此,mapreduce
是不是很适合进行计算正常的可以直接载入计算机存储器并使用传统技术进行分析的大型数据集。相反,使用mapreduce
对内存中不合适的数据集进行统计或分析计算。
每次调用map或reduce函数mapreduce
是独立的。例如,对map函数的调用不能依赖于先前对map函数调用的输入或结果。最好将这样的计算分解为多个调用mapreduce
.
mapreduce
在到达最终输出之前,将输入数据存储中的每个数据块移动几个阶段。下图概述了算法的阶段mapreduce
.
算法步骤如下:
mapreduce
使用。从输入数据存储读取数据块(数据、信息)=阅读(ds)
,然后调用map函数来处理该块。
map函数接收数据块,对其进行组织或执行前兆计算,然后使用添加
和addmulti
函数将键值对添加到称为KeyValueStore
.调用map函数的次数mapreduce
等于输入数据存储中的块数。
在map函数处理数据存储中的所有数据块之后,mapreduce
对中间值中的所有值进行分组KeyValueStore
对象的唯一键。
接下来,mapreduce
为map函数添加的每个唯一键调用reduce函数一次。每个唯一的键可以有许多相关联的值。mapreduce
将值作为参数传递给reduce函数ValueIterator
对象,该对象用于遍历值。的ValueIterator
对象的每个唯一键包含该键的所有关联值。
reduce函数使用hasnext
和getnext
函数中遍历的值ValueIterator
一次一个物体。然后,在聚合map函数的中间结果之后,reduce函数使用添加
和addmulti
功能。键在输出中的顺序与reduce函数将它们添加到final的顺序相同KeyValueStore
对象。也就是说,mapreduce
没有显式地对输出进行排序。
reduce函数将最终的键值对写入一个finalKeyValueStore
对象。从这个对象中,mapreduce
将键值对拉入输出数据存储,输出数据存储是KeyValueDatastore
默认对象。
这个例子使用了一个简单的计算(一组飞行数据中的平均旅行距离)来说明需要运行的步骤mapreduce
.
使用的第一步mapreduce
是为数据集构造一个数据存储。与map和reduce函数一样,数据集的数据存储也是必须的输入mapreduce
,因为它允许mapreduce
按块处理数据。
mapreduce
适用于所有类型的数据存储。例如,创建一个TabularTextDatastore
对象的airlinesmall.csv
数据集。
ds = tabularTextDatastore(' airlinessmall .csv','TreatAsMissing','NA') ds = tabularTextDatastore with properties: Files:{'…\matlab\工具箱\matlab\demo \ airlinessmall .csv'} FileEncoding: 'UTF-8' ReadVariableNames: true VariableNames: {'Year', 'Month', 'DayofMonth'…和26 more} Text Format Properties: NumHeaderLines: 0 Delimiter: ',' RowDelimiter: '\r\n' TreatAsMissing: 'NA' MissingValue: NaN Advanced Text Format Properties: TextscanFormats: {'%f', '%f', '%f'…和26 more} ExponentCharacters: 'eEdD' CommentStyle: " Whitespace: ' \b\t' MultipleDelimitersAsOne: false属性,控制由preview, read, readall返回的表:SelectedVariableNames: {'Year', 'Month', 'DayofMonth'…和26}SelectedFormats: {% f ', ' % f ', ' % f '……} ReadSize: 20000行
前面描述的几个选项在上下文中是有用的mapreduce
.的mapreduce
函数执行读
在数据存储
检索要传递给映射函数的数据。因此,您可以使用SelectedVariableNames
,SelectedFormats
,ReadSize
选项直接配置数据块大小和类型mapreduce
传递给map函数。
例如,要选择距离
(总飞行距离)变量作为唯一感兴趣的变量,指定SelectedVariableNames
.
ds。SelectedVariableNames =“距离”;
现在,每当读
,readall
,或预览
函数作用于ds
,他们将只返回信息距离
变量。要确认这一点,可以预览数据存储中的前几行数据。这允许您检查数据的格式mapreduce
函数将传递给map函数。
预览(ds) ans =距离________ 308 296 480 296 373 308 447 954
查看确切的的数据mapreduce
将传递到map函数,使用读
.
有关其他信息和可用选项的完整摘要,请参见数据存储.
的mapreduce
函数在执行过程中自动调用map和reduce函数,因此这些函数必须满足一定的要求才能正常运行。
映射函数的输入是数据
,信息
,intermKVStore
:
数据
和信息
电话的结果是读
输入函数数据存储
,这mapreduce
在每次调用map函数之前自动执行。
intermKVStore
中间体的名称是什么KeyValueStore
对象,映射函数需要向其添加键值对。的添加
和addmulti
函数使用这个对象名来添加键值对。如果没有对map函数的调用添加键值对intermKVStore
,然后mapreduce
不调用reduce函数,结果数据存储为空。
map函数的一个简单示例是:
函数MeanDistMapFun(data, info, intermKVStore)的距离= data. distance (~isnan(data. distance));sumLenValue = [sum(distance) length(distance)];添加(intermKVStore sumAndLength, sumLenValue);结束
这个map函数只有三行,它们执行一些简单的角色。第一行过滤掉了所有内容南
距离数据块中的值。第二行创建一个包含块的总距离和计数的双元素向量,第三行将该向量的值添加到intermKVStore
的关键,“sumAndLength”
.在此map函数运行后,所有的数据块ds
,intermKVStore
对象包含每个距离数据块的总距离和计数。
将此函数保存在当前文件夹中为MeanDistMapFun.m
.
reduce函数的输入是intermKey
,intermValIter
,outKVStore
:
intermKey
为map函数添加的活动键。每次调用reduce函数mapreduce
从中间键中指定一个新的唯一键KeyValueStore
对象。
intermValIter
是ValueIterator
与活动密钥相关联的,intermKey
.这ValueIterator
对象包含与活动键关联的所有值。的滚动值hasnext
和getnext
功能。
outKVStore
决赛的名字是什么KeyValueStore
对象,reduce函数需要向其添加键值对。mapreduce
获取的输出键值对outKVStore
并在输出中返回它们数据存储
,也就是KeyValueDatastore
默认对象。如果对reduce函数的调用都没有添加键值对outKVStore
,然后mapreduce
返回一个空的数据存储。
一个简单的reduce函数的例子是:
函数medistreducefun (intermKey, intermValIter, outKVStore) sumLen = [0 0];while hasnext(intermValIter) sumLen = sumLen + getnext(intermValIter); / /计算结果end add(outKVStore, 'Mean', sumLen(1)/sumLen(2));结束
这个reduce函数循环遍历每个距离并计算其中的值intermValIter
,记录跑步总距离,并在每次经过后计数。在这个循环之后,reduce函数用一个简单的除法计算总体平均飞行距离,然后添加一个单独的键outKVStore
.
将此函数保存在当前文件夹中为MeanDistReduceFun.m
.
有关编写更高级的map和reduce函数的信息,请参见编写映射函数和编写一个Reduce函数.
在拥有数据存储、map函数和reduce函数之后,可以调用mapreduce
来执行计算。要计算数据集中的平均飞行距离,调用mapreduce
使用ds
,MeanDistMapFun.m
,MeanDistReduceFun.m
.
outds = mapreduce(ds, @MeanDistMapFun, @ meandistducefun);******************************** * MAPREDUCE的进展 * ******************************** 地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65%减少0%地图地图97%减少0% 100% 81%减少0%减少100%
默认情况下,mapreduce
命令行显示进度信息,并返回KeyValueDatastore
对象,该对象指向当前文件夹中的文件。控件可以调整所有这三个选项名称,值
对理由“OutputFolder”
,“OutputType”
,“显示”
.有关更多信息,请参阅参考页mapreduce
.
使用readall
函数从输出数据存储中读取键值对。
readall (outds) ans =键值 ______ __________ ' 的意思是“[702.1630]