【大数据】MapReduce

MapReduce

一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。

MapReduce核心功能

将用户编写的业务逻辑代码自带默认组件整合一个完整的分布式运算程序(整合代码,变成一个适合跑在分布式上的的程序),并运行在一个Hadoop集群上。

MapReduce优点

  • MapReduce易于编程:它简单的实现了一些接口就可以完成一个分布式程序,这个分布式程序可以分布到大量的廉价pc机器上运行。也就是说,写一个分布式程序,跟写一个简单的串行程序是一模一样的
  • MapReduce有良好的扩展性:计算资源得不到满足后,可以通过简单的增加机器来扩展他的计算能力,通过副本的机制,提高可靠性。
  • 高容错性:比如其中一台机器挂了,可以把上面的计算任务转移到另外一个节点上,不至于任务失败,且这个过程是自动的
  • 适合PB级别以上的海量离线数据处理:实现上千台集群并发操作。

MapReduce缺点

  • MapReduce无法像mysql一样实现毫秒或秒级内返回结果。
  • 不擅长流式计算,MapReduce输入的数据集是静态的。
  • 不擅长DAG计算

MapReduce核心编程思想:

map task——>就是拆分文件,对每行输入,输出的每行进行拆分,hello word ,拆分成key value 的形式,交给ruduce进程进一步处理。

reduce task——>就是对map结果进行统计。


map的输入也是key1 value1 的形式key1是偏移量,value1是每行的内容。

偏移量:

hello word

hello nihao

0 1 2 3 4 5 6 7

map(0,“hello word”)

map(12,“hello nihao”)

//空格算一个,换行不计

map的输出value2一个元素,value3是一个集合迭代器,是value2的集合

reduce(hello,(1,1,1,1)) //map的输出作为reduce的输入,将相同key放在一起作为一个集合

用Hadoop中数据类型的原因:

student{
string name;
string age;
string set;
}              java封装后通过网络传输——————————>100kb
               hadoop类型已经实现了序列化传输——————————>10kb


序列化

是把内存中的对象,转化成字节序列(或其他数据传输协议)以便用于存储到磁盘(持久化)和网络传输,反序列化反之。

hsdoop序列化特点:

  • 紧凑高效使用存储空间。  上面例子中只传输 (name,age,sex)
  • 快速,读写数据的额外开发小。
  • 可扩展,随着通信协议的升级而升级
  • 支持多语言的交互,r,scala,c++

 

MapReduce详细工作流程:

shuffer机制:

map方法之后,reduce方法之前的数据处理过程称为shuffle

环形缓冲区:没有头没有尾,到80%开始溢出

shuffle过程只是从第7步到16步

  1. maptask收集我们的map()方法输出的kv对,放到内存缓冲区中。
  2. 从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件。
  3. 多个溢出文件会被合并成大的溢出文件
  4. 在溢出过程及合并过程中,都要调用partitioner进行分区和针对key进行排序。
  5. reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据。
  6. reducetask会取到同一个分区的来自不同maptask的结果文件。reducetask会将这些文件进行合并(归并排序)。
  7. 合并成大文件侯,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个键值对Group调用用户自定义的reduce方法。

shuffle小结:

缓冲区大小会影响到mapreduce的执行效率:原则上说缓冲区越大磁盘io次数越少,执行的速度就越快。

 

 

 

 

猜你喜欢

转载自blog.csdn.net/Qmilumilu/article/details/104650793
今日推荐