Hive
以下复习内容包括架构、与MySql数据库的比较、四种By、小数据问题、两种常见数据倾斜问题和讲解、Hive的简单优化;
Hive的架构
Hive都是用别人来存东西,自己一点都不存,只负责翻译HQL成MR程序;

//客户端Client:
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
//Sql Parser和Physical Plan
把HQL语句翻译成对应的MR任务
//元数据Meta Store
元数据包括:表所属数据库(默认是default)、表的拥有者、表名及表的注释、字段及字段的注释、列/分区字段、表的类型(是否是外部表)、表数据所在目录(Hive表和HDFS的路径的映射)等,而表里面具体的内容则在HDFS里;
元数据默认存储在自带的derby数据库(小巧但是很多缺点,比如不支持并发连接,可以理解为轻量级的MySQL数据库)中,**一般都采用MySQL存储Metastore**(即换成用MySQL来存元数据,不用Derby)。
用户输入指令后,客户端根据建表时的映射关系,找到对应的表文件位置;
//结合Hadoop:
使用HDFS进行存储,使用MapReduce进行计算;
//驱动器:Driver(记住)
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化,比如大小表的Join问题。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。(驱动器将SQL命令转化为对应的MapReduce程序,生成相应jar包,再结合之前文件的位置,运行MapReduce程序)
HIVE和数据库比较(面试)
Hive不是数据库!他只是框架!!只是用法比较像,因为95%以上SQL语句都封装了MR程序,其实没什么可比性,只是语句很像。
1、查询语言
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2、数据更新
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对历史数据的改写,所有的数据都是在加载的时候确定好的。而数
据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据,虽然HQL也可以但是这样会慢,原理是先
下载修改后上传。
3、执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表(如果没有分区分桶,则都是暴力扫描,复杂度都是ALL),因此延迟较高。
另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延
迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
4、数据规模
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小,能用MySQL算的就不要用
Hive了。Hive可以部署在三个框架上( Apache Hadoop MapReduce, Apache Tez or Apache Spark)
Order by、Sort by、Distribute by、Cluster by比较:
//order by:全局排序,只有一个Reducer;(ASC、DESC)
//sort by:区内排序;单独用时会**随机**分区;sort by会根据数据量的大小启动一到多个reducer来干活,并且,它会在进入reduce之前为每个reducer都产生一个排序文件。这样的好处是提高了全局排序的效率。(每个reduce方法内排序)
//distribute by:根据具体对象进行分区,一般和sort by连用;对这个函数进行测试时,要分配多几个reduce进行处理,否则无法看到distribute by的效果;
(distribute by 控制map结果的分发,它会将具有相同字段的map输出分发到一个reduce节点上做处理);
比如:set mapreduce.jon.reduce =4;
distribute by会根据reduce的数目,结合by后面的列,做一个hash值处理,然后进行分区;
因为distribute by 通常和sort by 一起用,所以当distribute by 遇上 sort by时,distribute by要放在前面,这个不难理解,因为要先通过
distribute by 将待处理的数据从map端做分发,这样,sort by 这个擅长局部排序的才能去放开的干活。不然要是没有distribute by的分发,那么sort by 将
要处理全部的数据,即全局排序,这不是sor

本文详细介绍了Hive的架构,包括客户端、元数据、SQL解析和执行流程。Hive并非数据库,而是基于Hadoop的数据仓库工具,适合大规模数据处理。与数据库相比,Hive在数据更新、延迟和规模上有显著区别。讨论了Orderby、Sortby、Distributeby和Clusterby的区别,并深入讲解了分区和分桶的概念。此外,还介绍了Hive的优化策略,如小文件处理、JVM重用和数据倾斜的解决方法。在数据倾斜问题上,提出了预聚合和随机负载均衡的解决方案。最后,提到了空值分布问题及其处理方法。
最低0.47元/天 解锁文章
1462

被折叠的 条评论
为什么被折叠?



