Hadoop,Hive和Spark是大数据相关工作中最常用的三种框架。
1 Hadoop
hadoop是一个分布式计算框架,是大数据处理的基石,大多其他框架都是以hadoop为基础。Hadoop主要包括两个方面,分别是分布式存储框架(HDFS)和分布式计算框架(Mapreduce)。
1.1 HDFS分布式存储
HDFS全称为 hadoop distributed filesystem。HDFS本质上也是一个文件系统,可以看作由多个普通的文件系统组成的一个联机版的文件系统。它将一个大文件划分为小的文件库存储在各个各个机器上(DataNode),形成了多机存储,将这些小文件的元数据信息交给一个统一的管理者(NameNode)来管理。和普通文件系统不同的是HDFS所划分的文件块更大(128M),并且通过冗余的方式来保证可靠性。
存下数据之后,就开始考虑怎么处理数据。虽然HDFS可以为你整体管理不同机器上的数据,但是这些数据太大了。如果单机处理时间不可想象,所以需要多机处理,那么就面临着一个问题,怎么分配工作?这就是Mapreduce的诞生的原因。
1.2 MapReduce
MapReduce的设计,采用了很简化的计算模型,只有Map和Reduce两个计算过程(中间用Shuffle串联),用这个模型,已经可以处理大数据领域很大一部分问题了。那什么是Map(映射),什么是Reduce(规约)?
考虑如果你要统计一个巨大的文本文件存储在类似HDFS上,你想要知道这个文本里各个词的出现频率。你启动了一个MapReduce程序。
Map阶段:
几百台机器同时读取这个文件的各个部分,分别把各自读到的部分分别统计出词频,产生类似(hello, 12100次),(world,15214次)等等这样的Pair(我这里把Map和Combine放在一起说以便简化);这几百台机器各自都产生了如上的集合,然后又有几百台机器启动Reduce处理。
Reduce阶段:
Reducer机器A将从Mapper机器收到所有以A开头的统计结果,机器B将收到B开头的词汇统计结果(当然实际上不会真的以字母开头做依据,而是用函数产生Hash值以避免数据串化。因为类似X开头的词肯定比其他要少得多,而你不希望数据处理各个机器的工作量相差悬殊)。然后这些Reducer将再次汇总:(hello,12100)+(hello,12311)+(hello,345881)= (hello,370292)。每个Reducer都如上处理,你就得到了整个文件的词频结果。
2 Spark
Map+Reduce的简单模型很黄很暴力,虽然好用,但是很笨重。第二代的Tez和Spark除了内存Cache之类的新feature,本质上来说,是让Map/Reduce模型更通用,让Map和Reduce之间的界限更模糊,数据交换更灵活,更少的磁盘读写,以便更方便地描述复杂算法,取得更高的吞吐量。
Spark是基于内存计算的大数据并行计算框架。**Spark基于内存计算,**提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。
总之,Spark的思想与MapReduce相同,但是是基于内存计算,速度更快。
3 Hive
有了MapReduce,Tez和Spark之后,程序员发现,MapReduce的程序写起来真麻烦,他们希望简化这个过程。于是就有了Hive。
Hive基于hadoop的数据仓库工作,可以将结构性的数据映射成一张数据库表,Hive用的是SQL。将SQL语言翻译成MapReduce程序,丢给计算引擎去计算,这样大家只需要用更简单更直观的语言去写程序了。总之就是简化MapReduce的编程过程。
那么接下来有以下问题:
Hive的数据从哪里来,什么样数据应该存到Hive?又被送往哪里去处理?存到Hive有什么优势?
(1) Hive的数据从哪里来,什么样的数据适合存到Hive?
其实不用纠结这个问题,数据来源有很多很多,比如业务数据经过初步处理(数据清洗、结构化)后存入Hive,为以后的报表分析、实时计算做好数据准备。也就是说,具有业务意义的,需要长期保存供后续处理和使用的都可以存入Hive中。这也体现出Hive作为数据仓库的一样,既为仓库,也就是储备,以备不时之需。
(2) Hive的数据被送到哪里去?
一般来说从Hive中取到数据后,经过处理会落入到关系数据库或者其他类型的数据库中作为实时查询;或者作为Spark的数据输入,来做进一步的批量计算或者实时计算,最后输出到数据库或者其他地方。
(3) 存到Hive有什么优势?
Hive既然作为数据仓库,即说明它可以存大量的文件,实时也确实这样,因为它是基于Hadoop的嘛,Hadoop本身就是适合存大数据的分布式文件系统嘛。Hive支持HQL的类似SQL的方式查询和分析数据,也是因为它是基于Hadoop的,将HQL转化为MR来执行,所以从编写程序的角度来说,HQL肯定是比直接写MR程序要容易的多的,实际上在开发时大多数也是用的HQL,而很少直接去写MR.
4 Hadoop,Spark和Hive三者联系
hadoop:一个大脑加一个口袋构成一个单体,大脑负责计算数据,口袋负责存储数据。多个单体构成集群。
hive:使用HiveQL语句,将其转化成MapReduce任务,让多个大脑同时计算存储在多个口袋里的数据。
spark:多个更聪明的大脑组成的集群,计算存储在hadoop集群上的数据。计算速度很快,可以进行实时的应用。