主要内容

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

算法步骤如下:

  1. mapreduce从输入数据存储中读取一个数据块[data,info] = read(ds),然后调用map函数来处理该块。

  2. map函数接收数据块,对其进行组织或执行预先计算,然后使用添加而且addmulti函数向称为对象的中间数据存储对象添加键-值对KeyValueStore.调用映射函数的次数mapreduce等于输入数据存储中的块数。

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

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

  5. reduce函数使用hasnext而且getnext方法中的值进行迭代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(“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函数的数据。因此,您可以使用SelectedVariableNamesSelectedFormats,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函数,因此这些函数必须满足一定的要求才能正常运行。

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

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

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

    • intermValIterValueIterator与活动键相关联,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使用dsMeanDistMapFun,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]}

另请参阅

|

相关的话题