? ? ? ?Hadoop、Hive、Spark都是大数据相关的技术,大数据属于数据管理系统的范畴。数据管理系统要解决的问题是数据如何存储和数据如何计算。
? ? ? ?在单机数据管理系统时代,一台服务器上可以满足数据存储的需求,计算也不会遇到什么瓶颈,数据处理都是IO密集型的,不是CPU密集型的,也谈不上什么分布式系统。以今天典型的服务器为例,一个典型的2U服务器,可以配置6块硬盘,没块硬盘选4T,这样就会有24T原始容量,再加上一些数据包可用的冗余,再加上一些格式化的损失,保守估计,一台服务器也可以存储10T以上的数据,与此同时,在这样的服务器上再配置上128G内存,两颗CPU,再安装一款数据库管理系统,略微进行调优,单表处理10亿数据没什么问题。现在单机数据管理方案仍然是备选。
CPU密集型?可以理解为 就是处理繁杂算法的操作,对硬盘等操作不是很频繁,比如一个算法非常之复杂,可能要处理半天,而最终插入到数据库的时间很快。
IO密集型可以理解为简单的业务逻辑处理,比如计算1+1=2,但是要处理的数据很多,每一条都要去插入数据库,对数据库频繁操作。
? ? ? ?在现如今这个信息爆炸的时代,数据的容量越来越大,一台机器可能无法满足数据的存储需求,需要通过扩展机器的数量来对数据进行存储。如果用100台服务器去存储数据,如何做统一管理呢?在Hadoop生态里面,HDFS扮演者数据统一管理的角色,会统一管理100台服务器上的存储空间,提供一个接口,让这100台机器的空间好像就是在一台机器上,让用户感觉到有一个无限大的存储空间,方便用户写应用程序进行存储和计算。数据分布存储在100台机器上,每个机器都有自己的CPU和内存,如何高效利用这些资源处理数据呢?HDFS中引入了一个MapReduce模块,MapReduce模块实际上是提供了一个任务并行的框架,通过它的API抽象,能让用户把程序分成两个阶段,一个是map阶段,形象地来讲,你有一个很大的任务,找了100个帮手,把任务平均分成100份,每个人做一份,这就是map阶段。而reduce阶段,就是对map阶段完成的任务进行汇总,最终输出一个结果。综上所述,Hadoop中采用HDFS来处理存储,MapRecude来处理计算。
? ? ? ?为了能够在大数据上使用SQL来处理数据,Hive应用而生。Hive实际上是在Hadoop上进行结构化数据处理的一个解决方案,目的是能让用户通过编写SQL来处理数据。当然,只有结构化后数据才可以进行查询,Hive中的一个核心模块metastore用来存储结构化的信息,简单来说,就是一个表信息,比如表中有多少列,每个列有什么数据结构。Hive中的执行引擎就会把一条SQL语句进行语法分析,生成语法树,这两个步骤和普通关系型数据库没有本质的区别,主要区别在执行阶段,Hive的执行引擎会把SQL语句翻译成一个MapReduce任务去执行,然后将执行结果返回给用户。这就是Hive里面采用SQL处理数据的过程。Hive的出现让?一部分大数据工程师变成了SQL Boy/SQL Girl。从工程角度来看,效率和灵活性是一对矛盾体,从Hive例子中可以看出,SQL出现使得大数据处理开发的任务效率提高了,但是在数据处理的表达和灵活性上,不如直接写MapReduce程序。不过,具体要根据实际的场景去选择。当然,在Hadoop上写SQL也不是只有Hive一个方案,像impala,presto等都是SQL在Hadoop上替换方案。
? ? ? ?最后,介绍一下Spark。Spark经常用来和Hadoop进行对比,更为精确的说是和Hadoop里面的MapReduce对比,因为Spark本身也是一个计算框架。Spark和MapReduce不同主要是Spak是基于内存的计算,而MapRecude是基于磁盘的计算,所以Spark的卖点就是快。Spark的核心模块和MapRecude在使用体验上有一些类似的地方,他们都提供了一些列的API,让开发这写数据处理的程序,并且在MapReduce上有Hive类似的方案,让用户能够写SQL。同理,在Spark生态里面也有Spark?Sql这个模块。Spark作为一个纯的计算引擎,还提供了其他上层的抽象,帮助用户写其他类型的数据处理程序,比如Spark提供了streaming模块,可以让用户写流处理程序,提供了MLlib模块,让用户去写机器学习的程序,以及图处理模块GraphX。
|