zoukankan      html  css  js  c++  java
  • MapReduce浅析

        很早之前就用过Hadoop,但对MapReduce中的具体数据流向过程一直不甚明了,用Python Streamming的方式写了几个MapReduce,对这个过程有了一定的认识。

       首先我们知道,MapReduce的输入数据以Block的形式存储在HDFS上,默认是以64MB的大小存放在DataNode上,之所以取这个这么大的值而非磁盘块大小是因为通过这种方式减少磁盘寻道时间所占比例。数据的元信息存储在NameNode上,但这里明显有一个单点问题,如果NameNode出现故障,我们就不知道数据具体存放在哪个DataNode上,为了避免这种问题的出现,我们可以在NameNode上mount一个NFS,同样的,DataNode也可能会出现故障,所以HDFS会为每个存储在其中的Block复制n份(默认为3份)。

       HDFS屏蔽了内部这些复杂的数据复制,高可用等逻辑,对外提供给我们一个类似于Linux的简单API,操作HDFS时只需要在命令前加上hadoop fs,例如:

       hadooop fs -put 可以将本地文件上传到HDFS

       hadoop fs -tail 经常用于监控日志

       hadoop fs -cat 可以输出文件

       hadoop fs -text类似cat,但可以输出gzip压缩后的文件

      .....

     MapReduce

        在没有MapReduce的情况下,我们会怎么处理大量数据呢?例如数据统计这种任务,很可能我们会选择HashMap,Trie这种数据结构(面试中经常会需要回答海量数据的算法问题,但实际生产环境通常会首选Hadoop来处理的),但一方面单机单个进程处理速度有限,另一方面,数据量过大很可能会OOM。

        MapReduce直观上很好理解,比如我有很多扑克牌,想统计所有牌中四种花色分别有多少张,如果所有牌全部交给一个人来统计的话肯定会很慢,那么我们交给几个小伙伴,让他们并行地统计,最后将结果汇总一下即可,这就是Hadoop的核心过程:分而治之->规约

        分治的思想在计算机科学中十分常见,例如二分法等。实际上,如果你熟悉一些有函数式编程思想的语言,如Python,JavaScript的话(当然,如果学过Lisp更好了),相比已经对MapReduce过程有所了解,这里我以Python为例:

    #实例来自廖雪峰的官方网站
    >>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]

         上面的例子中首先定义一个函数f,再将该函数与一个list传入map函数中,这样f会作用到每个list中。

        Hadoop 中的MapReduce与之类似,可以分为两步,Map过程可以将输入的键值对(k,v)映射成一个新的键值对(k1,v1),这之后,框架会对数据做shuffle, sort, partition, combine等操作。接下来Map的输出会作为Reduce的输入。

       

       作为用户来讲,我们通常只需要实现其中的map和reduce这两个函数,其它步骤MapReduce框架已经实现好了,我们可以认为MapReduce在运行的过程当中会回调我们的方法,这里利用到了设计模式中的模板方法模式。

      

  • 相关阅读:
    【转】BFT类共识协议概览与分析实测
    谈谈架构设计的八条原则
    Python爬虫入门教程 61-100 写个爬虫碰到反爬了,动手破坏它!
    Python如何实现单步调试
    Python如何实现单步调试
    Flash调用Alchemy编译的代码时出现Error #1506的解决
    Flash调用Alchemy编译的代码时出现Error #1506的解决
    Flash调用Alchemy编译的代码时出现Error #1506的解决
    Flash调用Alchemy编译的代码时出现Error #1506的解决
    showModalDialog使用讲解
  • 原文地址:https://www.cnblogs.com/showing/p/6910778.html
Copyright © 2011-2022 走看看