MapReduce映射

时间:2018-03-15 00:15:36

标签: java mapreduce

我正在学习MapReduce框架,并且有相同的以下问题:

  1. MapReduce范例基本上有map()reduce()(以及其他一些范例)。是否可以将所有编程逻辑有效地表示为map()reduce()

    例如,假设我想要对树进行有序遍历。此任务是否可以有效地划分为map()reduce()任务?如果有,怎么样?如果不是,那么如何利用MapReduce框架完成此任务?

  2. 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;
            }
        }
    }
    
    1. 我们是否只有map()没有相应的reduce(),反之亦然?

    2. 根据thisthisreduce()函数生成最终输出 - 是否必须仅生成单个值?

    3. 您如何确定某项任务是否属于map()reduce()的一部分?

    4. 关于如何map - ify和reduc - 如果给定任务的任何一般性指示?

1 个答案:

答案 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编写)。