我正在学习MapReduce框架,并且有相同的以下问题:
MapReduce范例基本上有map()
和reduce()
(以及其他一些范例)。是否可以将所有编程逻辑有效地表示为map()
或reduce()
?
例如,假设我想要对树进行有序遍历。此任务是否可以有效地划分为map()
和reduce()
任务?如果有,怎么样?如果不是,那么如何利用MapReduce
框架完成此任务?
in-order traversal的通用代码:
// 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;
}
}
}
答案 0 :(得分:0)
回答您的疑问:
MapReduce范例基本上有
map()
和reduce()
(以及一些 其他人)。所有的编程逻辑都可以有效 表示为map()
或reduce()
?
MapReduce
是一种设计模式,因此仅适用于适合BigData上下文的那些问题情况。虽然您可以通过涉及一系列map-reduce的算法来解决问题,但它可能不是执行参数中最有效的代码(所需的资源和时间)。同时,传统的算法可能根本不起作用(仅仅因为你有太大的数据);虽然mapreduce
可能有帮助。
我们是否只有
map()
而没有相应的reduce()
和副作品 反之亦然?
在Java API中,您可能mapreduce
没有减少阶段,但反之亦然。虽然,您可以选择使用默认IdentityMapper
。
就此而言,reduce()函数会生成最终输出 - 是否有必要只生成一个值?
不,您可以通过context.write()
方法从mapper / reducer中写出尽可能多的值,只要您按照API遵循输出类型。
您如何确定某项任务是否属于
map()
或{}的一部分reduce()
?
map reduce中解决的大部分问题属于聚合,加入两个数据集,以及某种漏斗数据来推断结果。如果您了解mapreduce
中的概念和处理步骤,您应该能够决定在map()
和/或reduce()
中撰写哪些内容。
关于如何map-ify和reduc-ify给定任务的任何一般指示?
这又取决于你想要达到的目标。一般来说,map()
是关于读取数据集,过滤它们(如果可能存在不需要的记录或部分记录),并决定所有数据需要针对单个键共同处理的内容。 Reducer是关于处理密钥的数据集合(由mapper编写)。