`
superlxw1234
  • 浏览: 554121 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44783
社区版块
存档分类
最新评论

[一起学Hive]之十二-Hive SQL的优化

    博客分类:
  • hive
阅读更多

关键字: Hive 优化、HQL 优化、Hive数据倾斜

 

 

十一、Hive SQL的优化

 

本章只是从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分布不均匀

 

业务数据本身特点

 

这里列出一些常用的数据倾斜解决办法:

 

  1. 使用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来变通实现。

 

  1. 使用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的优化,作为分布式计算模型,其最核心的地方就是要确保每个节点上分布的数据均匀,才能最大程度发挥它的威力,否则,某一个不均匀的节点就会拖后腿。

 

 

 

Hive相关文章(持续更新)

 

一起学Hive系列

 

—-Hive概述,Hive是什么

 

—-Hive函数大全-完整版

 

—-Hive中的数据库(Database)和表(Table)

 

—-Hive的安装配置

 

—-Hive的视图和分区

 

—-Hive的动态分区

 

—-向Hive表中加载数据

 

—-使用Hive命令行

 

—-Hive的查询语句SELECT

 

—-Hive中Join的原理和机制

 

—-Hive中Join的类型和用法

 

Hive分析函数系列

 

Hive索引

 

hive优化之——控制hive任务中的map数和reduce数

2
1
分享到:
评论
1 楼 annmi_cai 2016-03-11  
好好学习,天天向上!

相关推荐

    scala-hive-HBASE-Api.7z

    2. **Hive**:Apache Hive是由Facebook开源的一个数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL(HQL,Hive Query Language)查询功能,方便大数据分析。Hive主要针对大规模数据集进行...

    PyPI 官网下载 | hive_bt-0.0.4.tar.gz

    2. **SQL查询**:可能包含封装HQL(Hive Query Language)的函数,使用户能够以Python API的方式执行复杂的SQL查询。 3. **数据处理**:`hive_bt`可能提供了一些用于清洗、转换和预处理Hive数据的工具。 4. **分析...

    Hive编程指南-by-_美_Edward-Capriolo Dean-Wampler Jason-Rutherglen-著-_

    Hive作为大数据处理的重要工具,它提供了SQL-like的查询语言HiveQL,使得非程序员也能方便地进行数据分析。 在Hadoop生态系统中,Pig和HBase是与Hive相关的其他重要组件。Pig提供了一种高级数据流语言,用于构建...

    hive

    6. **优化器**:Hive 内置的查询优化器可以自动转换 SQL 查询为高效的 MapReduce 任务。它考虑了各种因素,如表大小、数据分布、JOIN 操作等,以生成最优的执行计划。 7. **数据生命周期管理**:Hive 提供了数据...

    HIVE和HBASE区别

    HIVE和HBASE是两种基于Hadoop的不同技术--HIVE是一种类SQL的引擎,并且运行MapReduce任务,HBASE是一种在Hadoop之上的NoSQL的Key/Value数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用Facebook...

    Programming Hive

    Hive是一个建立在Hadoop之上的数据仓库工具,它提供了一种类似于SQL的语言(HiveQL)来查询存储在HDFS中的数据。Hive使得对大数据集的查询变得简单和直观,特别是对于那些熟悉SQL的用户。在知识方面,这本书可能会...

    伪分布模式hadoop软件1,和hive_3,sqoop_2搭配使用

    - Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。 - 下载Hive的对应版本,确保与Hadoop版本兼容。 - 将Hive解压到Hadoop的根目录下,这样它们共享相同的...

    03_Hive.docx

    因此,可以说 Hive 是建立在 Hadoop 之上的数据仓库系统。 #### 二、Hive的特点 1. **存储依赖**:Hive 使用 HDFS (Hadoop Distributed File System) 来存储数据。 2. **计算依赖**:Hive 使用 MapReduce 或其他...

    19:Flume+HBase+Hive集成大数据项目离线分析.rar

    这个“19:Flume+HBase+Hive集成大数据项目离线分析”的压缩包文件提供了关于如何将这三个工具集成到一起进行离线数据分析的详细教程。以下是关于这些技术的重点知识点: 1. **Flume**: Flume 是 Apache 提供的一个...

    hive_data.rar

    在大数据处理领域,Apache Hive是一个非常重要的工具,它提供了一个SQL-like接口来处理存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。"hive_data.rar"这个压缩包文件显然是为Hive学习和测试而设计的,包含了...

    HDFS+MapReduce+Hive+HBase十分钟快速入门.zip_hbase_hdfs_hive_mapReduce

    Hive是基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)样的查询语言来处理HDFS上的大数据集。Hive提供了数据仓储、元数据管理、查询和分析等功能,使得非Java背景的开发人员也能轻松处理...

    Hive高级编程经验分享.pdf

    在大数据处理领域,Apache Hive是一个广泛使用的数据仓库工具,它允许用户通过SQL(Hive QL)查询语言来处理存储在分布式存储系统如HDFS上的大规模数据集。本篇文章将深入探讨Hive的组件、MapReduce的工作原理以及...

    大数据 虚拟机 Linux VM复习题库:题库包括了60题选择题、10题填空题、10题判断题、2题简答题,助你度过期末复习

    【大数据虚拟机Linux VM复习题库】主要涵盖...以上知识点涵盖了大数据处理中的Hive操作、查询优化、数据仓库概念、以及Hive与数据库系统的对比等方面,有助于理解Hadoop生态中Hive的重要作用及其在大数据分析中的应用。

    毕业设计:基于Spark+Kafka+Hive的智能货运系统设计与实现.zip

    - **数据集成**:如何将来自不同来源的数据整合到一起,例如将Kafka中的实时数据与Hive中的历史数据进行融合分析。 - **数据清洗与预处理**:在Spark中处理原始数据,去除噪声,填充缺失值,转换数据格式等。 - **...

    Hadoop_Hive_Project:NYU CSCI-GA.3033-003的课程项目

    Hadoop是一个开源框架,用于存储和处理大规模数据,而Hive则是一个基于Hadoop的数据仓库工具,提供了SQL-like查询语言(HQL)来简化大数据分析。 **Hadoop**: 1. **分布式文件系统(HDFS)**:Hadoop的核心组成...

    伪分布式的Hadoop+Hive+HBase搭建记录[收集].pdf

    Hive是建立在Hadoop之上的数据仓库工具,它允许用户使用SQL(HQL,Hive SQL)语言进行数据查询、分析和管理。Hive将SQL语句转化为MapReduce任务执行,提供了对大型数据集的高效分析能力。尽管Hive的查询速度相比传统...

    实验3MyJoin1

    - **数据建模**:Hive是SQL-on-Hadoop工具,允许用户通过SQL语句来查询和管理存储在HDFS上的大数据。在实验中,需要使用Hive创建名为`orders`的表,定义表结构,指定列名及类型,并设置数据分隔符和数据存储位置。 ...

    impala单机部署手册

    Impala 是 Cloudera 提供的一款高效率的 SQL 查询工具,提供实时的查询效果,官方测试性能比 Hive 快 10 到 100 倍,其 SQL 查询比 SparkSQL 还要更加快速,号称是当前大数据领域最快的查询 SQL 工具。Impala 是参照...

Global site tag (gtag.js) - Google Analytics