MapReduce笔记

123 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

  • Hadoop的三大组件:HDFS、MapReduce、Yarn。
  • MapReduce是一个分布式计算框架,底层依赖HDFS分布式存储框架。
  • MapReduce的主要思想:分而治之、先分再和。
  • 分布式计算:与之对应 的是集中式计算。我们传统的计算方式会将所有数据一起读过来进行统一计算,这就是集中式计算。但是当数据量特别大时,再使用集中式计算就会遇到瓶颈,素以我们使用分布式计算,将数据计算任务拆分成各个小的任务,并将这些小任务分别放在不同的节点上去执行,这样就可以提高计算效率。
  • 数据文件存储在HDFS上时,会被物理上地切分成数据块进行存储;而在MapReduce端进行处理时会对数据进行逻辑上地切片,默认情况下,HDFS上数据块的大小与MapReduce端数据片的大小一致(128M)(假设文件一test.txt大小为300M,文件二test2.txt大小为200M,那么文件一按照128M来切片,就会分成3个切片,没有占满128M的分片那么它自身是多大,分片就为多大;文件二按照128M切片,就会分成2个切片,所以这两个文件就需要5个mapTask来处理);每个数据片对应一个map来实现并行计算,也即MapReduce端map的并行度是由切片的大小/数量来决定的;一个节点可以运行多个map。
  • map阶段是从HDFS上读取数据文件,但经过map计算处理后会把结果文件存放在map所在服务器的本地文件系统中。
  • 各个map之间是并行关系,各个reduce之间是并行关系,但map与reduce之间是串行关系,只有当所有map都执行完程序之后吗,才会执行reduce。
  • MapReduce中的map可以按行读取数据,也可以按照xml中的开闭合标签读取数据,或者可以自定义读取方式。
  • map处理后的数据不会每条都直接写入磁盘中,为避免IO消耗,会先将每条处理结果先缓存在内存缓冲区中;缓存的数据会被周期性地写入磁盘中(溢写),这些缓存数据在本地磁盘中的位置会被传给主节点,然后主节点会将该位置告知给reduce,然后reduce通过RPC协议去map所在节点上拉取map的执行结果文件,reduce拉取过来的数据也是会先放在reduce端的内存中,然后再合并写入磁盘;注意这里是reduce主动去map节点上拉取数据,而不是被动接收map发过来的数据。
  • MapReduce中的shuffle阶段分为map端的shuffle和reduce端的shuffle。
  • 每个map产生的结果文件都是按照key进行升序排列的文件。
  • map与reduce之间的信息关联是通过主节点来实现的,主节点中会保存map和reduce各个节点任务执行的状态以及map执行结果的文件位置和大小。
  • MapReduce的优点:易于编程、良好的扩展性、高容错性、适合海量数据的离线处理。
  • MapReduce的缺点:实时计算性能差(主要用于离线计算,无法实现秒级的响应)、不能进行流式计算(只能针对静态数据进行离线计算,不能对动态数据进行流式计算)。
  • 如果想要实现实时计算,可以考虑spark、flink等。
  • 一个MapReduce程序运行时,整个分布式集群中会产生三类进程(三类进程,但不是三个进程):
  1. MRAppMaster:主要负责整个MapReduce程序的过程调度及状态协调,一个MapReduce程序只有一个该进程。
  2. MapTask:主要负责MapReduce程序中map阶段的数据处理流程,一个MapReduce程序可以有多个该进程,这取决于该业务程序中需要多大的map并发数。
  3. ReduceTask:主要负责MapReduce程序中reduce阶段的数据处理流程,一个MapReduce程序可以有多个该进程,这取决于该业务程序中需要多大的reduce并发数。
  • 一个MapReduce程序中,只能有一个map阶段和一个reduce阶段,或者可以没有reduce阶段;但不可以有多个map或者多个reduce阶段。如果业务逻辑复杂,需要多次计算处理才能实现业务功能的,就需要写多个MapReduce程序串行实现各个MapReduce程序中的单一map程序和reduce程序。