文档

开始使用MapReduce

随着数据采集设备的数量和类型每年都在增长,数据收集的规模和速度也在迅速扩大。这些大数据集可以包含千兆字节或千兆字节的数据,并且每天可以以兆字节或千兆字节的量级增长。虽然这些信息的收集为深入了解提供了机会,但也带来了许多挑战。大多数算法都不是为在合理的时间内或使用合理的内存处理大数据集而设计的。MapReduce允许您应对许多这样的挑战,从大型数据集中获得重要的见解。

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

算法步骤如下:

  1. mapreduce使用。从输入数据存储读取数据块(数据、信息)=阅读(ds),然后调用map函数来处理该块。

  2. map函数接收数据块,对其进行组织或执行前兆计算,然后使用添加addmulti函数将键值对添加到称为KeyValueStore.调用map函数的次数mapreduce等于输入数据存储中的块数。

  3. 在map函数处理数据存储中的所有数据块之后,mapreduce对中间值中的所有值进行分组KeyValueStore对象的唯一键。

  4. 接下来,mapreduce为map函数添加的每个唯一键调用reduce函数一次。每个唯一的键可以有许多相关联的值。mapreduce将值作为参数传递给reduce函数ValueIterator对象,该对象用于遍历值。的ValueIterator对象的每个唯一键包含该键的所有关联值。

  5. reduce函数使用hasnextgetnext函数中遍历的值ValueIterator一次一个物体。然后,在聚合map函数的中间结果之后,reduce函数使用添加addmulti功能。键在输出中的顺序与reduce函数将它们添加到final的顺序相同KeyValueStore对象。也就是说,mapreduce没有显式地对输出进行排序。

    请注意

    reduce函数将最终的键值对写入一个finalKeyValueStore对象。从这个对象中,mapreduce将键值对拉入输出数据存储,输出数据存储是KeyValueDatastore默认对象。

MapReduce计算例子

这个例子使用了一个简单的计算(一组飞行数据中的平均旅行距离)来说明需要运行的步骤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函数执行数据存储检索要传递给映射函数的数据。因此,您可以使用SelectedVariableNamesSelectedFormats,ReadSize选项直接配置数据块大小和类型mapreduce传递给map函数。

例如,要选择距离(总飞行距离)变量作为唯一感兴趣的变量,指定SelectedVariableNames

ds。SelectedVariableNames =“距离”;

现在,每当readall,或预览函数作用于ds,他们将只返回信息距离变量。要确认这一点,可以预览数据存储中的前几行数据。这允许您检查数据的格式mapreduce函数将传递给map函数。

预览(ds) ans =距离________ 308 296 480 296 373 308 447 954

查看确切的的数据mapreduce将传递到map函数,使用

有关其他信息和可用选项的完整摘要,请参见数据存储

编写Map和Reduce函数

mapreduce函数在执行过程中自动调用map和reduce函数,因此这些函数必须满足一定的要求才能正常运行。

  1. 映射函数的输入是数据信息,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

  2. reduce函数的输入是intermKeyintermValIter,outKVStore

    • intermKey为map函数添加的活动键。每次调用reduce函数mapreduce从中间键中指定一个新的唯一键KeyValueStore对象。

    • intermValIterValueIterator与活动密钥相关联的,intermKey.这ValueIterator对象包含与活动键关联的所有值。的滚动值hasnextgetnext功能。

    • 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函数

mapreduce运行

在拥有数据存储、map函数和reduce函数之后,可以调用mapreduce来执行计算。要计算数据集中的平均飞行距离,调用mapreduce使用dsMeanDistMapFun.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]

另请参阅

|

相关的话题

这个话题有用吗?