ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hive 参数优化

2022-08-26 19:02:41  阅读:213  来源: 互联网

标签:map set reduce mapreduce hive job 参数 优化


最近为了调试hive试了很多hive参数,对于hive任务优化,减少使用内存有一些自己的见解,在此做一个记录。

一:mapreduce的基本流程及阶段可进行的优化操作

  • (其实有很多不用设置有默认的设置,此处做面试,参考设置在下一节)
  • 附上网上的一张老图(虽然老但是很具有代表性,哈哈哈)
  •  

     

  • 上面的图知道,对于mapreduce任务可分为以上几个步骤,input、splitting、Mapping、Shuffing、reducing、finalresult,我们可以对这些阶段进行分别的优化!!
1. Splitting阶段优化:将输入数据进行按照大小节分,分成不同的块。

优化点:

  • 适当增加切割块的大小(单个节点先按照maxsize进行切分,剩下的进行minsize大小的合并。然后是节点之间的合并,最后是机架之间的合并。)
    set mapreduce.input.fileinputformat.split.minsize = 1024000000;
set mapreduce.input.fileinputformat.split.maxsize = 1024000000;(默认256M)
set mapreduce.input.fileinputformat.split.minsize.per.node= 1024000000;
set mapreduce.input.fileinputformat.split.maxsize.per.node= 1024000000;(默认1b)
set mapreduce.input.fileinputformat.split.minsize.per.rack= 1024000000; 
set mapreduce.input.fileinputformat.split.maxsize.per.rack= 1024000000;(默认1b)
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;(默认存在)
2. Mapping阶段优化:将相同的key进行对应的转换,其实map的个数取决于上一阶段切割的最终的数据块个数。

优化点:

手动规定map的个数(例子:任务中有100个map,但是可以使map分批执行一批10个)

  • set mapreduce.job.running.map.limit=20;

规定map同时并行的个数(例子:任务中有100个map,但是可以使map分批执行一批10个)

  • set mapreduce.map.memory.mb=3584;(3.5G内存) 默认2.1倍会杀掉

限制map可使用的最大内存

  • set hive.map.aggr = true
  • set hive.groupby.mapaggr.checkinterval = 100000(将数据每100000进行聚合)
3. Shuffing阶段优化:将相同的的key放到一个reduce中,其实是一个网络传输的过程。

优化点:
map后进行压缩(压缩后自动解压)

  • set mapreduce.map.output.compress=true(map输出压缩,mapreduce参数)
  • set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec(map输出压缩格式,mapreduce参数)

map后进行合并文件操作

  • set hive.merge.mapfiles = true(新启一个job完成合并,合并多大set hive.merge.size.per.task决定)
4. reducing阶段优化:进行数据累加操作,并将结果传输到对应的文件中。

优化点:
手动规定reduce的个数

  • set mapred.reduce.tasks = 20;
    规定reduce同时并行的个数
    (例子:任务中有100个reduce,但是可以使reduce分批执行一批10个)
  • set mapreduce.job.running.reduce.limit=80;

限制reduce可使用的最大内存

  • set mapreduce.reduce.memory.mb=7168;(7G内存) 默认2.1倍会杀掉
    设置每个reduce可处理的数据大小(直接决定reduce个数)

  • set hive.exec.reducers.bytes.per.reducer=102410001000;
    reduce最大个数

  • set hive.exec.reducers.max =2000;(mapreduce.job.running.reduce.limit变相使用)
    reduce后可进行文件合并

  • set hive.merge.sparkfiles = false(spark引擎,结束后合并文件,新启动一个任务)

  • set hive.merge.tezfiles = false(tez引擎,结束后合并文件,新启动一个任务)

  • set hive.merge.mapredfiles = true(mapreduce引擎,结束后合并文件,新启动一个任务)

  • set hive.merge.smallfiles.avgsize =10010001000 (输出文件小于当前值的时候,任务结束后合并文件的大小)

  • set hive.merge.size.per.task = 102410001000 (将文件合并成为多大)

5. finalresult阶段优化:其实就是写文件的过程。

优化点:
reduce后要进行压缩写到HDFS(每个节点单独跑任务,但是最后的结果需要汇聚到一处)

  • set mapreduce.output.fileoutputformat.compress=false // 默认值是 false reduce属性
  • set mapreduce.output.fileoutputformat.compress.type=BLOCK // 默认值是 Record reduce属性
  • set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec
6. 其他优化:

JVM优化:一个JVM运行的job数是有上限的,我们可以设置最大执行的个数

  • set mapreduce.job.jvm.numtasks=100

并发及并发线程数优化:job的子查询可能没关系,所以可以开启并发查询

  • set hive.exec.parallel = true;
  • set hive.exec.parallel.thread.number=8;

分区优化:hive有桶表和分区表,可开启动态分区(其实就是不同文件夹)

  • set hive.exec.dynamic.partition=true
  • set hive.exec.dynamic.partition.mode=nonstrict(分区表分为严格模式和非严格模式)

job之间优化:

  • set hive.exec.compress.output=true;(最终结果压缩。若map压缩和reduce压缩都没有用,改参数使用的话。两个job第一个job后数据不压缩,第二个job输出压缩)
  • set hive.exec.compress.intermediate=true(若map压缩reduce压缩最终输出压缩都没有用,改参数使用的话。两个job第一个job后数据压缩,第二个job输出不压缩) SQL优化:

二:常用hive参数优化

    其实上面是对每一个阶段都进行数据优化,有很多参数都是默认开启或者有默认值的。
    只需要用到常用的几个就行,其他的作为面试。下面列举出比较常用的:
1. Splitting阶段:将输入小文件合并成为大文件
  • set mapreduce.input.fileinputformat.split.minsize = 1024000000;(参数mapreduce.map.memory.mb=3584 默认2.1倍会杀掉,一个map申请3.5G内存不用浪费了)
  • set mapreduce.input.fileinputformat.split.maxsize = 1024000000;
  • set mapreduce.input.fileinputformat.split.minsize.per.node= 1024000000;
  • set mapreduce.input.fileinputformat.split.maxsize.per.node= 1024000000;
  • set mapreduce.input.fileinputformat.split.minsize.per.rack= 1024000000;
  • set mapreduce.input.fileinputformat.split.maxsize.per.rack= 1024000000;
2. map阶段一般很快,参数可以不设置

reduce阶段

  • set mapreduce.job.running.reduce.limit=80;(例子:任务中有100个reduce,但是可以使reduce分批执行一批10个)
3. 合并小文件

hive合并文件是新启动一个任务合并文件,感觉这个参数不太合适,有这个时间不如直接输出(map和reduce阶段都是一样的)。

4. 压缩文件

(这个参数十分好,压缩不仅仅节约空间而且在网络传输的时候比较省宽带,mapreduce和spark都是默认可以解压缩的,比较方便。)

  • set mapreduce.map.output.compress=true(map输出压缩,map阶段参数)
  • set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec(map输出压缩格式,map阶段参数)
  • set mapreduce.output.fileoutputformat.compress=false // 默认值是 false reduce阶段参数
  • set mapreduce.output.fileoutputformat.compress.type=BLOCK // 默认值是 Record reduce阶段参数
  • set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec // 默认值是 org.apache.hadoop.io.compress.DefaultCodec
  • set hive.exec.compress.output=true;(最终结果压缩。若map压缩和reduce压缩都没有用,改参数使用的话。两个job第一个job后数据不压缩,第二个job输出压缩)
  • set hive.exec.compress.intermediate=true(若map压缩reduce压缩最终输出压缩都没有用,改参数使用的话。两个job第一个job后数据压缩,第二个job输出不压缩)
5. 矢量模式 一次读取1024行
6. 并发优化
  • set hive.exec.parallel = true;
  • set hive.exec.parallel.thread.number=8;
7. 数据倾斜优化:
  • set hive.optimize.skewjoin=true;
  • set hive.skewjoin.key=100000;(超过10000个相同的key就认为是数据倾斜,需要进行打散处理)
8. 分区优化(建表的时候要partation by ):
  • set hive.exec.dynamic.partition=true
  • set hive.exec.dynamic.partition.mode=nonstrict(分区表分为严格模式和非严格模式)
9. SQL优化

小表往前放、多重模式(查一张表的多次插入)(from a insert insert 1 insert 2)
map join、桶表

10. 推测执行

执行慢的换别人执行

三:hive杂项

1.hive参数配置:
  • Hive UI------>>>>Hive Configuration页签找到(版本与版本之间参数的名字不太一样一定要看清楚配置的名字,最好使用最新的配置名称)
2.hivesql使用内存资源
  • hivesql使用资源可在YARN的管理界面中RUNNING中看到,需要时不时刷新因为是动态的。
    (一般为3.5gmap个数字+7greduce个数)
3.hivesql生成的job的map个数reduce个数
  • 可在YARN的管理界面中FINISHED中找到job后点击History,进去之后就会看到map数和reduce数

标签:map,set,reduce,mapreduce,hive,job,参数,优化
来源: https://www.cnblogs.com/wuxiaolong4/p/16628868.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有