hadoop初学

来源:互联网 发布:otc焊接机器人编程ppt 编辑:程序博客网 时间:2024/05/21 19:02

hadoop是一个分布式计算和存储的框架,是解决大数据量问题的利器。刚接触这个领域时需要有一个起码的认识,后面才能进行深入的开发。这里不做条条框框的介绍,只是从直观理解上说明。

无论是hdfs(分布式文件系统)还是mapreduce架构,其思想都是“分治并行”。“分治”一词来自算法中的分治算法,含义是将一个复杂的、庞大的问题分解成独立的、规模较小的子问题,每个子问题分别求解,最终把中间结果合并成最终结果。在整个“分治”过程中,子问题都是“并行”执行的,这样一个庞大的问题就被“拆分并行”,提高了解决问题的效率。

hadoop分布式系统是一个磁盘密集和IO密集的架构。包括分布式磁盘操作和计算操作,都十分密切的依赖于磁盘读取和网络传输。又因为主要思想是分治法,所以计算和存储都是把同一份数据分布到多个节点中,每次访问都会从多个节点并行的访问。

先说hdfs,也就是分布式文件系统。

hdfs中关键的一个概念是NameNode。它是在hdfs中存储文件路径和大小等基础信息的节点。当我们(client)要访问hdfs时,首先会查询NameNode,找到目标数据对应的节点信息后,从多个节点读取数据(IO密集型操作),再通过网络(网络密集型操作)将数据返回给我们。

hdfs,包括mapreduce框架在内,都是一个主从结构。这里的“主人”(master)就是NameNode节点,它管理着所有的数据,也知道所有数据的基本信息,每次访问都由它发起。同时它还负责着基础工作,例如数据完整性保证(为了防止磁盘故障等原因导致的数据丢失)。

再说mapreduce,也就是分布式计算框架。这里的概念较多,为了从宏观上理解mapreduce,具体的一些名词见参考文献。

mapreduce不是一个词,而是map+reduce。这里又要提到分治法,举个简单的分治法的例子,例如我要求一个10维int数组的最大数,可以在index 0~4中找到最大的,同时也在index 5~9中找到最大的,然后在这两个最大数中间选择更大的作为最终结果。整个过程就是分而治之,把一个大问题转换成小问题,最终在合成大问题的结果。这和mapreduce的思想是一样的。这个过程中,把数组分成0~4和5~9对应的是map,最终在两个数中找到更大的对应的是reduce。

下面给一个mapreduce的例子,数日志中某个字段的出现次数。例如有1T的日志,日志格式是 A B C,即,A,B,C用空格连接起来的字符串,其中B有三种取值:1、2和3。目标是通过mapreduce分别统计B字段中1、2、3的出现次数。

首先,将整个文件划分成若干个子文件,例如每个子文件128MB。

其次,对于每个子文件进行map过程。每读一条日志,产生一系列的键值对,<B, 1>。这样一来,有多少日志就会产生多少键值对。每一份128MB的数据会产生一个临时文件,里面存的是键值对。

一份中间文件X例如:

    • 2 1
    • 1 1
    • 2 1
    • 3 1

另一份中间文件Y例如:

    • 3 1
    • 2 1
    • 3 1
    • 1 1

最后进行reduce过程:

1. 对每一个临时文件按照key进行排序,例如上面的X中间文件和Y中间文件,会得到:

X:

    • 1 1
    • 2 1
    • 2 1
    • 3 1

Y:

    • 1 1
    • 2 1
    • 3 1
    • 3 1

2. 对每个临时文件进行处理:将相同key的value进行合并(这里就是对value进行相加),得到:

X:

    • 1 1
    • 2 2
    • 3 1

Y:

    • 1 1
    • 2 1
    • 3 2


3. 对多个临时文件进行归并,相同的key对应的value相加,得到所有全局数据中key对应的数量。如果只有上面的X和Y两个临时文件的话,最终得到结果:

  • 1 2
  • 2 3
  • 3 3

通过上述方式,最终会得到这1TB数据中,B字段1、2、3分别对应的频次。整个过程就是分治法的过程,将大文件分成小文件,处理,最后将结果合并。


-------------------------------------------以下是一些概念点

关于hdfs和mapreduce的内容,首先要弄清楚以下几个概念:
hdfs:
  1. NameNode:存储所有数据的节点,包括数据的路径和大小等基本信息。
  2. DataNode:实际存储数据的节点。
  3. 存取过程:分治法,分成多份存取,多个节点(机器)并行处理。
mapreduce:
  1. jobtracker:相当于hdfs中的NameNode,负责整个作业的调度
  2. tasktracker:一个大的任务被分解成n个小任务,每个小人物对应一个tasktracker去处理。
  3. slot:在tasktracker看来,一个任务的执行是需要slot这个资源的,如cpu和内存。只有有空闲的slot的时候才能执行。
参考文献:
hdfs简单介绍见:http://blog.csdn.net/dbanote/article/details/9055569
mapreduce简单介绍见:http://blog.csdn.net/dbanote/article/details/9056129

0 0
原创粉丝点击