地图有什么意义?例如,为什么不使用:reducer = (accum, x) => accum + (x + 2)
?
或者将mapper和reducer分开:
mapper = (x) => x + 2
reducer = (accum, y) => accum + y
所以:
// x y
// 0 2
// 1 3
[0, 1].map(mapper).reduce(reducer, 0) // result == 5
在Hadoop这样的“大数据技术”中是否存在示例,其中将所有功能移入减速器是不合需要的/会因为使用单独的映射器而避免一些损失。
我可以想到在reducer
中实际需要知道初始值的例子;使用“纯映射”mapper
函数是不可能的,或者至少是无意义的,因为你必须映射到包含初始值的值,例如:从mapper
开始,返回包含初始值的元组,以便reducer
可以访问它:
mapper = (x) => [x, lookupValue1[x] * lookupValue2[x]]
reducer = (accum, y) => { accum[y[0]] = y[1]; return accum; }
// x y
// 'alex' ['alex', -41]
// 'chris' ['chris', 102]
['alex', 'chris'].map(mapper).reduce(reducer, {})
// result = { 'alex': -41, 'chris': 102 }
答案 0 :(得分:1)
将MapReduce
视为有效处理“合适”数据的设计模式。通过这个,我的意思是说两件事:
1)MapReduce不是处理所有“类型”数据的有效方式。可以有某种类型的数据和处理步骤;它可以利用HDFS
和分布式处理。 MapReduce
只是该联盟中最适合某种算法的工具。
2)并非所有算法都适用于mapreduce
。因为它的设计模式,它最适合某些符合某种设计的算法。这就是为什么mapreduce
核心库允许您跳过mapper
(使用标识映射)或reducer
(仅通过将reducer的数量设置为零)的原因。根据您的需要,您可以跳过mapreduce
的另一个阶段。
如果您了解map-combine - sort + shuffle - reduce
的工作原理,请将这两点放在中心位置;它可以帮助您实现比使用任何其他工具更有效的算法。同时,如果您的数据和算法确实不适合mapreduce,那么最终可能会导致效率极低的mapreduce
程序。
如果您希望在mapreduce
中研究映射器的重要性,请研究wordcount
程序示例(与mapreduce
捆绑在一起)。尝试使用/不使用mapper
(或reducer
或mapreduce
完成)并对性能进行基准测试。我希望你能找到答案。
答案 1 :(得分:0)
在充分尊重的情况下,我建议你从MR的基础知识开始,而不是得出结论。
请点击以下链接。 https://www
Just to provide some pointers.
1. Reducer canot read directly from HDFS, it has to read data from Mappers.
2. One has to minimise data trasfer from Mapper to reducer hence choice of combiner.
3. Less data sent from mapper to reducer, faster is the job, so we try to filter as early as possible.
4. The chances that all the keys will be read by the same mapper are very low, hence to reduce data needs to be sent to the reducer.
5. Alway imagine of a 1 TB file with key1 occuring twice and located at the beginning of the file and end of file. Apply all your logics for this and will realize what MR, spark is all about.