Hadoop大数据架构技术研究
来源:用户上传
作者:
摘 要 Hadoop是由Apache基金会开发的分布式计算架构,用户可以在不了解分布式底层细节的情况下开发分布式程序,充分利用集群的威力进行高速运算和存储。Hadoop框架最核心的设计就是:HDFS和MapReduce,HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
关键词 大数据;Hadoop;HDFS;MapReduce
引言
Hadoop是一个能够对大量数据进行分布式处理的框架,它有可靠、高效、可扩展等特性。可靠是因为它假设计算和存储元素可能失败,通过维护多个工作数据副本,确保能够对失败节点重新进行分布处理。高效是因为它以并行的方式工作,通过并行处理加快处理速度、提高吞吐量。通过灵活的横向扩展能够处理 PB 级数据。
1 Hadoop技术架构研究
HDFS和MapReduce是Hadoop的两大核心。HDFS被设计成适合运行在通用硬件上的分布式文件系统,是一个高度容错性的系统,能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。把一个文件存入HDFS,HDFS会把文件分割成多个block,分散存储在N台linux机器上,每台存储数据的机器称为datanode,每一个block会在多个datanode上存储多份副本,默认是3份。一旦文件被切块存储, HDFS中就必须有一个机制,来记录用户的每一个文件的切块信息,及每一块的具体存储机器,namenode负责管理文件目录、文件和block的对应关系,以及block和datanode的对应关系。
MapReduce被用于大规模集群计算,每个MapReduce作业主要包含input split、map task、combiner、shuffle和reduce task共5个阶段。在进行map计算之前,MapReduce会把输入的数据切分为若干块,划分切片的任务由job客户端负责,每个输入分片对应一个map任务。Map task阶段会调用相应对象的next()方法,逐行读取文件,产生key-value值,解析出key-value值后调用定制编写的业务逻辑代码,计算输出新的key-value值后缓存,待后续处理。
Combiner阶段是可选的,它是map运算的后续操作,主要是在map计算出中间文件前做合并重复key值的操作。例如对文件里的单词频率做统计,map计算时碰到一个”hadoop”的单词就会记录为1,但是这篇文章里”hadoop”可能出现多次,那么map输出文件就会冗余,因此在reduce計算前对相同的key做合并操作,文件会变小,可有效提高宽带传输效率。但是,combiner操作是有风险的,求总数、最大值、最小值可以使用combiner,如果做平均值计算使用combiner,最终reduce计算结果就会出错。
将map task生成的数据传输给reduce task的过程就是shuffle,一般MapReduce计算的都是海量数据,内存空间有限,map输出时不可能把所有文件都放到内存,因此map过程涉及将数据写入磁盘。map输出时会在内存开启环形缓冲区,默认大小是100MB,配置文件里默认设定为了缓冲区阀值是0.8。map会为输出操作启动一个守护线程(Spiller),若缓冲区内存使用达到了80%,这个守护线程就会把内容写到磁盘,这个过程叫spill。另外20%内存可以继续写入数据,写入磁盘和写入内存操作互不干扰,如果缓存满了,那么map作业会阻塞写入内存的操作,让写入磁盘操作完成后再继续执行写入内存操作。map task在写入磁盘前还会执行分区和排序操作,如果我们定义了combiner函数,那么排序前还会执行combiner操作。分区会调用Partitioner的组件,排序则会调用key上的CompareTo()来比大小。每次spill操作时就会写一个文件,这个文件叫溢出文件,溢出文件里区号小的在前面,同区中按key有序。map输出全部做完后,map会合并这些输出文件,这些文件也是分区且有序的。合并过程中会产生一个分区索引文件,用来指明每个分区的起始点以及它的偏移量。Partitioner操作和map阶段的输入分片很像,一个Partitioner对应一个reduce作业。Partitioner就是reduce的输入分片,这个可以编程控制,主要是根据实际业务场景,达到更好的reduce负载均衡,这是提高reduce效率的关键。
map task阶段完成后,程序就会退出,那么reduce task要去哪里获取处理完的数据呢?答案是这些文件会被纳入NodeManager web程序的document目录中,reduce task会通过web服务器下载相应区号的文件,将这些文件合并。处理数据时,首先实现继承自Reducer的类,里面有一个reduce(k,迭代器,context)方法,通过反射构造出一个对象去调用reduce(),里面的参数k和迭代器会分别去创建一个对象,每迭代一次就会按文件里的顺序去读一次,然后把读出来的k传给对象k,然后把v传给对象values里。这个过程就是从磁盘上把二进制数据读取出来,然后反序列化把数据填入对象的一个过程。迭代过程中会有一个分组比较器(Grouping Comparator)去判断迭代的k是否相同,不同则终止迭代。每迭代完一次,context.write()输出一次聚合后的结果,这个聚合的结果会通过TextOutputFormat类的getRecordWriter()方法拿到一个RecordWriter对象,通过这个对象去调一个write(k,v)方法,将这些数据以文件的方式写入HDFS[1]。
2 结束语
Hadoop提供了一套久经考验的批处理模型,适合处理对时间要求不高的大规模数据集。通过低成本组件即可搭建完整功能的Hadoop集群,使得这一廉价且高效的处理技术可以灵活应用在很多案例中。
参考文献
[1] 张伟.基于Hadoop的大数据分析管理平台架构设计[J].信息技术与网络安全,2018,37(11):30-33,57.
转载注明来源:https://www.xzbu.com/1/view-14901384.htm