Hadoop1.0学习笔记之基础

来源:互联网 发布:秋冬需要防晒 知乎 编辑:程序博客网 时间:2024/06/05 08:27

1.Hadoop历史

       Google作为一个注重创新的公司,总是能在技术上带来欣喜。谷歌为了解决本身搜索引擎的搜索效率,开发两种技术,一个就是GFS(The Google File System)和Mapreduce,分别解决了分布式存储海量数据和分布式处理大规模数据的难题,之后Google发表关于两项技术的论文。在这两篇论文的引诱下,Doug Cutting选择吞下这美味的果实,用JAVA重现了GFS也就是我们常说的HDFS以及Mapreduce,天哪,Hadoop就这样诞生了。

也就是说Hadoop是一种分布式的开源框架,有着非凡的分布式存储跟处理能力,它可以用于搜索引擎、大数据存储、大数据处理、科学研究等方面,可见用途非常广泛。

2.Hadoop核心HDFS

       HDFS(Hadoop Distributed File System)分布式文件系统,有两个重要的角色,NameNode和DataNode。首先让我们来看下Hadoop的物理部署(图2-1),不难发现Hadoop目前是基于Linux的,虽然Hadoop可以在windows搭建,但是最后也是需要模拟Linux内核。接着JVM这个很好理解,因为Hadoop是基于Java实现的,就少不了强大的Java虚拟机。然后就发现了我们HDFS的两个主角,Namenode和Datanode。


图2-1

        图2-2给出了一个基本的Hadoop的集群方式,这种集群方式是已局域网构建。这个集群是由一个NameNode(基于Hadoop1.0,Hadoop2.0已经可以有多个NameNode)的主节点,和有着多个DataNode的从节点构成,而对于JobTracker跟TaskTracker针对Mapreduce设计的(用户将作业提交给JobTracker,然后将Job分为多个Task,就近分配给空闲的TaskTracker)。

       那么就要想这个主从结构是如何正常做到对话的?

       对于传统的文件系统,无非存在着读、写、删除、复制、移动等操作。在Linux系统中,有一种索引文件表,这种表存着有关文件的元数据,所谓元数据就是文件的存储的物理位置、文件大小等信息,这样就可以更加轻松的管理文件。Linux中有一个inode指针指向文件的物理位置,通过操作inode达到操作文件的目的。而HDFS作为分布式文件系统,当然也少不了基本文件的操作。再说NameNode之前,有必要先说明DataNode的作用,DataNode是实际存储文件的位置。这里并不是简单的存储,而是将文件切成多个block(默认是64m)本地形式存储在磁盘上,为了保证文件的安全,每个文件有多个副本(冷备份)。好了是时候说说NameNode了。NameNode其实存储的是文件(数据)的元数据,也就是block跟文件之间,block跟DataNode、还有文件目录的映射关系,毕竟访问文件之前你滴知道它在哪。


图2-2

       说了这么多,那假如我们想要访问HDFS中文件,又经历了什么?

       1)首先从NameNode获取组成这个文件的数据块的位置列表

       2)根据位置列表知道存储数据块的DataNode

       3)最后访问DataNode获取数据

       咦,不可思议,这里NameNode并没有参加实际的文件传输过程,真正的数据流交互发生在是客户端之间DataNode之间。但真正决定将数据丢到那个DataNode由NameNode决定

      可能又要问了,加入DataNode所在的磁盘挂了怎么办啊?真是的哪来这么多问题啊。Hadoop采用的是Java  RPC(远程方法调用)来看DN是否正常。这里涉及到Hadoop的心跳机制:

      1)集群启动,DataNode向NameNode注册

      2)每3秒DataNode向NameNode发送一次心跳,如果没有发送,认为不正常

      3)NameNode接收到心跳,返回文件操作命令,超过10分钟不返回心跳,认为不正常

      4)NameNode向正常的DataNode发送命令,复制不正常的DN的block一份

      总结:



3.Hadoop核心Mapreduce

       在说Mapreduce之前首先要介绍一下倒排索引:

我们之前所熟悉的正排索引是将文档的Id作为索引值,记录每个字出现在文档的位置,在搜索时扫描文档寻找我们所要的词。这种方法在文档集合相当大时候存在很大效率问题。


图3-1正排索引

倒排以字或词为索引,记录字词出现在文档的位置跟文档的ID。想想对于英语而言所有的单词的总数目前是一定,也就说索引表的大小的最大值是一定的,这是非常关键的。但是维护整张索引表的过程却是复杂的。


图3-2倒排索引

       为了解决倒排索引构建表的速度,Google提出了一种解决方案就是Mapreduce。Mapreduce思想的关键在于Map和Reduce两个过程。
       1)map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。

       2)reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。



图3-3Mapreduce的过程

       假设有字符串string tag = 'abcabc'

       Map: {a:1, b:1, c:1, a:1, b:1, c:1}

      Reduce: {a:{1, 1,}, b:{1, 1}, c:{1, 1}}


图3-4

      在Hadoop中Map过程需要进行排序分组形成多个partition,如图3-4,然后通过RPC远程调用copy到reduce中,group合并排序,然后输出到文件中。在网络传输中,因为提高效率,就要使用序列化和反序列化,即序列化是将内存中的对象以流的方式传输。

      总结:

    

4.参考文献

[1][Hadoop] Hadoop学习笔记之Hadoop基础

[2] 正排索引和倒排索引
[3]用通俗易懂的大白话讲解Map/Reduce原理



0 0
原创粉丝点击