Hadoop是什么?能做什么?
随着我们网络的发达,科技的发达,我们网络上产生的数据越来越多,越来越大,那么大到什么地步,有10000G那么大吗?告诉你比那个大多了!那有1000T那么大吗?比那个也大多了,已经是单一的服务器解决不了的,那么我们不是可以多用几台服务器就解决了?一台一台服务器分别写入和读取数据是很麻烦的。
接着分布式文件系统就应运而生了,它可以管辖很多服务器用来存储数据,通过这个文件系统存储数据时,我们就感觉在操作一台服务器一样。分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异给屏蔽了,我们的数据分布在不同的服务器中,分布在不同节点上的数据可能是属于同一个文件,为了组织众多的文件,把文件放到不同的文件夹中,文件夹可以一级一级的包含。这种组织形式称为命名空间(namespace)。命名空间管理着集群中的所有文件。命名空间的职责和正真存储真实数据的职责是不一样的。负责命名空间职责的节点称为主节点(master node),负责存储真实数据的职责的单称为从节点(slave node)。主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,我们把这样的结构称为主从式结构(master-slave)。用户操作时也应该先和主节点打交道,查询数据在哪些从节点上存储,然后才从从节点存储,然后再从从节点读取。在主节点中,为了加快用户的访问速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。在从节点存储数据时,有的原始数据可能很大,有的可能很小,如果大小不一样的文件不容易管理,那么抽象出一个独立的存储文件单位,称为:块(block)。然后数据存放在集群中,可能网络原因或者服务器硬件原因造成访问失败,所以又才用了副本机制(replication),把数据同时备份到多台服务器中,这样数据就更安全了。
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据读取到内存中进行处理,比如数据大小是100T,我们要统计文件中一共有多少个单词。要想到文件加载到内存中几乎是不可能的,要想把数据加载到内存中几乎也是不可能的。随着技术发展,即使服务器有100T内存,这样的服务器也很昂贵,即使数据能够加载到内容,那么加载100T也是需要很长时间的。那么这就是我们遇到的问题,那么我们怎么处理呢?是否可以把程序代码放到存放数据的服务器上呢?(移动计算)因为程序代码相对于原始数据来说很小,几乎是可以忽略不计的,所以省下了原始数据的传输的时间。现在数据是存放在分布式的文件系统中,100T的数据可能存放在很多服务器上,那么就可以把代码分发到这些服务器上,在这些服务器上同时进行,也就是并行计算,这样就大大缩短了程序执行的时间。分布式计算需要的是最终的结果,程序代码在很多服务器上执行后会产生很多的结果,因此需要一段代码对这些中间结果进行汇总。Hadoop中的分布式计算一般分为两个阶段完成的,第一阶段负责读取各数据节点中的原始数据,进行初步处理,对各个节点的数据求单词书。然后把处理结果传输到第二阶段,对中间结果进行汇总,产生最终的结果。
在分布式计算中,程序代码应该允许放在哪些数据节点上,哪些节点运行第一阶段的代码,哪些节点运行第二阶段的代码;第一阶段代码执行完毕后,传输到第二阶段代码所在节点;如果中间执行失败了,怎么办?等等问题,都需要管理。运行这些管理职责代码的节点称为主节点(master node),运行第一二阶段程序代码的节点称为从节点(slave node)。用户的代码应该提交给主节点,由主节点负责把代码分配到不同的节点执行。
在hadoop中,分布式存储系统统称为HDFS(hadoop distributed file system)。其中,主节点为名字节点(namenode),namenode就是master,namenode一是管理文件系统文件的元数据信息(包括文件名称、大小、位置、属性、创建时间、修改时间等等),二是维护文件到块的对应关系和块到节点的对应关系,三是维护用户对文件的操作信息(文件的增删改查);从节点称为数据节点(datanode),datanode就是slave,datanode主要是存储数据的。master只有一个,slave可以有多个,这就是master/slave模式。
在hadoop中,分布式计算部分称为Mapreduce。其中,主节点称为作业节点(jobtracker),jobtracker就是master,jobtracker和namenode必须在同一台服务器上;从节点称为从节点(tasktracker),tasktracker就是slave,tasktracker必须运行在datanode上。master只有一个,slave可以有多个,这就是master/slave模式。在任务节点中,运行第一段的代码称为map任务,运行第二段代码称为reduce任务。