前段时间一直在搞Hadoop,把自己的学习心得分享给大家。个人水平有限,欢迎大家指出不足之处。
Hadoop的介绍和安装部署很多,我这就不废话了。它包括HDFS分布式文件系统,HBase分布式数据库,MapReduce编程模型。它适合于大数据的处理,例如FaceBook,google,百度之类的大公司用于日志处理、数据挖掘,一般的公司不会用到,除非是那些用来做噱头的。
随着IT的发展,我们已经步入了Big Data时代,如何管理这些结构化+非结构化的数据成为了摆在管理员面前的难题,为此,存储界老大EMC甚至专门成立了Big Data的实验室。
1、非结构化数据,例如视频、文档、Mp3等等,这些文件由于没有关系结构,所以存储起来相对来说是比较简单的,容量不够可以加存储,性能不够可以类似Scale-out搞多并发,或者类似Scale-up提高单个硬盘的性能,未来SSD变得更便宜之后,单个硬盘的性能也许不是问题。
2、结构化数据,典型的就是数据库,各个表之间有复杂的关系,所以当数据发展到一定的规模时,传统的关系型数据库已经无法满足需求,不管是从存储容量还是从性能上。目前采取的比较多的就是分区or分表,前端加SSD做缓存,对价格敏感的客户采用Memcache充当cache的角色。而这种关系型数据库当初在设计时就埋下了缺陷,导致后面升级时很困难,代码重写等等。
针对第一种非结构化数据,GOOGLE精英们发表了GFS论文,后来出现了很多类似的系统,HDFS、MooseFs、IBM的GPFS等等,即所谓的分布式文件系统。将meta data和data分开,减轻meta的压力;另外通过并行读写,提高了并发性,即上面说的类似Scale-out。
针对第二种结构化数据,出现了类似GOOGLE提出的BigTable的NoSQL们,目前NoSQL家族成员已经很多了,有HBase等。它颠覆了传统数据库的面向“row”,采用面向“column”,减小了存储空间,加快了读取时间。不仅如此,由于是非关系型数据库,在最初的表设计时,采用Family(列族)的方式,所以后来如果想扩展表的结构,可以非常方便,直接增加一个字段即可,摆脱了传统关系型数据库的制约。另外,通过和MapReduce的结合,应用程序可以方便地将数据并行写入到NoSQL。
但是NoSQL由于也是最近几年才发展起来的,不像Oracle、SQL SERVER经过几十年的积累,但可以预见的是,在Big Data的时代,NoSQL们是必然的趋势。虽然如此,但传统的关系型数据库也不会淡出历史的舞台。关系型数据库+非关系型数据库会同时存在于数据库领域。
上面提到的只是存储级别的,如果涉及到大规模的数据处理,那么计算能力该如何解决呢?GOOGLE又提出了MapReduce的编程模型。通过MapReduce模型,会JAVA的程序员们可以很简单地编写程序将大量数据经过MapReduce(以下简称MR)并行写到NoSQL中(如下图JobTracker分配任务将数据写到每个黄色的RegionServer*);或者将需要处理的任务经过MR分配到具体的tasktracker上(如下图JobTracker分配任务让TaskTracker*执行具体的运算任务)。
计算机的世界说白了就是计算+存储,而GOOGLE的先驱们早已事先为Big Data的到来奠定了理论基础。