第一章:Hadoop和Hive以及Spark的关系是什么?
Hadoop和Hive、Spark都是大数据领域的技术栈。
一:大数据领域当中以后两个最为核心的问题
1:数据怎么存储
2:海量数据怎么计算
单机系统时代。
所有数据都在一个计算机上进行存储,数据处理任务都是IO密集型,而不是CPU密集型。
数据分布式存储
大数据时代 ,海量数据导致我们一台数据服务存不下。这样的话,我们需要一一直加机器进行分布式存储。
HDFS
这个时候问题就来了,我们使用100台数据存储数据,那么怎么去做管理呢?一个老板不能直接对100个员工直接发号施令,需要有一个经理去做统筹 ,让他们开起来是一个整体,在Hadoop当中干这个事的就是HDFS扮演了这样的经理的角色,HDFS统一管理者100台机器上的存储空间,提供一个接口让100机器的存储空间开起来在一台机器上,让用户感觉是有一个无限大的存储空间。
然后基于这个去写一个程序。
MapReduce
接下来还有一个问题,那就是数据计算的问题。毕竟数据存储下来就是为了计算的。
数据分布的存储在这些机器上。并且每一个机器都有自己的CPU和内存,如果能充分的利用到这些资源,是一个顺利成长的事。
但是作为一个程序员,我们如何写程序去操作这100台机器协作操作一个计算任务呢,比如说这些任务怎么分配到100台机器上,这些任务怎么去做同步。如果这个过程中有一个机器挂掉了怎么办,这都是非常典型的并行编程的复杂性。为了解决这个问题,MDFS当中引入了一个大名鼎鼎的模块:MapReduce模块。
MapReduce实际上是提供了一个任务并行的框架。通过他的API抽象,让用户把这个程序分成两个阶段,一个阶段就是Map阶段,就好比你有一个任务量很大的活,你有100个帮手。把他平均分成100分去完成,这个就是Map阶段,而Reduce阶段是等着100个小伙伴把任务完成,然后再把结果汇总到你这里,这就是一个reduce阶段。
Hive
**目前在Hadoop当中有HDFS处理存储问题,MapReduce处理计算。这看起来很美好,但是科技总是有懒人推动的。**大数据时代,这些懒人发现特么的我不能写SQL了,我需要写一个MapReduce程序,不光是写程序,还是一个非常专业的分布式处理的程序,这个需要比较高的计算机背景的。对于这一批用户,我能不能也在Hadoop上也写SQL。于是Hive就出现了。
Hive实际上就是一个在Hadoop上进行结构化处理的解决方案,为了能让用户写SQL处理,那么我们的数据就需要进行结构化处理,毕竟SQL的S就是结构化的意思。
这个区别在于Hive在执行阶段会把SQL翻译成为一个MapReduce程序去进行执行。然后再把执行的结果返回给用户。这就是一个完整的在Hive里边使用SQL处理数据的方式。hive的出现又把大数据工程师变成了SQL boy
从工程来看,效率和灵活性就是一个矛盾体。Hive的出现使得大数据处理任务的开发效率提高了,但是数据处理的表达性和灵活性上是不如直接写MapReduce的,所以这两门技术也不是互相替代的,而是根据不同的使用场景去选择。
最后在Hadoop上写SQL也不是只有Hive一个方案。像impala、presto等等都是 SQL on Hadoop的替代品。
Spark
最后说一说spark,spark经常用来和Hadoop来做对比。精确的说是和Hadoop中的MapReduce来做对比,spark是单纯的计算框架,他的不同之处是spark是一个基于内存的计算而MapReduce是一个基于磁盘的计算。所以,Spark的卖点就是快,毕竟内存的读取速度是磁盘的几百倍,普通我们认为Spark的处理速度是MapReduce的2-3倍。
如果说我们的数据集不大,我们内存完全装得下的话,Spark甚至可以比MapReduce快100倍。