本章只是从HQL层面介绍一下,日常开发HQL中需要注意的一些优化点,不涉及Hadoop层面的参数、配置等优化。
其中大部分是我之前发过的博客文章,这里整理了下。
11.1 使用分区剪裁、列剪裁
在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。
在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤,比如:
SELECT a.id
FROM lxw1234_a a
left outer join t_lxw1234_partitioned b
ON (a.id = b.url);
WHERE b.day = ‘2015-05-10′
正确的写法是写在ON后面:
SELECT a.id
FROM lxw1234_a a
left outer join t_lxw1234_partitioned b
ON (a.id = b.url AND b.day = ‘2015-05-10′);
或者直接写成子查询:
SELECT a.id
FROM lxw1234_a a
left outer join (SELECT url FROM t_lxw1234_partitioned WHERE day = ‘2015-05-10′) b
ON (a.id = b.url)
11.2 少用COUNT DISTINCT
数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换:
SELECT day,
COUNT(DISTINCT id) AS uv
FROM lxw1234
GROUP BY day
可以转换成:
SELECT day,
COUNT(id) AS uv
FROM (SELECT day,id FROM lxw1234 GROUP BY day,id) a
GROUP BY day;
虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。
11.3 是否存在多对多的关联
只要遇到表关联,就必须得调研一下,是否存在多对多的关联,起码得保证有一个表或者结果集的关联键不重复。
如果某一个关联键的记录数非常多,那么分配到该Reduce Task中的数据量将非常大,导致整个Job很难完成,甚至根本跑不出来。
还有就是避免笛卡尔积,同理,如果某一个键的数据量非常大,也是很难完成Job的。
11.4 合理使用MapJoin
关于MapJoin的原理和机制,请参考 [一起学Hive]之十 。
MapJoin中小表的大小可以用参数来调节。
11.5 合理使用Union All
对同一张表的union all 要比multi insert快的多。
具体请见:
http://superlxw1234.iteye.com/blog/1536440
11.6 并行执行Job
用过oracle rac的应该都知道parallel的用途。
并行执行的确可以大的加快任务的执行速率,但不会减少其占用的资源。
在hive中也有并行执行的选项。
具体请见:
http://superlxw1234.iteye.com/blog/1703713
11.7 使用本地MR
如果在hive中运行的sql本身数据量很小,那么使用本地mr的效率要比提交到Hadoop集群中运行快很多。
具体请见:
http://superlxw1234.iteye.com/blog/1703546
11.8 合理使用动态分区
参见 [一起学Hive]之六-Hive的动态分区
http://lxw1234.com/archives/2015/06/286.htm
11.9 避免数据倾斜
数据倾斜是Hive开发中对性能影响的一大杀手。
- 症状:
任务迚度长时间维持在99%(或100%);
查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。
本地读写数据量很大。
- 导致数据倾斜的操作:
GROUP BY, COUNT DISTINCT, join
- 原因:
key分布不均匀
业务数据本身特点
这里列出一些常用的数据倾斜解决办法:
- 使用COUNT DISTINCT和GROUP BY造成的数据倾斜:
存在大量空值或NULL,或者某一个值的记录特别多,可以先把该值过滤掉,在最后单独处理:
SELECT CAST(COUNT(DISTINCT imei)+1 AS bigint)
FROM lxw1234 where pt = ‘2012-05-28′
AND imei <> ‘lxw1234′ ;
比如某一天的IMEI值为’lxw1234’的特别多,当我要统计总的IMEI数,可以先统计不为’lxw1234’的,之后再加1.
多重COUNT DISTINCT
通常使用UNION ALL + ROW_NUMBER() + SUM + GROUP BY来变通实现。
- 使用JOIN引起的数据倾斜
关联键存在大量空值或者某一特殊值,如”NULL”
空值单独处理,不参与关联;
空值或特殊值加随机数作为关联键;
不同数据类型的字段关联
转换为同一数据类型之后再做关联
11.10 控制Map数和Reduce数
参见http://lxw1234.com/archives/2015/04/15.htm
11.11 中间结果压缩
参见 http://superlxw1234.iteye.com/blog/1741103
11.12 其他
- 在MapReduce的WEB界面上,关注Hive Job执行的情况;
- 了解HQL -> MapReduce的过程;
- HQL优化其实也是MapReduce的优化,作为分布式计算模型,其最核心的地方就是要确保每个节点上分布的数据均匀,才能最大程度发挥它的威力,否则,某一个不均匀的节点就会拖后腿。
相关推荐
5. **测试和优化**:编写测试用例,确保解析器能够正确处理各种复杂的Hive SQL查询,同时优化性能,降低资源消耗。 6. **实现元数据追踪**:如果题目涉及到“线系”(lineage),可能还需要追踪查询中的数据来源和...
### 深入浅出Hive企业级架构优化 #### Hive概述 Apache Hive 是一个基于 Hadoop 的数据...总之,通过对 Hive 架构、SQL 语句、数据压缩以及分布式缓存等方面的综合优化,可以有效提升 Hive 在企业级应用中的表现。
HiveSQL详细和优化,以及部分个人点评 This is a brief tutorial that provides an introduction on how to use Apache Hive HiveQL with Hadoop Distributed File System. This tutorial can be your first step ...
### HiveSQL优化手册 #### 数据倾斜优化 **数据倾斜**是指在执行Hive查询时,由于数据分布不均,导致一部分任务处理的数据量远大于其他任务的现象,这将严重影响整个查询的性能。针对数据倾斜问题,可以从以下几个...
深入浅出Hive企业级架构优化、Hive Sql优化,视频!!!
理解Hive SQL的编译过程对于解决Hive的问题、优化SQL查询和定制功能至关重要。通过对MapReduce实现SQL操作原理的深入理解,我们可以更好地掌握Hive的工作机制,从而提高数据分析的效率和准确性。在日常工作中,这样...
### Hive SQL优化技巧详解 #### 一、数据倾斜优化 数据倾斜是指在Hive查询过程中,数据不均匀地分布在不同的Reducer上,导致某些Reducer处理的数据量远大于其他Reducer,从而影响整个查询性能的问题。解决数据倾斜...
#### 三、Hive SQL优化技巧与注意事项 1. **列裁剪和分区裁剪**: - **分区裁剪**:通过WHERE子句中的条件来指定查询特定的分区,避免全表扫描,显著提高查询效率。 - **列裁剪**:仅选择需要的列,减少数据传输...
本文将深入探讨HiveSQL的编译过程,包括词法分析、语法分析、优化以及执行计划生成等关键步骤。 1. **词法分析**:这是编译过程的第一步,也称为扫描或Tokenization。HiveSQL的解析器接收用户输入的SQL语句,将其...
总结起来,《最强HiveSQL开发指南》全面涵盖了Hive的基本操作、查询语法、性能优化策略及实战经验,是学习和提升Hive技能的宝贵资源。通过深入学习和实践,读者可以更好地驾驭Hive,应对大数据环境下的各种挑战。
总结,Hive SQL开发规范强调了正确选择数据类型、合理设计表结构、优化查询性能以及遵循安全原则的重要性。理解并遵循这些规范,将帮助开发者写出高效、稳定的Hive查询,实现大数据分析的目标。
HiveQL是Hive的SQL方言,支持常见的SQL操作,如SELECT、FROM、WHERE、GROUP BY等,同时也有针对大数据处理的独特功能,如分桶(Bucketing)、分区(Partitioning)和倾斜Join(Skewed Join)优化。 3. **数据模型*...
Hive思维导图之Hive优化
### HiveSQL解析原理详解 #### 一、引言 Hive作为一款建立在Hadoop之上的数据仓库系统,被广泛应用于大数据处理场景中。对于众多企业和组织而言,它不仅是存储和管理海量数据的有效手段,同时也是进行数据分析的...
### SQL汉字转拼音首字母知识点解析 #### 一、背景介绍 在数据库处理过程中,有时候我们需要将汉字转换为对应的拼音,特别是在中文环境下的数据检索、排序等操作中,这种需求尤为常见。本篇文章将深入探讨如何利用...
Hive与SQL优化.md
### HIVE-SQL操作语句详解 #### 一、创建表 (CREATE TABLE) 在Hive中,`CREATE TABLE` 语句用于创建新的表。与传统的关系型数据库类似,但在Hive中有其特殊之处。 ##### 示例 ```sql hive> CREATE TABLE pokes ...
以下是一些针对Hive性能优化的常见策略: 1. **开启Hive压缩**:压缩可以显著减少数据存储空间,加快读取速度。可以开启Hive的中间数据和最终数据压缩,使用`hive.exec.compress.output=true`和`hive.exec.compress...