理解大数据之Hadoop简介
Java
学习
目录
- 存储方式与存储介质的发展
1.1 打孔纸带
1.2 磁带
1.3 硬盘
1.4 分布式存储
- 什么是Hadoop
- Hadoop的发展历史
- Hadoop的作用
4.1 解决的问题
4.2 成本控制
4.3 成熟的生态
4.4 对比传统关系型数据库的优势
- 算法简介
5.1 分布式存储下的Consistent Hash算法
5.2 HDFS 与 GFS 的简介
5.3 MapReduce算法
- Hadoop的应用
存储介质与存储方式的发展
- 打孔纸带
- 磁带
磁带致命的缺点就是只能顺序读取
- 硬盘
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中,这种是线性的文件系统。
- 分布式存储:
- 传统硬盘遇到的问题:对于淘宝和百度这样的互联网企业,每时每刻都有无数的用户在使用它们提供的互联网服务,这些服务了大量的数据吞吐量。同一时间,会并发出成千上万的连接对数据库进行操作。在这种情况下,单台服务器或者几台服务器远远不能满足这些数据处理的需求,简单的升级服务器性能的方式也不行,配置始终有尽头,摩尔定律也终将失效,并且价格也会越来越贵,这种情况下主机要是一出故障,钱还是其次,数据丢失带来的后果简直不堪设想。
- 集群分布式存储:将数据存储在多个服务器上,既可以提高读取速度,又增加了安全性,这叫做集群分布式存储。使用集群的方法有很多种,但大致分为两类:一类仍然采用关系数据库管理系统(RDBMS),然后通过对数据库的垂直和水平切割将整个数据库部署到一个集群上(垂直切割,属性部署到不同服务器,水平切割:数据部署到不同服务器),这种方法的优点在于可以采用RDBMS(关系型数据管理库系统)这种熟悉的技术,但缺点在于它是针对特定应用的。由于应用的不同,切割的方法是不一样的。尤其在进行数据处理的时候,给分布式计算带来了极大的阻碍。于是Google抛弃了RDBMS的方法,使用key/value形式的存储,这样可以极大地增强系统的可扩展性(scalability),如果要处理的数据量持续增大,多加机器就可以了。事实上,key/value的存储就是由于BigTable等相关论文的发表慢慢进入人们的视野的。而Hadoop就是在google这一方法的基础上发展起来的一个大数据处理框架。他要解决的就是大量数据的可靠存储和计算的问题。
什么是Hadoop
Java下对大数据进行存储计算以及可视化等处理的Apache的开源框架。
- 在很多年前,还没有Hadoop存在,对于某些需要存储大量数据的行业来说,只能考虑IBM的大型机。IBM的大型机确实稳定可靠而且速度也不错,但有一个致命的问题:贵。宇宙行与IBM合作,据说购买的大型机造价已经突破了九位数。
- 后来,Google初创,同样需要存储和计算大量数据,但是当时Google没有钱。于是就自己提出了GFS和MapReduce技术。它使用了分布式存储,但是严格意义上来说,分布式存储和计算的思想早就有了,Google只不过是把它简化了而已。以前的分布式计算很大力气都花费在每个节点的计算同步和节点间数据交换上面。建立这样一个系统实在是太复杂了,于是很多人放弃了。即便是有些人成功的建立起了一个小型的系统,但是将其搬到大量节点上也是有很多的问题。于是分布式计算实际上还是处于实验环境中,或者小范围的使用。但是Google横空出世,它的工程师们发现实际上使用一个简单的分布式计算模型MapReduce就能完成他们的需求。毕竟他们当时的需求还很简单。而且那个时候的Google毕竟还不像现在这么有钱,能省一点是一点,能用PC的就别上大型机了。反正存的也就是一些网页,又不是用户的真金白银。然后他们就搞了一个MapReduce。然后就写了一篇关于这种计算方法的论文。有了思想,而且有了Google这么大数据量的数据验证,分布式计算技术也就成熟了。而我们的Hadoop也就在这个基础上逐渐发展起来了。
Hadoop的发展历史
Hadoop是Apache Lucene创始人Doug Cutting创建的,Lucene是一个广泛使用的文本搜索系统库。Hadoop起源于Apache Nutch,一个开源的网络搜索引擎, 它本身也是Lucene项目的一部分。
- Nutch项目始于2002年,是一个可以运行的网页爬取工具和搜索引擎系统。但后来,开发者认为Nutch的架构可扩展度不够,不能解决数十亿网页的搜索问题。
- 2003年,谷歌发表的一篇论文解决了他们的问题,这篇论文就是谷歌的存储架构,也就是谷歌分布式文件系统,简称GFS。 他们发现GFS可以解决他们在网页爬取和索引过程中产生的超大文件的存储需求。特别关键的是,GFS能够节省系统管理(如管理存储节点)所花的大量时间,并且对硬件的需求还很便宜。
- 2004年,他们开始着手实现一个GFS开源的实现,即Nutch的分布式文件系统(NDFS)。同年谷歌发表论文介绍MapReduce系统。
- 2005年初,Nutch的开发人员在Nutch上实现了一个MapReduce系统,到年中,Nutch的所有主要算法均完成移植,用MapReduce和NDFS来运行。
- 研究人员发现Nutch的NDFS和MapReduce不只是适用于搜索领域。于是在2006年2月, 开发人员将NDFS和MapReduce移出Nutch形成Lucene的一个子项目,称为 Hadoop。大约在同一时间, Doug Cutting加入雅虎,雅虎为此组织了一个专门的团队和资源,将Hadoop发展成一个能够处理Web数据的系统。
- 在2008年2月,Yahoo宣布其搜索引擎使用的索引是在一个拥有1万个内核的Hadoop 集群上构建的。
- 2008年1月,Hadoop已成为Apache的顶级项目
- 08年4月 在900个节点上运行1 TB排序测试集仅需209秒,成为世界最快的大数据处理框架。
Hadoop的作用
- Hadoop帮助我们解决了什么问题:
无论国内还是国外的大公司对于数据都有着无穷无尽的渴望,都会想尽一切办法收集一切数据,因为通过信息的不对称性可以不断变现,而大量的信息是可以通过数据分析得到的。数据的来源途径非常的多,数据的格式也越来越多越来越复杂,随着时间的推移数据量也越来越大。因此在数据的存储和基于数据之上的计算上传统数据库很快趋于瓶颈。而Hadoop正是为了解决了这样的问题而诞生的。其底层的分布式文件系统具有高拓展性,通过数据冗余保证数据不丢失和提交计算效率,同时可以存储各种格式的数据。同时其还支持多种计算框架,既可以进行离线计算也可以进行在线实时计算。
- Hadoop的成本极低,主要是由于以下原因:
2.1.硬件成本
Hadoop是架构在廉价的硬件服务器上,不需要非常昂贵的硬件做支撑
2.2.软件成本
开源的产品,免费的,基于开源协议,可以自由修改,可控性更大
2.3.开发成本
因为属于二次开发,同时因为有非常活跃的社区讨论,对开发人员的能力要求相对不高,工程师的学习成本也并不高
2.4.维护成本
当集群规模非常大时,开发成本和维护成本会凸显出来。但是相对于自研系统来说的话,还是便宜的很多。某司自研同类系统几百名工程师近4年的投入,烧钱亿计,都尚未替换掉Hadoop、
2.5.其他成本
如系统的安全性,社区版本升级频繁而现实是无法同步进行升级所引入的其他隐形成本。
- 成熟的生态圈:
为什么wp永远半死不活,为什么linux操作系统无法成为家庭操作系统,为什么windows进军服务器领域屡战屡败。为什么国产操作系统永远都只是一个笑话,为什么Python如此简单的语法却可以风靡全世界。一句话:成熟的生态圈代表的未来的发展方向,代表着美好的市场前景,代表着更有钱途的一份工作(好吧,“三个代表”).
- 与传统关系型数据库对比的优势:
我们说键值对的存储方式与传统的关系型数据库最大的不同就是他没有模式的概念。在关系型数据库中,模式就是对数据的约束,比如一个关系型数据库某一个实体约束其某一个属性为布尔值,则该值只能为true或false。而键值对存储方式对于某一个key,value可以使任意数据类型。这一点和mongodb之类的nosql数据库十分相像,但是hadoop和nosql不同的是除了键值对存储之外更偏向于灵活的MapReduce的计算,而mongodb之类的nosql数据库更多采用的是json格式查询,并且是单机多线程的。至于在性能和稳定性方面,你们都知道的,就是呵呵两个字。简单的形容的话,如果我是某个项目的项目经理,然后看某个人不顺眼想开掉,我就会让他去负责维护mongoDB,这样过不了多久他就要自己离职了。
算法简介
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 虚拟节点
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,在这里我就不赘述了。
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也是一个很成熟的商业产品,由于具体实现原理比较复杂,我在这里就不做介绍了,有兴趣的同学可以私下找找书来看一看。
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的公司:
Hadoop在阿里巴巴:
用于处理商业数据的排序,并将其应用于阿里巴巴的ISEARCH搜索引擎,垂直商业搜索引擎。
节点数: 15台机器的构成的服务器集群
服务器配置: 8核CPU,16G内存,1.4T硬盘容量。
HADOOP在百度:
HADOOP主要应用日志分析,同时使用它做一些网页数据库的数据挖掘工作。
节点数:10 - 500个节点。
周数据量: 3000TB
Hadoop在Facebook:
主要用于存储内部日志的拷贝,作为一个源用于处理数据挖掘和日志统计。
主要使用了2个集群:
一个由1100台节点组成的集群,包括8800核CPU(即每台机器8核),和12000TB的原始存储(即每台机器12T硬盘)
一个有300台节点组成的集群,包括2400核CPU(即每台机器8核),和3000TB的原始存储(即每台机器12T硬盘)
由此基础上开发了基于SQL语法的项目:HIVE
HADOOP在TWITTER
使用HADOOP用于存储微博数据,日志文件和许多中间数据
使用基于HADOOP构件的Cloudera's CDH2系统,存储压缩后的数据文件(LZO格式)
HADOOP在雅虎:
主要用于支持广告系统及网页搜索
机器数:25000,CPU:8核
集群机器数: 4000 个节点 (2*4cpu boxes w 4*1TB disk & 16GB RAM)