当前位置: 首页 > 科技观察

快手side:说说Hadoop、Hive、Spark的关系?

时间:2023-03-22 14:13:13 科技观察

大家好,我是Tom哥5G时代,运营商网络不断提速,成本越来越低,流量越来越便宜。为互联网、物联网、互联网+产业的快速发展创造了非常好的有利条件,也产生了海量的数据。如何做好数据分析、计算、提取有价值的信息,一直是大数据技术的热门赛道。今天我们就来分析比较一下Hadoop、Hive、Spark。HadoopHadoop被称为大数据技术的基石。它由分布式存储(HDFS)和分布式计算(MapReduce)两部分组成。HDFS有两个关键组成部分:1.NameNode负责分布式文件系统的元数据(MetaData)管理,如:文件路径名、数据块ID和存储位置等信息,相当于文件分配表(FAT)在操作系统中的特性。2、DataNode负责文件数据的存储和读写操作。HDFS将文件数据分成若干个数据块(Blocks),每个DataNode存储一部分数据块,从而在整个HDFS集群中划分存储一个大文件。HDFS高可用设计:数据存储容错、磁盘容错、DataNode容错、NameNode容错。MapReduce既是一种编程模型,也是一种计算框架。包含Map和Reduce两个进程。计算过程:首先,将输入内容转化为health-value对。将相同的键组合在一起形成。最后对List进行缩减合并,输出零个或多个。publicvoidmap(Objectkey,Textvalue,Contextcontext)publicvoidreduce(Textkey,Iterablevalues,Contextcontext)转化为代码落地,分别继承Mapper和Reducer这两个类,然后分别实现这两个defaults里面的方法来完成业务逻辑。所有复杂的业务都抽象为Map和Reduce两个函数计算。当我们面对复杂的具体业务功能时,我们可以通过Map和Reduce的多种自由组合来实现业务逻辑。当然,上面的程序需要在分布式系统中进行引擎调度,这个计算框架也叫MapReduce。因此,MapReduce不仅是一种编程模型,更是一种MapReduce代码程序和调度分布式计算的引擎框架。亮点:数据不出门,算法满天飞。对于每个任务计算,只需要将对应的任务分发到数据所在的服务器即可。避免大数据传输的性能损失。引入shuffle机制,将不同服务器的中间计算结果通过Partitioner取Key的哈希值取模,分组路由到Reduce服务器进行联合计算。该框架带有一个调度引擎。缺点:每个Map任务的计算结果都会写入本地文件系统,速度较慢。如果实现复杂的业务逻辑,通过Map-Reduce的多种自由组合,开发成本还是有点高。Tom哥有话要说:作为大数据框架的鼻祖,Hadoop在海量数据处理方面确实让我们眼前一亮。但完美总是需要不断的打磨。Hadoop在处理速度和开发门槛上有很多不足。慢慢的顺着达尔文的进化论,市场上开始百花齐放,各种优秀的大数据框架相继出现。Hive大数据时代,数据分析师的职位有很多。这些人擅长通过SQL进行数据分析和统计。SQL方式操作数据简单直接。与MapReduce代码相比,大大降低了编程难度,提高了开发效率。Hive通过执行引擎Driver记录Metastore元数据组件中数据表的信息(包括表名、字段名、字段类型、关联的HDFS文件路径)。运行过程:通过Hive的命令行工具或者JDBC提交SQL语句。Driver将语句提交给编译器,进行SQL解析、语法分析、语法优化等一系列操作,生成函数的DAG(有向无环图)。根据执行计划,生成MapReduce任务作业。最后提交给HadoopMapReduce计算框架进行处理。Tom大哥有话要说:Hive可以直接理解为Hadoop的API封装,使用SQL语法实现业务,底层仍然由MapReduce引擎执行,但转换逻辑由Hive作为一个通用模块实现。我们发现Hive在本质上并没有什么技术创新,只是将数据库和MapReduce有效的结合在一起,却为上层程序员提供了极大的开发便利。虽然在性能上没有质的飞跃,但是因为大大降低了开发门槛,所以在离线批处理中占有非常大的市场。Spark不管是MapReduce还是Hive,在执行速度上其实是很慢的,但是没有对比就没有伤害。直到Spark框架的出现,人们的认识也发生了很大的变化。Spark将大数据集合抽象成一个RDD对象,然后提供conversion和action两种算子函数,对RDD进行处理,得到一个新的RDD,然后继续进行后续的迭代计算,像Stream流一样顺序执行,直到任务结束。内部也使用分片,每个分片分配一个执行线程。传统的面向对象编程思想:将一个数据集作为输入参数传递给一个函数方法,计算后返回一个新的数据集。然后将这个新的数据集作为输入参数传递给下一个函数方法,直到计算完成并输出结果。如果这个数据集有1亿条记录,一共有两个函数操作,每个函数操作需要遍历1亿次,那么总的时间复杂度就是2亿次。函数式编程思想:将数据集转换成流,每个元素依次经过以上两个函数处理,最终得到一个新的结果集。整个过程只需要遍历一次,所以总的时间复杂度是1亿次。面对海量数据和更多的算子组合运算,这种累积的性能提升还是非常明显的。Spark的一些亮点:引入惰性计算,只有当开发者调用Actions算子时,才会执行之前的转换算子。以shuffle为界,DAG分为多个stage。可以将一个stage中的多个operator(如:textFile、flatMap、map)组合成一个task,然后利用上面的函数式编程思想来处理数据分片。使用内存中存储中间计算结果:通过这些出色的优化,Spark的运行速度比MapReduce快得多。上图是逻辑回归机器学习算法的运行时间对比,Spark比MapReduce快100多倍。当然,为了保留Hive的SQL优势,Spark还推出了SparkSQL,将SQL语句解析成Spark执行计划,在Spark上执行。Tom哥有话要说:Spark天生像猴孙,也有先天条件。Hadoop早期受限于内存容量和成本,但随着技术的进步,内存条件在Spark时代已经具备,架构思路也可以直接按照内存的标准来设计。有时候就是这样,时机成熟的时候,猪都能飞上天。要想成功,天时地利人和缺一不可。