浅谈Hadoop

  Hadoop是一个十分流行的分布式存储和计算框架,也是业内大数据处理和分析最通用的框架之一。

  hadoop_icon.png

  Hadoop2.0 由HDFS(Hadoop Distributed File System)、MapReduce和Yarn三部分组成。

  Hadoop的设计原型来源于google的三篇论文,即GFS、MapReduce和BigTable,同时作为Lucene的子项目Nutch的一部分在2005年引入Apache,Hadoop的得名是Hadoop之父Doug Cutting儿子的玩具,值得一提的是他的妻子叫Lucene。

  Hadoop生态

物联网

  hbase生态.png

  "永远不把鸡蛋放在一个篮子里"——HDFS

  在分布式的文件系统之前,往往使用大型机和存储服务器去做存储,无论大型机和存储服务器都是十分昂贵的,同时也是有瓶颈的,横向扩展能力很差。而分布式文件系统的横向扩展能力以及容错性十分好,也越来越受到人们的青睐。HDFS的定位是用比较廉价的机器,做高可用的海量数据的存储。主要采用多副本的分块存储机制,在部分机器宕机或数据损坏的情况下,依然能提供可靠服务。

  集群拓扑

物联网

  hdfs.jpg

  NameNode:文件元数据存储节点,Hadoop1中存在单点问题,Hadoop2中通过备用节点实现高可用,同时有元数据存储瓶颈,不适于存储小文件。

  DataNode:数据节点,单文件被分成多块,每一块多副本跨机架、机房存储,保证数据的高可用。

  Block:文件的存储单位,单个文件可被分成多块,默认为128M。同时也是MapReduce默认的输入块大小。文件读取流程:

物联网

  hdfsread.png

  open DistributedFileSystem 去NameNode获取文件的块列表,NameNode根据Client距离各节点的网络距离给出Block列表。

  根据Block列表去一次读取文件,读取后在Client进行文件汇总。

  写入流程:

物联网

  hdfs_write.png

  实例化DistributeFileSystem,在NameNode进行写文件的申请,申请成功后创建元数据,并返回数据存放的位置信息。

  过位置信息,对DataNode进行流式写入,将数据分成多个数据包,作为一个数据队列。写入时每次取一个数据包,写入全部副本,且三个节点均写入成功,则返回ACK信号表名当前buff写入成功,Client内部维护着数据包的Ack队列,收到Ack之后会移除这个数据包。

  最后想NameNode发送Complete信号,确认文件写入全部成功。如果中途节点写失败:写入部分数据的节点将在管线中移除,同时后续恢复正常后会删除这部分数据。随后写入后续两个节点,原则上写入一个块的时候就可以写成功,因为namenode发现数据不一致会做复制操作。

  "分而治之"——MapReduce

  分布式计算出现之前,数据的计算往往依靠性能比较好的单机计算。但是单机受限于本身的计算资源,往往计算速度都不如人意。

  一天小明接到产品的一个需求:

  产品:小明啊,这里有一天的日志信息,大概5个G,我要统计一下一共有多少。

  小明:OK啊,就5个G,一个shell搞定,看我 cat * | wc -l,我简直就是个天才。

  产品:对不起啊小明,需求变了,一天的看不出来效果,我需要统计1个月的数据,大概有150G。

  小明:有点大啊,不怕,我线上服务器内存120G,40核,看我用多线程搞定,过了2个小时,终于搞 定了还有点费劲。

  产品:我保证这是我最后一次变更需求,我想要最近一年的数据1800G左右。

  小明:数据上T了,搞不定了啊。

  上面的例子告诉我们,在大数量的场景下,高性能的单机有时也是解决不了问题。所以我们就需要MapReduce帮助我们。

  MapReduce是一种采用分治和规约的一种并行的批处理框架,先将数据做分割计算,最后汇总结果。看上去和多线程的处理机制一样,但是Hadoop将它封装在了框架中,编程十分简单,吞吐量十分高,目前支持Java、C++、Python等多种API编程。