[关闭]
@Cesar 2015-12-29T14:04:50.000000Z 字数 6730 阅读 2256

理解大数据之Hadoop简介

Java 学习


目录

  1. 存储方式与存储介质的发展
    1.1 打孔纸带
    1.2 磁带
    1.3 硬盘
    1.4 分布式存储
  2. 什么是Hadoop
  3. Hadoop的发展历史
  4. Hadoop的作用
    4.1 解决的问题
    4.2 成本控制
    4.3 成熟的生态
    4.4 对比传统关系型数据库的优势
  5. 算法简介
    5.1 分布式存储下的Consistent Hash算法
    5.2 HDFS 与 GFS 的简介
    5.3 MapReduce算法
  6. Hadoop的应用

存储介质与存储方式的发展

  1. 打孔纸带
  2. 磁带
    磁带致命的缺点就是只能顺序读取
  3. 硬盘
    3.1 硬盘的文件系统
    • FAT
    • NTFS
    • EXT2
      简单介绍一下应用的比较多的包括微软的FAT以及linux的ext2文件系统,至于NTFS大家可以自行了解。理解EXT2的文件系统有助于理解GFS以及Hadoop的HDFS。对于EXT2文件系统来说,一个磁盘被分为很多个块(block),每一个块大小基本固定,1k,2k或者是4k.而Linux下的每一个文件对应一个统一的inode,它记录了该文件的数据存放的块的位置。当系统需要找到一个文件的时候,首先检查该文件的inode信息,通过inode找到该文件的所有的块,然后读取出来。这种方式我们叫做索引式文件系统。除了这种方式,还有一种FAT文件系统,这种方式我们在u盘上常常用到,他的文件下一个block的信息存储在上一个block中,这种是线性的文件系统。
  4. 分布式存储:
    • 传统硬盘遇到的问题:对于淘宝和百度这样的互联网企业,每时每刻都有无数的用户在使用它们提供的互联网服务,这些服务了大量的数据吞吐量。同一时间,会并发出成千上万的连接对数据库进行操作。在这种情况下,单台服务器或者几台服务器远远不能满足这些数据处理的需求,简单的升级服务器性能的方式也不行,配置始终有尽头,摩尔定律也终将失效,并且价格也会越来越贵,这种情况下主机要是一出故障,钱还是其次,数据丢失带来的后果简直不堪设想。
    • 集群分布式存储:将数据存储在多个服务器上,既可以提高读取速度,又增加了安全性,这叫做集群分布式存储。使用集群的方法有很多种,但大致分为两类:一类仍然采用关系数据库管理系统(RDBMS),然后通过对数据库的垂直和水平切割将整个数据库部署到一个集群上(垂直切割,属性部署到不同服务器,水平切割:数据部署到不同服务器),这种方法的优点在于可以采用RDBMS(关系型数据管理库系统)这种熟悉的技术,但缺点在于它是针对特定应用的。由于应用的不同,切割的方法是不一样的。尤其在进行数据处理的时候,给分布式计算带来了极大的阻碍。于是Google抛弃了RDBMS的方法,使用key/value形式的存储,这样可以极大地增强系统的可扩展性(scalability),如果要处理的数据量持续增大,多加机器就可以了。事实上,key/value的存储就是由于BigTable等相关论文的发表慢慢进入人们的视野的。而Hadoop就是在google这一方法的基础上发展起来的一个大数据处理框架。他要解决的就是大量数据的可靠存储和计算的问题。

什么是Hadoop

Java下对大数据进行存储计算以及可视化等处理的Apache的开源框架。


Hadoop的发展历史

Hadoop是Apache Lucene创始人Doug Cutting创建的,Lucene是一个广泛使用的文本搜索系统库。Hadoop起源于Apache Nutch,一个开源的网络搜索引擎, 它本身也是Lucene项目的一部分。

Hadoop的作用

  1. Hadoop帮助我们解决了什么问题:
    无论国内还是国外的大公司对于数据都有着无穷无尽的渴望,都会想尽一切办法收集一切数据,因为通过信息的不对称性可以不断变现,而大量的信息是可以通过数据分析得到的。数据的来源途径非常的多,数据的格式也越来越多越来越复杂,随着时间的推移数据量也越来越大。因此在数据的存储和基于数据之上的计算上传统数据库很快趋于瓶颈。而Hadoop正是为了解决了这样的问题而诞生的。其底层的分布式文件系统具有高拓展性,通过数据冗余保证数据不丢失和提交计算效率,同时可以存储各种格式的数据。同时其还支持多种计算框架,既可以进行离线计算也可以进行在线实时计算。
  2. Hadoop的成本极低,主要是由于以下原因:
    2.1.硬件成本
    Hadoop是架构在廉价的硬件服务器上,不需要非常昂贵的硬件做支撑
    2.2.软件成本
    开源的产品,免费的,基于开源协议,可以自由修改,可控性更大
    2.3.开发成本
    因为属于二次开发,同时因为有非常活跃的社区讨论,对开发人员的能力要求相对不高,工程师的学习成本也并不高
    2.4.维护成本
    当集群规模非常大时,开发成本和维护成本会凸显出来。但是相对于自研系统来说的话,还是便宜的很多。某司自研同类系统几百名工程师近4年的投入,烧钱亿计,都尚未替换掉Hadoop、
    2.5.其他成本
    如系统的安全性,社区版本升级频繁而现实是无法同步进行升级所引入的其他隐形成本。
  3. 成熟的生态圈:
    为什么wp永远半死不活,为什么linux操作系统无法成为家庭操作系统,为什么windows进军服务器领域屡战屡败。为什么国产操作系统永远都只是一个笑话,为什么Python如此简单的语法却可以风靡全世界。一句话:成熟的生态圈代表的未来的发展方向,代表着美好的市场前景,代表着更有钱途的一份工作(好吧,“三个代表”).
  4. 与传统关系型数据库对比的优势:
    我们说键值对的存储方式与传统的关系型数据库最大的不同就是他没有模式的概念。在关系型数据库中,模式就是对数据的约束,比如一个关系型数据库某一个实体约束其某一个属性为布尔值,则该值只能为true或false。而键值对存储方式对于某一个key,value可以使任意数据类型。这一点和mongodb之类的nosql数据库十分相像,但是hadoop和nosql不同的是除了键值对存储之外更偏向于灵活的MapReduce的计算,而mongodb之类的nosql数据库更多采用的是json格式查询,并且是单机多线程的。至于在性能和稳定性方面,你们都知道的,就是呵呵两个字。简单的形容的话,如果我是某个项目的项目经理,然后看某个人不顺眼想开掉,我就会让他去负责维护mongoDB,这样过不了多久他就要自己离职了。

算法简介

  1. Consistent Hash
    1.1 hash算法的衡量指标

    • 单调性:指如果已经有一些内容通过哈希分派到了相应的缓存中,又有新的缓存加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓存中去,而不会被映射到旧的缓存集合中的其他缓冲区。
    • 平衡性:指哈希的结果能够尽可能分布到所有的缓存中去,这样可以使得所有的缓存空间都得到利用。很多哈希算法都能够满足这一条件

    1.2 传统hash算法解决分布式存储的劣势

    在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则

    1.3 环形hash空间

    按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。

    1.4 对象映射到hash空间
    1.5 服务器映射到hash空间
    1.6 虚拟节点
    虚拟节点图

  2. HDFS vs GFS
    2.1 为什么要新建GFS文件系统

    • 分布式文件系统存储的文件都非常巨大,如果直接使用传统的文件(block大小为1,2,4KB),那么会占用大量的block,单次io速度只能读出几个字节的文件,这是难以接受的。GFS和HDFS默认采用的块大小是64M的
    • 由于基于商用硬件,并不保证可靠性,分布式中经常出现节点失效的情况,因此必须要集成容错,错误检测,自动回复等功能
    • 对于日志和搜索引擎数据而言,更多的是流式数据访问(flume 流式日志采集工具),一次写入,多次读取,于是增加模式需要特别的优化。

    2.2 HDFS不适合:

    • 低时间延迟:是为了高数据吞吐量应用优化,以高时间延时为代价
    • 大量的小文件:占用大量namenode
    • 多用户写入,任意文件修改

    2.3 HDFS的概念:

    • 数据块:默认64兆,是磁盘进行数据读写的最小单位。HDFS上的文件被分为很多块,与其他文件系统最大的不同是HDFS中小于一个块大小的文件不会占据整个块的空间。为什么数据块要设置这么大,是为了减少最小寻址的时间开销。
    • Namenode和datanode:HDFS有两类节点,一个namenode(管理者)和多个datanode(工作者),namenode管理文件系统的命名空间,维护文件系统树和树中所有文件和目录。同时也记录了每个文件到块的映射关系以及每一个块的副本位置,头两个文件可以在主服务器宕机的时候快速准确的恢复文件系统。
    • Datanode是文件系统工作节点,根据需要存储并检索数据块,并且定期向namenode发送所存储的块的列表
    • 运行namenode的机器毁掉了,那么我们将失去所有文件系统上的文件,因为datanode的块只负责存储块数据,是无法重建文件的,遇事namenode的容错机制就很重要了:主要包括备份和辅助namenode,在这里我就不赘述了。
  3. HBase vs Bigtable

    • 分布式系统采用key-value的形式存储数据,针对这一特点,Google在GFS的基础上开发出了BigTable,与之对应的是Hadoop在BigTable的论文基础上开发出了自己的Hbase。这是一种新的key/value形式的分布式数据库系统。应用程序通常不会直接操作GFS文件系统,而是操作他的上一级存储结构-BT。这就像一般的文件系统和数据库的关系一样。但是BT可以存放2的50次方字节的数据,也就是1024TB的数据,这意味着什么呢?mysql在linux下单表大小限制为4GB,差了2的18次方。
      所以说,BT的作用是用来存放大规模结构化的数据,google的很多项目都用了bigtable,同样,BT的开源实现Hbase也是一个很成熟的商业产品,由于具体实现原理比较复杂,我在这里就不做介绍了,有兴趣的同学可以私下找找书来看一看。
  4. MapReduce
    4.1 MapReduce的概念

    • Map:映射
    • Reduce:规约
    • eg:在一个很大的文档中统计每个单词出现的次数。
      代码

    4.2 MapReduce的实现原理
    代码

    • 首先将输入文件切分为M块,每块在16-64兆之间,接着在集群机器上执行处理程序。如图所示,MapReduce采用多线程,首先Master作为主控程序,产生很多的作业程序,我们叫这些作业程序为Worker(包括map和reduce),并且把M个map程序和R个reduce程序分配给这些worker,让他们去完成。
    • 被分配了Map程序的worker读取并处理相关输入(即切分好的文件,图片中卫splite小块文件)。它处理输入的数据,并且分析出来的键值对将传递给用户定义的reduce函数。Map函数产生的中间结果暂时缓冲在集群机器的本地内存中。
    • 这些缓冲的中间结果将被定时刷写到本地硬盘。这些数据通过分区函数分为R个区,中间结果在本地硬盘的位置被发送给master,然后master负责将位置信息发送给reduce函数的worker。
    • 当master通知reduce函数的worker关于中间数据的键值对的位置后,worker调用远程方法从map函数的worker的机器的本地硬盘上读取缓冲的中间数据,当reduce函数的worker读取到了所有的中间数据,他就使用中间数据的key进行排序,这样使相同键的key的值在一起。
    • Reduce函数的worker根据每一个中间结果的键来遍历排序后的数据,并且把key和相关中间结果只value集合传递给reduce函数。Reduce函数的worker最终在结果输出在master机器的一个文件中。
    • 所有map任务和reduce任务完成后,master激活用户程序,告知已经完成。
    • R个reduce程序产生的文件又可作为下一次分布式计算的中间结果。

第八页:使用hadoop的公司:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注