Hive 调优总结

2023-11-02

1. 通常,可以通过设置属性hive.map.aggr值为true来提高聚合的性能。

hive.map.aggr=true;这个设置会触发在map阶段的“顶级”聚合过程。(非顶级的聚合过程将会在执行一个GROUP BY后进行)不过这个设置将需要更多的内存。

2. 无需MapReduce

也就是所谓的本地模式。Hive可以简单的读取employees对应目录下的文件。例如:
select * from employees;
或者加where和limit也是可以的。
此外,如果属性hive.exec.mode.local.auto=true的话,Hive会尝试使用本地模式执行其他操作。(非常推荐)

3. 浮点数比较问题FLOAT 0.2>DOUBLE 0.2

由于0.2对于FLOAT类型是0.2000001,而对于DOUBLE类型是0.200000000001,当二者比较是FLOAT会转成DOUBLE 0.200000100000,这个值实际要比0.200000000001大。

规避办法:

  1. 对于TEXTFILE文件,读取字符串“0.2”,可以直接在表模式中定义类型为DOUBLE。
  2. 显式地指出0.2为FLOAT类型。如:cast(0.2 AS FLOAT)
  3. 和金钱相关都避免使用浮点数
    Note: 对于浮点数比较,需保持极端谨慎的态度。

4. LIKE与RLIKE

LIKE模糊查询,RLIKE是一个扩展支持正则匹配

5. JOIN语句,Hive只支持等值连接,即ON a.id = b.id,

原因是由于MapReduce很难实现这种非等值的连接。

大多数情况下,Hive会对每对JOIN连接对象启动一个MapReudce任务。例:a JOIN b ON a.ymd = b.ymd JOIN c ON a.ymd = c.ymd。首先启动MapReduce对a和b进行连接操作,然后再启动一个MapReduce将第一个MapReduce job的输出和c进行连接操作。这是因为Hive总是按照从左到右的顺序执行的。

6. JOIN优化

  1. 自动优化:当对3个或者更多的表进行JOIN连接时,如果每个ON子句都是用相同的连接键的话,那么只会产生一个MapReduce job。如上例中都是用ymd作为键,就会自动优化为1个MapReduce job。
  2. 在做连接操作时,Hive会将前面对表缓存,然后扫描最后的表进行计算。因此,用户需要保证连续查询中的表的大小从左到右依次增加的(小 JOIN 中 JOIN 大)。
  3. 通过“标记”显示地告诉优化器哪张表是大表。SELCET /*+STREAMTABLE(a)*/a.id, a.name from table1 a JOIN table2 b ON a.id = b.id;
  4. map-side JOIN(非常推荐)
    完全将小表放到内存,从而省略掉连接的reduce过程。
    使用标记/*+MAPJOIN(d)*/
    set hive.auto.convert.join=true;
  5. OUTER JOIN 优化,尽量不对大量NULL的字段进行WHERE的条件。WHERE在JOIN后执行,应该只作用于过滤那些非NULL字段。
  6. LEFT SEMI-JOIN
    Hive不支持... WHERE a.id IN (SELECT d.id from table_d d) 但可以使用左半开连接SELECT a.id, a.name FROM table_a a LEFT SEMI JOIN table_d d ON a.id = d.id;注意,SELECT和WHERE都不能用到右边表的字段。SEMI-JOIN比INNER JOIN更高效,因为:对于左表中一条指定的记录在右表中一旦找到匹配的记录就会停止扫描。
  7. 笛卡尔积JOIN(无ON子句):Hive无法优化

7. ORDER BY, SORT BY, DISTRIBUTE BY

ORDER BY全局排序是非常耗时的,如非必要可以使用SORT BY(reduce中局部排序)替代,但在不同的reducer中数据可能会有重合。DISTRIBUTE BY控制map的输出在reducer中是如何划分的,通常不用关心。Distribute by可以结合SORT BY,将相同的数据发送到同一个reducer中,这样可以避免不同reducer中的数据重合。SELECT s.ymd, s.symbol, s.price FROM stocks s DISTRIBUTE BY s.symbol SORT BY s.symbol ASC, s.ymd ASC;
ASC是可以省略的。Hive要求DISTRIBUTE BY需要写到SORT BY之前。
Cluster B y = 对同一字段的Distribute By + Sort By ASC只能升序

8. 类型转换不合法的情况

cast(value AS FLOAT)如果value不是合法的FLOAT,Hive会返回NULL

9. 分桶的优点

  • 分区提供一个隔离数据和优化查询的便利的方式。不过,并非所有的数据集都可以形成合理的分区,特别是确定合适的划分大小。
  • 分桶,是将数据集分解成更容易管理的若干部分的另一个技术。通过给定字段(user_id)的哈希值放到同一个桶内。同一个user_id就会存在于同一个桶内。
  • 如果没有使用hive.enforce.bucketing属性,就需要自己设置和分桶个数相匹配的reducer个数,例如:使用set mapred.reduce.tasks=96,然后需要在SELECT语句后增加CLUSTER BY
  • 因为桶的数量是固定的,所以他没有数据波动,桶对于抽样再适合不过。
  • 分桶有利于高效的执行map-side JOIN。

10. 限制调整

LIMIT在很多情况下还是需要执行整个查询语句,然后再返回部分结果。Hive提供一个设置在使用LIMIT语句是,可以对源数据进行抽样:hive.limit.optimize.enable=true,一旦设置为true,那么还有连个参数可以控制这个操作hive.limit.orw.max.sizehive.limit.optimize.limit.file
唯一的缺点,有可能输入中有用的数据永远不会被处理到。例如:任意的一个需要reudce步骤的查询,JOIN和GROUP BY操作,以及聚合函数的大多数调用,将会产生很不同的结果。也许这个差异在很多情况下是可以接受的,但是重要的是要理解。

11. 并行执行

Hive会将一个查询转换为多个MapReduce阶段,在无必要依赖的阶段之间可以并行执行。hive.exec.parallel=true开启,hive.exec.parallel.number=16设置并行度。

12. 调整mapper和reducer个数

  1. Hive是按照输入的数据量大小来确定reducer个数的,我们可以通过dfs -count命令老计算输入量大小。
  2. 有些情况map产生比实际多得多的数据,那么根据输入数据量来确定reducer个数就显得有些少了。因此,在map阶段尽量过滤掉不需要的数据就更好的满足reduce的计算。
  3. 通常也会通过hive.exec.reducers.max设置reduce个数的上限,防止耗尽共享集群的资源。
  4. 小文件合并:
    a) 在map执行前合并小文件较少map数set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    b) 在map-only任务结束是合并小文件,默认true set hive.erge.mapfiles = true;
    c) 合并文件大小,默认256Mset hive.merge.size.per.task = 268435456;
    d) 当输出文件的平均大小小于该值时,启动一个独立的MR Job进行mergeset hive.merge.smallfiles.avgsize = 16777216;
  5. 设置reduce个数
    a) 每个reduce处理的数据:hive.exec.reducers.bytes.per.reducer=256000000
    b)每个任务最大的reduce数,默认1009:hive.exec.reducers.max=1009
    c) 计算reducer数的公式:N = min(参数2,总输入数据量/参数1)

13. JVM 重用

由于每一个MapReduce的task都要启动一个JVM,如果是有很多小文件的场景,就会消耗过多的时间在初始化资源上。可以通过mapred.job.reuse.jvm.num.tasks指定重用JVM的个数。缺点:直到所有任务完成后才会释放。一旦出现某个“不平衡”的job一直无法完成工作(倾斜),其他的reduce task需要一直等待。

14. 索引

Hive v0.8.0 版本后增加了bitmap索引实现。索引可以用来加快GROUP BY的查询速度。

15. 推测执行

16. 单个MapReduce中多个GROUP BY

试图将多个GROUP BY操作组装到单个MapReduce。如果想启动这个优化,那么需要一组常用的GROUP BY键:hive.multigroupby.singlemr=false

17. 虚拟列

Hive提供了2种虚拟列便于定位数据和调试:一种用于将要进行划分的输入文件名,另一种用于文件中的块内偏移量。

hive> select INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE,order_id from orders limit 10;
OK
input__file__name	block__offset__inside__file	order_id
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	90	2539329
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	114	2398795
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	142	473747
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	169	2254736
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	197	431534
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	224	3367565
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	252	550135
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	279	3108588
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	307	2295261
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	334	2550362
Time taken: 0.068 seconds, Fetched: 10 row(s)

第三种虚拟列提供了文件的行偏移量,需要通过参数显示的启动。

<property>
    <name>hive.exec.rowoffset</name>
    <value>true</value>
</property>
hive> select INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK,order_id from orders limit 10;
OK
input__file__name	block__offset__inside__file	row__offset__inside__block	order_id
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	90	0	2539329
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	114	0	2398795
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	142	0	473747
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	169	0	2254736
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	197	0	431534
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	224	0	3367565
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	252	0	550135
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	279	0	3108588
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	307	0	2295261
hdfs://node1:9000/user/hive/warehouse/orders/orders.csv	334	0	2550362
Time taken: 1.191 seconds, Fetched: 10 row(s)
hive> 

18. HiveQL

Hive不支持行级插入操作、更新操作和删除操作。Hive也不支持事务。

19. 关于分区

使用过多的分区可能导致大量的文件。因此,一个理想的分区方案不应该导致产生太多的分区和文件夹目录,并且每个目录下的文件应该足够得大,应该是文件系统中块大小的若干倍。
按照时间分区,随着时间的推移分区数量的增长是“均匀的”。一个分区是一个目录,一个分桶是一个文件。

20. 常用验证结果的方法

将查询结果导入文件中:

insert overwrite local directory
'/opt/module/hive/datas/ortby-result'
select * from emp sort by depton desc;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive 调优总结 的相关文章

  • 如何从 hive cli 运行 hive 脚本

    我现在有 hive 脚本 custsales hql 我想从 hive cli 运行它 hive pract5 gt run user training hdfs location custsales hql 但它不执行 请指导 我知道我们
  • 在 HIVE 中选择该月的第一天

    我正在使用 Hive 它与 SQL 类似 但对于 SQL 用户来说语法可能略有不同 我看过其他的stackoverflow 但它们似乎在SQL中具有不同的语法 我试图通过此查询获取该月的第一天 这给了我今天的一天 例如 如果今天是 2015
  • 根据列删除配置单元中的重复行

    我有一个包含 10 列的 HIVE 表 其中前 9 列将有重复的行 而第 10 列则不会 因为 CREATE DATE 将具有创建日期 例子 如果我今天在表中插入 10 行 它将具有 CREATE DATE 作为今天的日期 如果我明天再次插
  • 如何通过Spark Thrift Server访问自定义UDF?

    我正在 EMR 上运行 Spark Thrift 服务器 我通过以下方式启动 Spark Thrift 服务器 sudo u spark usr lib spark sbin start thriftserver sh queue inte
  • 将 Hive 表导出到 hdfs 中的 csv

    我知道在 Hive 中将表保存到 csv 或其他文本文件 时 分隔符存在一个已知问题 所以我想知道你们是否可以帮助我解决这个问题 我有一个现有的表 表 A 我想将其以 csv 格式保存到 hdfs 通过阅读其他回复 我相信我必须首先创建一个
  • Spark SQL 未正确转换时区[重复]

    这个问题在这里已经有答案了 使用 Scala 2 10 4 和 Spark 1 5 1 和 Spark 1 6 sqlContext sql select id to date from utc timestamp from unixtim
  • 在 Hive 中分解一行 XML 数据

    我们将 XML 数据作为名为 XML 的单个字符串列加载到 Hadoop 中 我们正在尝试检索数据级别 并将其标准化或分解为单行进行处理 你知道 就像表格一样 已经尝试过分解功能 但没有得到我们想要的 示例 XML
  • 连接到 Hive 时使用 Spark 进行 Kinit

    我正在尝试从独立的 Spark 连接到 Hive hadoop 集群具有 kerberos 身份验证 有人可以让我知道如何在 Spark 程序中执行 kinit 我可以连接到配置单元吗 更新 我的 Spark 与 Hadoop 位于不同的集
  • Hive ParseException - 无法识别“结束”“字符串”附近的输入

    尝试从现有 DynamoDB 表创建 Hive 表时出现以下错误 NoViableAltException 88 at org apache hadoop hive ql parse HiveParser IdentifiersParser
  • Hive查询快速查找表大小(行数)

    是否有 Hive 查询可以快速查找表大小 即行数 而无需启动耗时的 MapReduce 作业 这就是为什么我想避免COUNT I tried DESCRIBE EXTENDED 但这产生了numRows 0这显然是不正确的 对新手问题表示歉
  • Spark JDBC 仅返回带有列名的数据帧

    我正在尝试使用 Spark JDBC 连接到 HiveTable 代码如下 val df spark read format jdbc option driver org apache hive jdbc HiveDriver option
  • Spark 上的 Hive 2.1.1 - 我应该使用哪个版本的 Spark

    我在跑蜂巢2 1 1 Ubuntu 16 04 上的 hadoop 2 7 3 根据Hive on Spark 入门 https cwiki apache org confluence display Hive Hive on Spark
  • 将日期字符串转换为“MM/DD/YY”格式

    我刚刚看到这个例子 我该如何解决这个问题 Hive 元存储包含一个名为 Problem1 的数据库 其中包含一个名为 customer 的表 customer 表包含 9000 万条客户记录 90 000 000 每条记录都有一个生日字段
  • 当气流 initdb 时,导入错误:无法导入名称 HiveOperator

    我最近安装了airflow对于我的工作流程 在创建项目时 我执行了以下命令 airflow initdb 返回以下错误 2016 08 15 11 17 00 314 init py 36 INFO Using executor Seque
  • 如何将Hive数据表迁移到MySql?

    我想知道如何将日期从 Hive 转移到 MySQL 我看过有关如何将 Hive 数据移动到 Amazon DynamoDB 的示例 但没有看到有关如何将 Hive 数据移动到 MySQL 等 RDBMS 的示例 这是我在 DynamoDB
  • 当从 HDFS 手动删除分区数据时,如何更新 Hive 中的分区元数据

    自动更新Hive分区表元数据的方法是什么 如果新的分区数据被添加到HDFS 不执行alter table添加分区命令 然后我们可以通过执行命令 msck Repair 来同步元数据 如果从HDFS中删除了大量分区数据 没有执行alter t
  • 我们可以预测 Hive SELECT * 查询结果的顺序吗?

    是否有可能a的结果的顺序SELECT query no ORDER BY 如果使用相同的 DBMS 作为 Metastore 那么总是相同的吗 所以 只要使用MySQL作为Metastore 结果的顺序就为aSELECT 查询将始终相同 如
  • 使用 Hiveql 循环

    我正在尝试合并 2 个数据集 例如 A 和 B 数据集 A 有一个变量 Flag 它有 2 个值 我并没有只是将两个数据合并在一起 而是尝试根据 标志 变量合并两个数据集 合并代码如下 create table new data as se
  • 获取从开始日期到结束日期的活跃周数

    我的订阅数据如下所示 数据显示用户何时购买订阅 它有user id subscription id start date and end date 我已经得出wk start and wk end从中 user subscription i
  • Hive:在查询中将 array 转换为 array

    我有两张桌子 create table a 1 array

随机推荐

  • 【NLP】第 3 章 :BERT

    在本章中 您将学习由 Google 开发的 Transformer 架构的实现之一 称为 BERT Google AI Language 的研究人员最近所做的工作导致发表了一篇名为 BERT 来自变形金刚的双向编码器表示 的论文 BERT取
  • 模拟get和post请求

    一 模拟请求 浏览器及工具模拟 http请求有很多种 常用的请求方式有两种 get请求和post请求 今天先介绍浏览器以及工具模拟请求 下次会介绍代码模拟 1 get请求格式 url param1 value1 param2 value2
  • 阿里云OSS使用Java上传文件

    一 准备工作 1 1登录阿里云点击对象存储OSS 1 2 先点击Bucket 列表 在点击创建Bucket 1 3 根据自己需求勾选 然后点击确定 1 4 新建好之后 点击bucket名称 1 5 点击文件管理 1 6 在这个页面就可以实现
  • 常用正则表达式

    英文单词 public static final String REGEX WORD EN w 中文 public static final String REGEX WORD CN u4E00 u9FA5 6到30位 数字 字符 常用于用
  • 解决windows 您没有权限访问\\192.168.1.X(局域网) 请与网络管理员联系请求访问权限

    解决windows 您没有权限访问 192 168 1 X 局域网 请与网络管理员联系请求访问权限 今天哥们发来一张图 就是下图 说无法访问局域网内的数据了 这个问题咋处理 那就重头说这个事儿 先写一篇这个问题 正好本博客内还木有 出现这个
  • QueryWrapper查询查询时间空值排序空值放在最后

    代码如下 QueryWrapper
  • RFID智能汽车制造管理系统解决方案

    RFID智能汽车制造管理系统解决方案 1 项目背景 1 1 行业背景 在汽车行业快速发展竞争日益激励的背景下 各个汽车制造商都在追求管理系统的优化 已从开始的只追求最终结果的最优 发展到目前要求使制造汽车的每个环节都达到最优的目的 这就给管
  • 图像处理之卷积模式及C++实现

    1 卷积的三种模式 深度学习框架中通常会实现三种不同的卷积模式 分别是 SAME VALID FULL 这三种模式的核心区别在于卷积核进行卷积操作的移动区域不同 进而导致输出的尺寸不同 我们以一个例子来看这三种模式的区别 输入图片的尺寸是5
  • 服务器iis如何开启tlsv1.2协议,利用IIS Crypto V3.2开启IIS服务器TLS1.2的具体操作流程...

    今天客户给我反馈了一个在网站安装SSL证书后 网站https显示异常的问题 就是在谷歌浏览器下 会提示 您的连接存在安全隐患 访问被阻止 如下 如果继续强制浏览 会提示 你与此网站之间建立的连接并非完全安全 攻击者可能能够看到您正在此网站上
  • Command Prompt 常用命令

    一 CD Change Directory 改变现在指向的文件夹 1 去到最根的目录 cd 例如去到C盘 2 去某一文件夹 例如去C盘的logs文件夹 cd windows logs 3 返回上一级文件夹 cd 二 指向去另一个盘 指向另一
  • 解决PCCAD出现的致命错误Unhandled Access Violation ....

    最近公司电脑貌似很多的员工在打开pccad里面的TK的时候出现如下的界面 于是就开始认为是office的问题 在卸载了office之后 问题是解决了 不过总不能不叫员工使用office软件吧 于是乎不得不又装上了office 但是不是off
  • AD20-DRC检查

    点击下图中的红圈内选项 就会出现 第一个红圈可不勾选 可以不创建报告文件 第二个红圈中的填的稍微大一点 接下来就是 红圈中是安全间距检查 勾选可以检查板子中的安全间距 之后点击左下角的运行DRC 就行了 板子中有错误的话就会报错 有错改错就
  • adopt_lock 和 defer_lock 的区别

    c 中 lock guard 通过 raii 机制实现了自动上锁和解锁互斥量 基本用法为 static std mutex io mutex std lock guard
  • IDEA如何添加多Git源

    一 添加多Git源 选择IDEA顶部VCS菜单 再选择Git 点击Remotes 然后弹窗中点击 号添加 再弹窗中输入名字和git的地址 最后点击OK 另外一个Git源就加进来了 二 如何添加新的Git源的远程分支 选择IDEA顶部VCS菜
  • java搜索文本内容_JAVA 搜索文本文件中的关键字

    原文链接 http blog net blog abel article details 40858245 用JAVA实现对文本文件中的关键字进行搜索 依据每一行 得到每一行中出现关键词的个数 使用java io LineNumberRea
  • 如何理解js中基本数据类型的值不可变

    js的数据类型 在讲解我们要说明的问题之前 需要知道js有哪些数据类型 js有两种数据类型 基本数据类型和引用数据类型 基本数据类型 number string boolean undefined null symbol 在 Java 中
  • 入门学习-Python-小甲鱼学习资料-Day010-列表:一个打了激素的数组1

    标题 根据视频自己练习 Append 和 extend Appen 添加单个元素 extend添加多个元素 但是要以数组形式 Insert 插入元素的时候可以定义插入的位置 注意 是从0开始计数 从0开始才是python的默认 标题 课后练
  • java简单五子棋源代码

    package com renyou import java awt Color import java awt Dimension import java awt FlowLayout import java awt Graphics i
  • 与ln的指数转化公式_指数函数与对数函数的转换

    有时对数运算比指数运算来得方便 因此以指数形式出现的式子 可利用取对数的方法 把指数运算转化为对数运算 用高等数学计算的老旧的纹理古文纸 解题技巧 转化的思想是一个重要的数学思想 对数式与指数式有着密切的关系 在解决有关问题时 经常进行着两
  • Hive 调优总结

    1 通常 可以通过设置属性hive map aggr值为true来提高聚合的性能 hive map aggr true 这个设置会触发在map阶段的 顶级 聚合过程 非顶级的聚合过程将会在执行一个GROUP BY后进行 不过这个设置将需要更