为什么80%的码农都做不了架构师?>>>
***************hive多级目录作为输入-begin
!hive.mapred.supports.subdirectories=false。是否将多级子目录作为输入,默认false是只能当前目录的文件。推荐使用如下配置:
<property>
<name>hive.mapred.supports.subdirectoriesname>
<value>truevalue>
<description>
Whether the version of Hadoop which is running supports sub-directories for tables/partitions.
Many Hive optimizations can be applied if the Hadoop version supports sub-directories for
tables/partitions. It was added by MAPREDUCE-1501
description>
property>
&#xff01;mapreduce.input.fileinputformat.input.dir.recursive&#61;false。是否将多级子目录作为输入&#xff0c;默认false是只能
当前目录的文件。推荐使用如下配置&#xff1a;
<property>
<name>mapreduce.input.fileinputformat.input.dir.recursivename>
<value>truevalue>
<description>
Whether the version of Hadoop which is running supports sub-directories for tables/partitions.
Many Hive optimizations can be applied if the Hadoop version supports sub-directories for
tables/partitions. It was added by MAPREDUCE-1501
description>
property>
参考之前的博客&#xff1a;Hive和MapReduce将多级子目录作为输入
***************hive多级目录作为输入-end
***************hive优化之打开本地模式-begin
hive本地模式&#xff0c;当job数据量较小时&#xff0c;本地模式运行速度将更快。
&#xff01;hive.exec.mode.local.auto&#61;false。是否使用本地模式&#xff0c;推荐打开此功能&#xff0c;所以推荐使用如下配置
<property>
<name>hive.exec.mode.local.autoname>
<value>truevalue>
<description>Let Hive determine whether to run in local mode automaticallydescription>
property>
&#xff01;hive.exec.mode.local.auto.inputbytes.max&#61;134217728&#xff0c;推荐使用默认配置。hive本地模式的job输入数据大小
&#xff01;hive.exec.mode.local.auto.tasks.max&#61;4&#xff0c;推荐使用默认配置。hive本地模式的map个数
参考&#xff1a;hive使用本地模式
***************hive优化之打开本地模式-end
***************hive优化之打开并发执行-begin
在同一个sql中的不同的job是否可以同时运行
&#xff01;hive.exec.parallel&#61;false&#xff0c;默认是不能并发执行的&#xff0c;推荐使用如下配置
<property>
<name>hive.exec.parallelname>
<value>truevalue>
property>
参考&#xff1a;hive.exec.parallel参数
&#xff01;hive.exec.parallel.thread.number&#61;8&#xff0c;推荐使用默认配置&#xff0c;控制对于同一个sql来说同时可以运行的job的最大值&#xff0c;如果你的job更多&#xff0c;而资源也够&#xff0c;可以设置更大一点。
参考&#xff1a;参数hive.exec.parallel.thread.number说明
***************hive优化之打开并发执行-end
***************hive优化之调整limit限制-begin
&#xff01;hive.limit.optimize.enable&#61;false&#xff0c;推荐使用如下配置&#xff0c;是否打开hive limit优化
<property>
<name>hive.limit.optimize.enablename>
<value>truevalue>
property>
&#xff01;hive.limit.row.max.size&#61;100000&#xff0c;推荐使用默认配置&#xff0c;limit最大行数
&#xff01;hive.limit.optimize.limit.file&#61;10&#xff0c;推荐使用默认配置&#xff0c;limit最多限制文件数
***************hive优化之调整limit限制-end
***************hive优化之启用严格模式-begin
&#xff01;hive.mapred.mode&#61;nonstrict&#xff0c;推荐使用如下设置&#xff0c;注意如果表中一定有动态分区的查询&#xff0c;这里也可以使用非严格模式。严格模式只是防止数据量过大的查询。
<property>
<name>hive.mapred.modename>
<value>strictvalue>
property>
用严格模式可以禁止 3 种类型的查询&#xff1a;
&#xff08; 1 &#xff09;对于分区表&#xff0c;不加分区字段过滤条件&#xff0c;不能执行。
&#xff08; 2 &#xff09;对于 order by 语句&#xff0c;必须使用 limit 语句。
&#xff08; 3 &#xff09;限制笛卡尔积的查询&#xff08; join 的时候不使用 on &#xff0c;而使用 where 的&#xff09;。
***************hive优化之启用严格模式-end
&#xff01;mapred.job.reuse.jvm.num.tasks&#61;1&#xff0c;推荐使用如下配置&#xff0c;hive-site.xml找不到。表示一个JVM上最多可以顺序执行的task数目&#xff08;属于同一个Job&#xff09;&#xff0c;默认一个task启一个JVM
<property>
<name>mapred.job.reuse.jvm.num.tasksname>
<value>10value>
property>
参考&#xff1a;Hadoop的JVM重用
***************hive优化之推测执行-begin
hadoop的推测执行&#xff0c;但是有些时候如果推测执行没利用好&#xff0c;反而有可能造成相反的作用&#xff0c;具体参考&#xff1a;mapred.map.tasks.speculative.execution参数影响性能
&#xff01;mapred.map.tasks.speculative.execution&#61;true&#xff0c;推荐使用默认配置
&#xff01;mapred.reduce.tasks.speculative.execution&#61;true&#xff0c;推荐使用默认配置
***************hive优化之推测执行-end
&#xff01;hive.multigroupby.singlereducer&#61;true&#xff0c;推荐使用默认配置。在hive-site.xml中有这个属性的解释&#xff0c;翻译一下就是&#xff0c;是否将多group by的查询优化成单个M/R任务计划&#xff0c;如果多个group by查询具有相同的group by key&#xff0c;它将优化生成单个M/R任务。
在hive1.1.0版本中是这个属性名。但是在别的版本中有可能是下面这个属性名&#xff0c;其实它们的意义是一样的。
&#xff01;hive.multigroupby.singlemr&#61;false&#xff0c;推荐使用如下配置。将多个group by产出为一个单一map/reduce任务计划&#xff0c;当然约束前提是group by有相同的key。
<property>
<name>hive.multigroupby.singlemrname>
<value>truevalue>
property>
&#xff01;hive.optimize.multigroupby.common.distincts&#61;true&#xff0c;推荐使用默认配置。官方的英文也有点看不懂&#xff0c;大概意思就是当有相同的distinct列时&#xff0c;会进行对job plan进行优化。
&#xff01;hive.groupby.skewindata&#61;false&#xff0c;推荐使用如下配置。用于控制负载均衡的。当数据出现倾斜时&#xff0c;如果该变量设置为true&#xff0c;那么Hive会自动进行负载均衡。
<property>
<name>hive.groupby.skewindataname>
<value>truevalue>
property>
当为false时&#xff0c;能在聚合两个不同的distinct列&#xff0c;如果为true&#xff0c;则只能有一个distinct列
参考&#xff1a;Hive - hive.groupby.skewindata环境变量与负载均衡
***************hive优化之map输入合并-begin
&#xff01;mapred.max.split.size&#61;256000000&#xff0c;推荐是用默认配置&#xff0c;hive-site.xml找不到。每个Map最大输入大小&#xff0c;决定合并后的文件数&#xff0c;是否应该根据block大小调整&#xff1f;
&#xff01;mapred.min.split.size.per.node&#61;1&#xff0c;推荐使用如下配置&#xff0c;hive-site.xml找不到。一个节点上split的至少的大小 &#xff0c;决定了多个data node上的文件是否需要合并
<property>
<name>mapred.min.split.size.per.nodename>
<value>100000000value>
property>
&#xff01;mapred.min.split.size.per.rack&#61;1&#xff0c;推荐使用如下配置&#xff0c;hive-site.xml找不到。一个交换机下split的至少的大小&#xff0c;决定了多个交换机上的文件是否需要合并
<property>
<name>mapred.min.split.size.per.rackname>
<value>100000000value>
property>
&#xff01;hive.input.format&#61;org.apache.hadoop.hive.ql.io.CombineHiveInputFormat&#xff0c;推荐使用默认配置。执行Map前进行小文件合并
参考&#xff1a;Hive小文件合并
***************hive优化之map输入合并-end
***************hive优化之输出合并-begin
&#xff01;hive.merge.mapfiles&#61;true&#xff0c;推荐使用默认配置。在map-only job后合并文件。
&#xff01;hive.merge.mapredfiles&#61;false&#xff0c;推荐使用如下配置。在map-reduce job后合并文件。
<property>
<name>hive.merge.mapredfilesname>
<value>truevalue>
property>
&#xff01;hive.merge.size.per.task&#61;256000000&#xff0c;推荐使用默认配置。合并后每个文件的大小&#xff0c;是否应该根据block大小调整&#xff1f;
&#xff01;hive.merge.smallfiles.avgsize&#61;16000000&#xff0c;推荐使用默认配置。平均文件大小&#xff0c;是决定是否执行合并操作的阈值&#xff0c;是否应该根据block大小调整&#xff1f;
参考&#xff1a;Hive小文件合并 hive 小文件的合并 hive.merge.mapredfiles
***************hive优化之输出合并-end
***************hive优化之调整reduce数目-begin
&#xff01;hive.exec.reducers.bytes.per.reducer&#61;256000000&#xff0c;推荐使用如下配置。每个reduce任务处理的数据量。
<property>
<name>hive.exec.reducers.bytes.per.reducername>
<value>1073741824value>
property>
&#xff01;hive.exec.reducers.max&#61;1009&#xff0c;推荐使用默认值。每个任务最大的reduce数。
&#xff01;mapreduce.job.reduces&#61;1&#xff0c;推荐使用默认值。手动指定job的reduce数量。
注意&#xff0c;在hadoop2中&#xff0c;mapred.reduce.tasks改名为mapreduce.job.reduces了&#xff0c;但是这两个参数你都可以使用&#xff0c;只是第一个参数过时了。
***************hive优化之调整reduce数目-end
————————————————————————————————————————————————————————————
随着任务的不同&#xff0c;而应该使用set 重新设置的参数如下&#xff0c;这里属性设置的大小&#xff0c;应该和你的机器配置、数据有关&#xff0c;而不能一概而论。比如如果机器配置好一点&#xff0c;reduce处理的数据应该就可以稍微设置的大一点了。
***************hive优化之map输入合并-begin
&#xff01;mapred.max.split.size&#61;256000000。每个Map最大输入大小&#xff0c;如果map的处理逻辑不是很复杂&#xff0c;就可以设置的大一点。比如如果输入仅2个字段&#xff0c;而且处理逻辑稍微复杂一点&#xff0c;需要每行都处理逻辑&#xff0c;那么这个值就可以稍微设置小一点。如果不是很清楚&#xff0c;可使用默认值。即最大输入大小256M
&#xff01;mapred.min.split.size.per.node&#61;1。每个分片split的最小的数据大小&#xff0c;决定了小的split是否需要合并&#xff0c;默认是1&#xff0c;是不需要合并的&#xff0c;所以这里肯定要设置让它合并&#xff0c;可以根据机器配置&#xff0c;设置对应的大小。如果不是很清楚&#xff0c;可使用100000000。即分片大小不能小于100M
一个恰当的map并行度是大约每个节点10-100个map&#xff0c;且最好每个map的执行时间至少一分钟。
参考&#xff1a;Hive小文件合并 Hadoop MapReduce Job性能调优——修改Map和Reduce个数
***************hive优化之map输入合并-end
***************hive优化之输出合并-begin
&#xff01;hive.merge.size.per.task&#61;256000000&#xff0c;推荐使用默认配置。合并后每个文件的大小。如果不是很清楚&#xff0c;可使用默认值。256M一个文件的大小。
&#xff01;hive.merge.smallfiles.avgsize&#61;16000000&#xff0c;推荐使用默认配置。平均文件大小&#xff0c;是决定是否执行合并操作的阈值。如果不是很清楚&#xff0c;可使用默认值。
参考&#xff1a;Hive小文件合并 hive 小文件的合并 hive.merge.mapredfiles
***************hive优化之输出合并-end
***************hive优化之调整reduce数目-begin
&#xff01;hive.exec.reducers.bytes.per.reducer&#61;256000000&#xff0c;推荐使用如下配置。每个reduce任务处理的数据量。如果不是很清楚&#xff0c;可使用默认值。
&#xff01;mapreduce.job.reduces&#61;1&#xff0c;推荐使用默认值。手动指定job的reduce数量。如果不是很清楚&#xff0c;可使用默认值。
注意&#xff0c;在hadoop2中&#xff0c;mapred.reduce.tasks改名为mapreduce.job.reduces了&#xff0c;但是这两个参数你都可以使用&#xff0c;只是第一个参数过时了。
具体参考&#xff1a;Hadoop MapReduce Job性能调优——修改Map和Reduce个数
***************hive优化之调整reduce数目-end