Hadoop框架初学

来源:互联网 发布:携程国内游数据 编辑:程序博客网 时间:2024/06/05 08:50

问题的产生

主要是为了解决并行计算和分布式存储问题,因为一台计算机的处理能力有限,所以想着把一个很大的计算任务分成很多小任务,分发给各个机器。

这些机器需要共享一个分布式文件系统,才能把结果写入文件。

同时,目前的文件,硬盘都非常大,但是访问的带宽却跟不上容量的速度。
这样,就想这把一个大文件拆成很多小文件,分别存储在不同机器上,这样带宽就是所有机器的带宽加和,提高了访问速度。

我理解的是这样,可能有误。

Hadoop解决方法

如果是这样的话,有两个问题很重要:
1、硬件故障问题
一个文件存储在多台机器上,万一有一个机器坏了咋整?
这个一般用复制,一旦有系统故障,就用之前文件复制的复本。
在Hadoop中,使用HDFS解决这个问题。

2、数据结合问题
因为文件是分布式存储的,所以在一个机器需要读取很多个机器上数据的汇总,这样的话,如何保证数据的正确性?
在Hadoop中,用MapReduce解决这个问题。
MapReduce是一种很有意思的编程模型,Map把一开始文件的输入转换成键值对,把我的程序处理输入的输出也规定成键值对,输送给reduce,reduce再做处理。
总之,MapReduce在处理过程中的输入输出都是键值对。

MapReduce

任务分成两阶段:

  • Map
    读入文件每一行,键是某一行起始位置相对于文件起始位置的偏移量,值是每一行的文本。
    我们读取每行,需要写程序进行处理,写到输出,也是一个键值对。
    然后MapReduce框架会对我们的输出进行整合,相同键的记录做值的合并:
    这里写图片描述
    然后把这个合并结果作为reduce的输入
  • reduce
    获取汇总后结果,写程序进行处理
    这里写图片描述
    这里写图片描述
    注意,这里两个reduce的输入是不一样的,MapReduce这里对汇总后的数据进行了分区,把某个范围Key值的数据作为第一个reduce的输入,某个范围Key值的数据作为第二个reduce的输入

HDFS

HDFS中用块来存储文件,默认块大小是64M,一般比64M大(128M)。
这是因为块越大,寻址耗时越少。
HDFS如何操作文件?有命令行方式和语言API方式,需要查官网了。
Java语言API:
这里写图片描述
这里写图片描述

Master Slave模式

hadoop的集群是基于master/slave模式,namenode和jobtracker属于master,datanode和tasktracker属于slave,master只有一个,而slave有多个。

  • 分布式存储(hdfs)角度

集群中的节点由一个namenode和多个datanode组成。
namenode是中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
集群中的datanode一般是一个节点一个,负责管理它所在节点上的存储。
HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。
从内部看,一个文件其实被分成一个或多个数据库,这些块存储在一组datanode上。
namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。
它也负责确定数据块到具体datanode节点的映射。
datanode负责处理文件系统客户端的读写请求。在namenode的统一调度下进行数据块的创建、删除和复制。

  • 分布式应用(mapreduce)角度

集群中的节点有一个jobtracker和多个tasktracker组成。
jobtracker负责任务的调度,tasktracker负责并行执行任务。
tasktracker必须运行在datanode上,这样便于数据的本地计算,而jobtracker和namenode则必须在同一台机器上。

遗留的问题

今天只是简单看了一下,看别人写MR程序,只要Maven中引入Hadoop的依赖就能在Hadoop上跑了。据说也能在windows本机运行,只是没有并行效果。
任务分配是Hadoop自己做的,整合是MR做的。
还需要了解下Hadoop怎么搭建,怎么配置多个集群,如何分配任务。

0 0