Hadoop、Hive、Spark的简单认识和总结
前言
在大数据相关的工作和开发中,最常见的就是Hadoop、Hive、Spark这三个框架了,关乎大批量的数据处理,这三个是不二之选。刚开始的时候一直没搞清楚这三者之间的关系,后来随着在工作中的了解和学习,才逐渐弄清楚这三个之间的联系和区别。
Hadoop
首先是Hadoop。Hadoop可以说是大数据处理的基石,其他框架大多数都是以Hadoop为基础,从各个方面的不同角度进行优化和改进而演变而来的,由此也形成了一个强大而完善的Hadoop生态圈,从而支撑着现在日益庞大的数据处理量。
Hadoop是一个分布式计算框架。简单来说Hadoop可以分为两部分:分布式存储(HDFS)和分布式计算(Mapreduce)。
HDFS本质上也是一个文件系统,可以看作由多个普通的文件系统组成的一个联机版的文件系统。它将一个大文件划分为小的文件库存储在各个各个机器上(DataNode),将这些小文件的元数据信息交给一个统一的管理者(NameNode)来管理。和普通文件系统不同的是HDFS所划分的文件块更大(128M),并且通过冗余的方式来保证可靠性。
Mapreduce是一种编程模型,它将分布式并行计算抽象成为Map(映射)和Reduce(归约),这样就简化了分布式程序的难度。为何能简化程序的编写难度呢,本质上就是这个框架完成了大部分事情,使得我们只需要关注业务处理逻辑,而不关系整个分布式程序之间是怎么通信和协作的。
以我们最熟悉的word count来说,假设要统计10本书里某个词语出现的次数,做法有以下几种:
(1)将这10本书的内容依次遍历,统计出词语的出现次数
(2)用多线程的方式来并发遍历,统计出词语出现的次数
(3)将10本书分别存储到不同机器,分别统计词语出现的次数,最后再求和汇总
显然,速度最快的是第3种方式(大数据量的情况下)。而编写程序难度最高的也是第3种,要考虑怎么分开存储,如何分发程序,以及如何汇总,等等。如果用Maoreduce的话我们就不需要考虑这些问题了,因为MR已经帮我们做了(JobTracker和TaskTracker),而我们只关注如何统计一本书里某个词语的次数就好了。
以上只是简单的一个举例,实际上Mapreduce是依赖于Yarn来进行调度的。
所以简单来说Hadoop是一个分布式的存储和计算框架。
Hive
提到数仓那就一定会有Hive。Hive就是基于Hadoop的一个数据仓库工具。简单来说就是它可以用SQL(准确的说是HQL)来查询和处理文件,因为它可以把文件映射为一张表。说到这里我个人觉得,大数据的处理语言不是Java也不是Python,而是SQL,或者说是类SQL的语言,因为SQl这个语言本来就是为数据查询而生的,不论是语法还是其他方面,都很适合做数据查询和分析,可以做到几行SQL一个报表,而其他语言似乎是没有这么简单的,其次在数据抓取(爬虫)方面,个人觉得SQL也是最好的选择,只是目前还没有类似的工具,或者已经有了而我还不了解。
一开始一直有几个问题迷惑不解: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.
Spark
Spark是一个基于内存计算的并行迭代计算框架,看着很高大上的样子(确实也很高大上),其本质就是将原有的在磁盘输入输出的操作全部放在了内存中进行,内存的速度和磁盘IO肯定不是一个数量级的,因此Spark减少了内存和磁盘间的IO次数,从而大大提高了计算速度.其次,为什么说Spark是一个迭代计算框架呢?因为它的计算对象都是针对同一个数据集(Dataset)来说的,可以对一个数据集反复操作,这也正发挥了内存速度上的优势.
Spark同时支持批处理和流处理(Spark Streaming,个人感觉不如Storm),也支持SQL(Spark SQL),也支持图计算,还支持机器学习,真是个全家统啊.所以现在大多数的开发也都首选Spark.
总结
非常简短的一句话概述:以Hadoop作为分布式存储和计算的基石,由此演变出了支持SQL查询的离线分析的数据仓库Hive,以及基于内存计算的Spark.
其实这三个框架的内容和特性远远不止这些,只是结合自己的理解,很浅显的总结了了以下自己对这三个框架的认识,并没有过多的技术性和代码的描述.路漫漫其修远兮,要学习的还有很多.
All efforts, only for myself, no longer for others