当文件大于块大小时如何减少配置单元中映射器的数量?
how to decrease the number of mapper in hive while the file is bigger than block size?
伙计们
我在hive中有一个table,它有720多个分区,每个分区有400多个文件,文件的平均大小为1G。
现在我执行以下 SQL:
插入覆盖 table test_abc select * 来自 DEFAULT.abc A WHERE A.P_HOUR ='2017042400' ;
这个分区(P_HOUR ='2017042400' )有409个文件。当我提交这个 sql 时,我得到了以下输出
信息:reduce 任务数设置为 0,因为没有 reduce 运算符
信息:splits:409
的数量
信息:正在为作业提交令牌:job_1482996444961_9384015
我google很多文档找到如何减少映射器的数量,很多文档在文件很小的时候解决了这个问题。
我在直线上尝试了以下设置,但没有用
--------------第一次
set mapred.min.split.size =5000000000;
set mapred.max.split.size =10000000000;
set mapred.min.split.size.per.node=5000000000;
set mapred.min.split.size.per.rack=5000000000;
----------------第二次
set mapreduce.input.fileinputformat.split.minsize =5000000000;
set mapreduce.input.fileinputformat.split.maxsize=10000000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=5000000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=5000000000;
我的 hadoop 版本是
Hadoop 2.7.2
由 root 于 2016 年 7 月 11 日编译 10:58:45
蜂巢版本是
连接到:Apache Hive(版本 1.3.0)
驱动程序:Hive JDBC(版本 1.3.0)
MRv2使用CombineInputFormat
,而Tez使用grouped splits来确定Mapper。如果您的执行引擎是 mr
并且您想减少 Mappers 使用:
mapreduce.input.fileinputformat.split.maxsize=xxxxx
如果指定了maxSplitSize
,则同一节点上的块将合并为一个拆分。剩下的块然后与同一机架中的其他块组合。如果未指定 maxSplitSize
,则来自同一机架的块将合并为一个拆分;不会尝试创建节点本地拆分。如果 maxSplitSize
等于块大小,那么这个 class 类似于 Hadoop 中的默认拆分行为
如果您的执行引擎是 mr
,这个 link 可以帮助控制 Hive 中的 Mapper
如果您的执行引擎是 tez
并且您想控制映射器,那么请使用:
set tez.grouping.max-size = XXXXXX;
这是一篇关于 tez
执行引擎的 Hive 并行性的好书 reference,
除了 post
中的设置
set hive.hadoop.supports.splittable.combineinputformat=true;
hive.hadoop.supports.splittable.combineinputformat
- Default Value: false
- Added In: Hive 0.6.0
Whether to combine small input files so that fewer mappers are spawned.
伙计们 我在hive中有一个table,它有720多个分区,每个分区有400多个文件,文件的平均大小为1G。
现在我执行以下 SQL: 插入覆盖 table test_abc select * 来自 DEFAULT.abc A WHERE A.P_HOUR ='2017042400' ;
这个分区(P_HOUR ='2017042400' )有409个文件。当我提交这个 sql 时,我得到了以下输出
信息:reduce 任务数设置为 0,因为没有 reduce 运算符 信息:splits:409
的数量信息:正在为作业提交令牌:job_1482996444961_9384015
我google很多文档找到如何减少映射器的数量,很多文档在文件很小的时候解决了这个问题。 我在直线上尝试了以下设置,但没有用 --------------第一次
set mapred.min.split.size =5000000000;
set mapred.max.split.size =10000000000;
set mapred.min.split.size.per.node=5000000000;
set mapred.min.split.size.per.rack=5000000000;
----------------第二次
set mapreduce.input.fileinputformat.split.minsize =5000000000;
set mapreduce.input.fileinputformat.split.maxsize=10000000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=5000000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=5000000000;
我的 hadoop 版本是 Hadoop 2.7.2 由 root 于 2016 年 7 月 11 日编译 10:58:45 蜂巢版本是 连接到:Apache Hive(版本 1.3.0) 驱动程序:Hive JDBC(版本 1.3.0)
MRv2使用CombineInputFormat
,而Tez使用grouped splits来确定Mapper。如果您的执行引擎是 mr
并且您想减少 Mappers 使用:
mapreduce.input.fileinputformat.split.maxsize=xxxxx
如果指定了maxSplitSize
,则同一节点上的块将合并为一个拆分。剩下的块然后与同一机架中的其他块组合。如果未指定 maxSplitSize
,则来自同一机架的块将合并为一个拆分;不会尝试创建节点本地拆分。如果 maxSplitSize
等于块大小,那么这个 class 类似于 Hadoop 中的默认拆分行为
如果您的执行引擎是 mr
如果您的执行引擎是 tez
并且您想控制映射器,那么请使用:
set tez.grouping.max-size = XXXXXX;
这是一篇关于 tez
执行引擎的 Hive 并行性的好书 reference,
除了 post
中的设置set hive.hadoop.supports.splittable.combineinputformat=true;
hive.hadoop.supports.splittable.combineinputformat
- Default Value: false
- Added In: Hive 0.6.0
Whether to combine small input files so that fewer mappers are spawned.