ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 合理设置Map数 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小 2. 是不是map数越多越好? 不是的,如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费.而且,同时可执行的map数是受限的 3. 是不是保证每个map处理接近128M的文件块,就高枕无忧了? 不一定.比如有一个127m的文件,正常会用一个map去完成,当这个文件只有一个或者两个小字段,缺有几千万的记录.如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时 # 小文件合并 在map执行前合并小文件,减少map数: CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式). HiveInputFormat没有对小文件合并功能 ~~~ set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ~~~ # 复杂文件增加map数 当input的文件都很大,任务逻辑很复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率. 增加map的方法为: 根据 ~~~ computeSliteSize(Math.max(minSize, Math.min(maxSize, blocksize)))=blocksize=128M公式 ~~~ 调整maxSize最大值.让maxSize最大值低于blocksize就可以增加map的个数 **例子** 1. 执行查询 ~~~ hive> select count(*) from emp; ~~~ 发现是一个map 2. 设置最大切片值为100个字节 ~~~ hive> set mapreduce.input.fileinputformat.split.maxsize=100; hive> select count(*) from emp; ~~~ 发现是6个map # 合理设置Reduce数 ## 方法一 1. 每个Reduce处理的数据量默认是256MB ~~~ hive.exec.reducers.bytes.per.reducer=256000000 ~~~ 2. 每个任务最大的reduce数,默认为1009 ~~~ hive.exec.reducers.max=1009 ~~~ 3. 计算reducer数的公式 ~~~ N=min(参数2, 总输入数据量/参数1) ~~~ ## 方法二 在hadoop的mapred-default.xml文件中修改 设置每个job的Reducer个数 ~~~ set mapreduce.job.reduces=15; ~~~ # reduce个数并不是越多越好 1. 过多的启动和初始化reduce也会消耗时间和资源 2. 另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么这些小文件作为下一个任务的输入,则也会出现小文件过多的问题 在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce数.使单个reduce任务处理数据量大小要合适