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