hive参数hive.mapred.mode分析

2024-06-10 04:38
文章标签 分析 参数 hive mode mapred

本文主要是介绍hive参数hive.mapred.mode分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hive配置中有个参数hive.mapred.mode,分为nonstrict,strict,默认是nonstrict

如果设置为strict,会对三种情况的语句在compile环节做过滤:

1. 笛卡尔积Join。这种情况由于没有指定reduce join key,所以只会启用一个reducer,数据量大时会造成性能瓶颈

 

 
  1. // Use only 1 reducer in case of cartesian product

  2. if (reduceKeys.size() == 0) {

  3. numReds = 1;

  4.  
  5. // Cartesian product is not supported in strict mode

  6. if (conf.getVar(HiveConf.ConfVars.HIVEMAPREDMODE).equalsIgnoreCase(

  7. "strict")) {

  8. throw new SemanticException(ErrorMsg.NO_CARTESIAN_PRODUCT.getMsg());

  9. }

  10. }

 

 

2. order by后面不跟limit。order by会强制将reduce number设置成1,不加limit,会将所有数据sink到reduce端来做全排序。

 

 
  1. if (sortExprs == null) {

  2. sortExprs = qb.getParseInfo().getOrderByForClause(dest);

  3. if (sortExprs != null) {

  4. assert numReducers == 1;

  5. // in strict mode, in the presence of order by, limit must be specified

  6. Integer limit = qb.getParseInfo().getDestLimit(dest);

  7. if (conf.getVar(HiveConf.ConfVars.HIVEMAPREDMODE).equalsIgnoreCase(

  8. "strict")

  9. && limit == null) {

  10. throw new SemanticException(generateErrorMessage(sortExprs,

  11. ErrorMsg.NO_LIMIT_WITH_ORDERBY.getMsg()));

  12. }

  13. }

  14. }

 

 

3. 读取的表是partitioned table,但没有指定partition predicate。

注:如果是多级分区表的话,只要出现任何一个就放行

 

 
  1. // If the "strict" mode is on, we have to provide partition pruner for

  2. // each table.

  3. if ("strict".equalsIgnoreCase(HiveConf.getVar(conf,

  4. HiveConf.ConfVars.HIVEMAPREDMODE))) {

  5. if (!hasColumnExpr(prunerExpr)) {

  6. throw new SemanticException(ErrorMsg.NO_PARTITION_PREDICATE

  7. .getMsg("for Alias \"" + alias + "\" Table \""

  8. + tab.getTableName() + "\""));

  9. }

  10. }

 

这三种case在数据量比较大的情况下都会造成生成低效的MR Job,影响执行时间和效率,不过直接抛出exception又感觉太forcefully了。

可以在一些非线上生产环境下的ad-hoc查询端中开启strict mode,比如hiveweb,运营工具。

 

本文链接http://blog.csdn.net/lalaguozhe/article/details/12044181,转载请注明

 

================================================================

1. order by

    Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。
    这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。
2. sort by

    Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。

3. distribute by和sort by一起使用

    ditribute by是控制map的输出在reducer是如何划分的,举个例子,我们有一张表,mid是指这个store所属的商户,money是这个商户的盈利,name是这个store的名字

store:


mid    money    name
AA    15.0    商店1
AA    20.0    商店2
BB    22.0    商店3
CC    44.0    商店4
    执行hive语句:

select mid, money, name from store distribute by mid sort by mid asc, money asc
我们所有的mid相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by mid,这样的话就可以统计出每个商户中各个商店盈利的排序了(这个肯定是全局有序的,因为相同的商户会放到同一个reducer去处理)。这里需要注意的是distribute by必须要写在sort by之前。
4. cluster by

    cluster by的功能就是distribute by和sort by相结合,如下2个语句是等价的:

    

select mid, money, name from store cluster by mid
select mid, money, name from store distribute by mid sort by mid
    如果需要获得与3中语句一样的效果:
select mid, money, name from store cluster by mid sort by money
    注意被cluster by指定的列只能是降序,不能指定asc和desc


原文:https://blog.csdn.net/jthink_/article/details/38903775 

这篇关于hive参数hive.mapred.mode分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047241

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory