我正在学习MapReduce框架,并对此有以下问题:
map()和reduce() (以及其他几个)。所有编程逻辑能否有效地表示为map()或reduce()?
例如,假设我想对一棵树进行有序遍历.这个任务能否有效地划分为一个map()和reduce()任务?如果是,怎么做?如果不是,那么我如何利用MapReduce框架来完成这个任务?有序遍历通用代码
// Iterative solution
public void inOrderIter(TreeNode root) {
if(root == null)
return;
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode currentNode=root;
while(!s.empty() || currentNode!=null){
if(currentNode!=null)
{
s.push(currentNode);
currentNode=currentNode.left;
}
else
{
TreeNode n=s.pop();
System.out.printf("%d ",n.data);
currentNode=n.right;
}
}
}发布于 2018-03-15 17:40:57
要回答您的问题:
MapReduce范式本质上有
map()和reduce()(以及其他几个)。所有编程逻辑能否有效地表示为map()或reduce()?
MapReduce是一种设计模式,因此只适用于那些适用于BigData上下文的问题案例。虽然您可能能够通过一个涉及一系列映射缩减的算法来解决问题,但它可能不是执行参数(所需资源和时间)中最有效的代码。同时,传统的算法可能根本无法工作(仅仅是因为您有太多的数据),而mapreduce可能会有所帮助。
我们能否只有一个
map()而没有相应的reduce(),反之亦然?
在Java中,您可能拥有没有减少阶段的mapreduce,但反之亦然。不过,您可以选择使用默认的IdentityMapper。
根据这个和这个,减()函数生成最终的输出-它是否需要只生成一个值?
不,您可以通过context.write()方法从映射器/还原器中写入尽可能多的值,只要您遵守每个API的输出类型。
您如何决定某个任务应该是
map()还是reduce()的一部分?
地图约简中解决的大部分问题属于聚合,将两个数据集连接在一起,并通过某种下移的数据推导出结果。如果您理解mapreduce中的概念和处理步骤,您应该能够决定用map()和/或reduce()编写什么。
对于如何映射和还原给定的任务,有什么一般性的建议吗?
再说一次,这取决于你想要实现什么。一般来说,map()是关于读取数据集,过滤它们(如果可能有不想要的记录,或者记录的一部分),并决定所有的数据需要用一个键组合在一起。Reducer是针对一个键(由mapper编写)处理数据的收集。
https://stackoverflow.com/questions/49289624
复制相似问题