【亲测有效】hive最全常用配置参数,加速,优化你的hive任务,all you need,持续更新中_机器爱上学习的博客-程序员秘密_修改hive-site.xml

技术标签: hive  hadoop  big data  

hive原理不多说了。

hive版本:hive-common-1.1.0-cdh5.16.2.jar


Hive设置配置参数的方法

  • Hive提供三种可以改变环境变量的方法,分别是:
    (1)、修改${HIVE_HOME}/conf/hive-site.xml配置文件;
    (2)、命令行参数;
    (3)、在已经进入cli时进行参数声明。

方法一:hive-site.xml配置参数

  • 在Hive中,所有的默认配置都在 "{HIVE_HOME}/conf/hive-default.xml "文件中,如果需要对默认的配置进行修改,可以创建一个 "hive-site.xml" 文件,放在 " {HIVE_HOME}/conf"目录下。里面可以对一些配置进行个性化设定。在hive-site.xml的格式如下:
<configuration>
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
        <description>location of
              default database for the warehouse</description>
    </property>
</configuration>
  • 所有的配置都是放在<configuration></configuration>标签之间,一个configuration标签里面可以存在多个<property></property>标签。<name>标签里面就是我们想要设定属性的名称;<value>标签里面是我们想要设定的值;<description;<标签是描述在这个属性的,可以不写。绝大多少配置都是在xml文件里面配置的,因为在这里做的配置都全局用户都生效,而且是永久的。用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。

方法二:命令行参数

  • 在启动Hive cli的时候进行配置,可以在命令行添加-hiveconf param=value来设定参数,例如:
hive --hiveconf mapreduce.job.queuename=queue1
  • 这样在Hive中所有MapReduce作业都提交到队列queue1中。这一设定对本次启动的会话有效,下次启动需要重新配置。

方法三:进入cli时候声明

  • 在已经进入cli时进行参数声明,可以在HQL中使用SET关键字设定参数,例如:
set mapreduce.job.queuename=queue1;

上述三种设定方式的优先级依次递增。即参数声明覆盖命令行参数,命令行参数覆盖配置文件设定。


不想改变hive配置,临时每次启动hive交互客户端或执行hive sql脚本时修改参数:

/usr/bin/hive --hiveconf mapreduce.job.queuename=xxxqueue \
--hiveconf hive.exec.parallel=true \
--hiveconf hive.exec.parallel.thread.number=16 \
--hiveconf mapreduce.job.jvm.numtasks=10 \
--hiveconf mapreduce.map.speculative=true \
--hiveconf mapreduce.reduce.speculative=true \
--hiveconf hive.mapred.reduce.tasks.speculative.execution=true \
--hiveconf hive.exec.compress.intermediate=true \
--hiveconf apreduce.map.output.compress=true \
--hiveconf hive.exec.mode.local.auto=true \
--hiveconf hive.fetch.task.conversion=more ......


Fetch抓取配置

  • Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。
  • 在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。
<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
    <description>
      Expects one of [none, minimal, more].
      Some select queries can be converted to single FETCH task minimizing latency.
      Currently the query should be single sourced not having any subquery and should not have
      any aggregations or distincts (which incurs RS), lateral views and joins.
      0. none : disable hive.fetch.task.conversion
      1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
      2. more  : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
    </description>
  </property>

hive.fetch.task.conversion=more

开启Hive的本地模式

  • 大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
  • 用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。

hive.exec.mode.local.auto=true

开启Hive的并行执行

  • Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。或者Hive执行过程中可能需要的其他阶段。默认情况下,Hive一次只会执行一个阶段。不过,某个特定的job可能包含众多的阶段,而这些阶段可能并非完全互相依赖的,也就是说有些阶段是可以并行执行的,这样可能使得整个job的执行时间缩短。不过,如果有更多的阶段可以并行执行,那么job可能就越快完成。
  • 通过设置参数hive.exec.parallel值为true,就可以开启并发执行。不过,在共享集群中,需要注意下,如果job中并行阶段增多,那么集群利用率就会增加。
  • 设置参数:
  • set hive.exec.parallel=true; //打开任务并行执行
  • set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。

JVM重用

  • JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。
  • Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。

<property>
  <name>mapreduce.job.jvm.numtasks</name>
  <value>10</value>
  <description>How many tasks to run per jvm. If set to -1, there is
  no limit. 
  </description>
</property>

mapreduce.job.jvm.numtasks=10

开启Hive的推测执行

  • 在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生,Hadoop采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。
  • 设置开启推测执行参数:Hadoop的mapred-site.xml文件中进行配置

<property>
  <name>mapreduce.map.speculative</name>
  <value>true</value>
  <description>If true, then multiple instances of some map tasks 
               may be executed in parallel.</description>
</property>

<property>
  <name>mapreduce.reduce.speculative</name>
  <value>true</value>
  <description>If true, then multiple instances of some reduce tasks 
               may be executed in parallel.</description>
</property>

mapreduce.map.speculative=ture

mapreduce.reduce.speculative=true

  • 不过hive本身也提供了配置项来控制reduce-side的推测执行:
<property>
    <name>hive.mapred.reduce.tasks.speculative.execution</name>
    <value>true</value>
    <description>Whether speculative execution for reducers should be turned on. </description>
  </property>

hive.mapred.reduce.tasks.speculative.execution=true

压缩 开启Map Reduce输出阶段压缩

开启Map输出阶段压缩

  • 开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:
1)开启hive中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
2)开启mapreduce中map输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
3)设置mapreduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
4)执行查询语句
    hive (default)> select count(ename) name from emp;

hive.exec.compress.intermediate=true

mapreduce.map.output.compress=true

mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec

开启Reduce输出阶段压缩

  • 当Hive将输出写入到表中时,输出内容同样可以进行压缩。属性hive.exec.compress.output控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为true,来开启输出结果压缩功能。
1)开启hive最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5)测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

hive.exec.compress.output=true;
mapreduce.output.fileoutputformat.compress=true;
mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
mapreduce.output.fileoutputformat.compress.type=BLOCK;
MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

  • 1)开启MapJoin参数设置:
    (1)设置自动选择Mapjoin
    set hive.auto.convert.join = true; 默认为true
    (2)大表小表的阈值设置(默认25M一下认为是小表):
    set hive.mapjoin.smalltable.filesize=25000000;

hive.auto.convert.join=true

Group By

  • 默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。
  • 并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。
  • 1)开启Map端聚合参数设置
    (1)是否在Map端进行聚合,默认为True
    hive.map.aggr = true
    (2)在Map端进行聚合操作的条目数目
    hive.groupby.mapaggr.checkinterval = 100000
    (3)有数据倾斜的时候进行负载均衡(默认是false)
    hive.groupby.skewindata = true
  • 当选项设定为 true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

hive.map.aggr=true

hive.groupby.skewindata=true

是否开启合并 Map/Reduce 小文件

对于 Hadoop 0.20 以前的版本,起一首新的 Map/Reduce Job,对于 0.20 以后的版本,则是起使用 CombineInputFormat 的 MapOnly Job。 默认是:false;

hive.merge.mapredfiles=true

例子:

在命令行下:

/usr/bin/hive --hiveconf mapreduce.job.queuename=xxxqueue \
--hiveconf hive.exec.parallel=true \
--hiveconf hive.exec.parallel.thread.number=16 \
--hiveconf mapreduce.job.jvm.numtasks=10 \
--hiveconf mapreduce.map.speculative=true \
--hiveconf mapreduce.reduce.speculative=true \
--hiveconf hive.mapred.reduce.tasks.speculative.execution=true \
--hiveconf hive.exec.compress.intermediate=true \
--hiveconf mapreduce.map.output.compress=true \
--hiveconf mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec \
--hiveconf hive.exec.compress.output=true \
--hiveconf mapreduce.output.fileoutputformat.compress=true \
--hiveconf mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec \
--hiveconf mapreduce.output.fileoutputformat.compress.type=BLOCK \
--hiveconf hive.auto.convert.join=true \
--hiveconf hive.map.aggr=true \
--hiveconf hive.groupby.skewindata=true \
--hiveconf hive.exec.mode.local.auto=true \
--hiveconf hive.fetch.task.conversion=more \
--hiveconf hive.merge.mapredfiles=true

在hue界面上:

set mapreduce.job.queuename=xxxqueue ;
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=16;
set mapreduce.job.jvm.numtasks=10;
set mapreduce.map.speculative=true;
set mapreduce.reduce.speculative=true;
set hive.mapred.reduce.tasks.speculative.execution=true;
set hive.exec.compress.intermediate=true;
set mapreduce.map.output.compress=true;
set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
set hive.auto.convert.join=true;
set hive.map.aggr=true;
set hive.groupby.skewindata=true;
set hive.exec.mode.local.auto=true;
set hive.fetch.task.conversion=more;
set hive.merge.mapredfiles=true;

hivesql 优化了参数后比优化前提升好几倍速度

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jrckkyy/article/details/125366686

智能推荐

win10隐藏正在运行的程序怎么操作_win10怎么隐藏正在运行的软件_Rsun04551的博客-程序员秘密_win10隐藏进程

win10隐藏正在运行的程序的方法:1、按下“Win+TAB”组合键,在左上角点击“新建桌面”;2、点击新建的“桌面2”,我们将需要隐藏的程序在该新建桌面中运行;3、如果突然被遇到巡检,我们马上按下“Win+TAB”组合键切换到“桌面1”即可!...

30多个Android 开发者工具 带你开发带你飞_e62ces0iem的博客-程序员秘密

文中部分工具是收费的,但是绝大多数都是免费的。FlowUp这是一个帮助你跟踪app整体性能的工具,深入分析关键的性能数据如FPS, 内存, CPU, 磁盘, 等等。FlowUp根据用户数量收费。Stetho由Facebook开发的一个强大的开源Android debug平台,Stetho让原生 Android app的debug跟使用Chrome的开发者工具de

Linux下vi与vim命令使用与区别_流烟默的博客-程序员秘密

它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。vim的这些优势主要体现在以下几个方面:1、多级撤消 我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。2、易用性vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。3、语法加亮 vim可以用不同的颜色来加亮你的代码。4、

URP——后期处理特效——景深Depth Of Field_liquanyi007的博客-程序员秘密_unity urp 景深

Depth Of Field景深组件应用景深效果,它模拟相机镜头的焦点属性。在现实生活中,相机只能清晰地聚焦在特定距离的物体上。离相机较近或较远的物体都没有对焦。模糊给了一个关于物体距离的视觉提示,并引入了“散焦”,这是指当他们失去焦点时视觉伪影出现在图像的明亮区域。欲了解更多关于散景的信息,请参阅维基百科上关于散景的文章Wikipedia article on Bokeh。通用渲染管道(URP)有两种景深模式:Gaussian高斯:这种模式近似相机的效果,但不完全模仿他们。它有一个有限的模糊半

报错#vue-router#unknown custom element: <router-link> - did you register the component correctly?_老衲的少女心i的博客-程序员秘密

报错截图:报错信息:[Vue warn]: Unknown custom element: - did you registerthe component correctly? For recursive components, make sure toprovide the “name” option. found in —&gt; at src/App.vue 翻译:[Vue 警告]:未知的自定义元素: -你正确注册组件了吗?对于递归组件,请确保提供“name”选项。在src

Weblogic LDAP 远程代码执行漏洞(CVE-2021-2109)_安服仔的博客-程序员秘密

CVE-2021-2109 Weblogic Server远程代码执行漏洞影响范围WebLogic Server 10.3.6.0.0WebLogic Server 12.1.3.0.0WebLogic Server 12.2.1.3.0WebLogic Server 12.2.1.4.0WebLogic Server 14.1.1.0.0环境搭建这个怎么搭都行,推荐采用docker镜像,例如以下两个docker镜像采用vulhub/weblogic/CVE-2020-14882的镜像(

随便推点

vue请求本地json文件_dbeml82080的博客-程序员秘密

1、在dev-server.js里加入代码:var goodsData = require('../data.json')var router = express.Router()router.get('/goods',function(req,res){res.json(goodsData)})app.use(router)2...

css渐变效果_百谷城南的博客-程序员秘密

css渐变效果详细文档地址:详细教程文中所用图片来自@菜鸟教程截图线性渐变:从上到下(默认情况下)div { background-image: linear-gradient(#e66465, #9198e5);}从左到右div { height: 200px; background-image: linear-gradient(to right, red , yellow);}对角div { height: 200px; background-imag

raspberry pi_如何制作Raspberry Pi游戏手柄_cumj63710的博客-程序员秘密

raspberry pi 我不时地怀念80年代末和90年代孩童时期玩的电子游戏。 尽管我的大多数旧计算机和游戏机已不复存在,但我的Raspberry Pi可以完成我的复古游戏修复。 我喜欢Raspbian中包含的简单游戏,开源的RetroPie项目帮助我将Raspberry Pi变成了先进的复古游戏机。 但是,为了获得更真实的体验(例如,回到过去),我需要一个游戏手柄。 市场上有很多USB游...

编写多线程的 Java 应用程序_多纤果冻的博客-程序员秘密

内容 线程是什么?线程和 Java 语言上锁信号量 常见的上锁问题为不同的线程模型进行设计线程和 AWT/Swing总结编写多线程的 Java 应用程序如何避免当前编程中最常见的问题 几乎所有使用 AWT 或 Swing 编写的画图程序都需要多线程。但多线程程序会造成许多困难,刚开始编程的开发者常常会发现他们被一些问题所折磨,例如不正确...

IDEA使用之添加jar包-JSTL标签库(转载)_csdn296的博客-程序员秘密

转载地址:https://www.jianshu.com/p/5f7456be5d8fJSTL标签库的DTD文件的下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,那两个包在 lib 文件夹下在网上查了好多资料都没有达到想要的效果, 最后瞎捣鼓终于整出来了, 起码在导入标签库的时候有代...

解决Java程序在Linux系统中创建文件或者文件夹后权限不足的问题_江湖人称小程的博客-程序员秘密

tomcat 需要8以及以上我在Java程序里面有很多生成文件的功能,比如用户上传文件、将数据生成xml文本等。我发现生成的文件权限全是:-rw-r—,而文件的拥有者是 root,这样就只有root用户组的才有读取权限。Linux系统为了安全考虑,默认创建文件的最高权限为666,而创建文件夹的最高权限为777,系统通过变量umask来控制创建文件的权限问题。我们假设设置 umask 的值为 025 时,则创建的文件权限为 641,即权限是通过最高权限减去 umask 的值来控制的。我们可以通过修.