毕业设计是跟着导师做 hadoop mapreduce 计算框架的C++扩展技术研究,虽然之前听说过hadoop这个开源框架,据说它在大数据、云计算方面有很大的用处。就开始学习这个框架的基础知识,下面是我看了一些资料后的个人总结:
首先,hadoop是一种开源的分布式系统的软件框架,它的核心内容是HDFS(hadoop Distributed File System)+MapReduce(映射化简数据处理)。这个框架可以在将一个串行的作业分解成多个独立的map和reduce任务,然后通过任务调度器master将这些独立的任务分配给计算机集群中负载较低的结点(类似于计算机网络中的负载均衡),这些结点可以并行处理这些任务,最好这些任务处理的中间结果可以合并得到最终的结果,这样可以提供高效的系统。同时计算机集群中的结点可以方便的扩展;当一个结点出现故障时,框架本身可以立刻找到替代的结点处理任务,具有高可靠性和容错性。
待补充:
HDFS:
MapReduce:
图片转载自:http://www.aboutyun.com/forum.php?mod=viewthread&tid=5541&highlight=hadoop
对于一个输入,通过map、reduce操作,得到一个输出。一个输入被划分为M个分片,每个分片存储在底层分布式,由master将M个map任务分配给集群内的若干主机,同时告知主机这个任务对应的分片位置。这个map操作是从分片中提取键值对(k,v),相当于把一个复杂的分片给细化,map操作之后,hadoop框架开启一些线程自动将map操作输出的(k,v)shufter(搬移)到R个分区中的某个对应分区(一种搬移映射方法是取k的hashcode%R)。这样有相同k的键值对被搬移到同一个分区中,然后框架开启一些线程自动将每个分区的键值对按照k来排序,这样具有相同k的键值对就聚集到了一起,这样很方便就得到了与某个k关联的一组v,即(k,list(v1、v2、v3))。然后对于每个k以及这个k相关的v集合传递给reduce来处理。由master将R个reduce任务分配给集群内的若干主机,reduce则对于每个传递进来的k以及这个k相关的v集合做一个合并,最终输出一个键值对(k,v)。
应用举例:
要找到一个2G的超大文件中出现的IP次数最高的那个IP,文件中每行记录一个ip地址、日期、来源城市这些信息。首先这个输入是一个超大文件,将这个超大文件分片后存储到分布式系统中,每个map任务负责提取对应分片中的每个ip token,并构建(ip,1)这个键值对(1代表IP出现一次), hadoop框架的多线程通过某种映射将这些键值对搬移到到100个分区中(映射函数比如为IP%100),这样的话相同的IP地址肯定是映射到了同一个分区,hadoop框架的多线程对每个分区进行排序,使得相同ip的键值对聚集到一起,从而得到(k,list(v)), 最后通过每个reduce任务对对应分区统计每个IP出现的次数(合并简化),分别得到最大值,最好再取这100个最大值中的最大值。
总结:每个分页对于一个map任务,每个分区对应一个reduce任务,map任务数不一定等于集群内分配的map主机数,reduce任务数不一定等于集群内分配的reduce主机数;每个map任务或者reduce任务可以在分配的多个主机结点上同时进行,这样大大提高了计算效率。