将文件分割为小于默认值并不是一个有效的解决方案。 Spiting主要用于处理大数据集。默认值本身很小,因此不值得再次拆分。
我建议您在查询之前进行以下配置。您可以根据您的输入数据应用它。
set hive.merge.mapfiles=false;
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
set mapred.map.tasks = XX;
如果您还想分配减速器的数量,则可以使用以下配置
set mapred.reduce.tasks = XX;
请注意,在 Hadoop 2 (YARN) 上,mapred.map.tasks
and mapred.reduce.tasks
已弃用并被其他变量取代:
mapred.map.tasks --> mapreduce.job.maps
mapred.reduce.tasks --> mapreduce.job.reduces
请参阅下面与此相关的有用链接
http://answers.mapr.com/questions/5336/limit-mappers-and-reducers-for-specific-job.html http://answers.mapr.com/questions/5336/limit-mappers-and-reducers-for-specific-job.html
增加Hive Mapper任务失败? https://stackoverflow.com/questions/20816726/fail-to-increase-hive-mapper-tasks
映射器如何分配
映射器的数量由 MapReduce 作业中使用的 InputFormat 确定的分割数决定。
在典型的InputFormat中,它与文件数量和文件大小成正比。
假设您的 HDFS 块配置配置为 64MB(默认大小)并且您有一个大小为 100MB 的文件
那么它将占用 2 个块,然后将根据块分配 2 个映射器
但假设如果你有 2 个 30MB 大小的文件(每个文件),那么每个文件将占用一个块,并且映射器将获得分配
基于此。
当您处理大量小文件时,Hive 默认使用CombineHiveInputFormat。
就MapReduce而言,它最终转化为使用CombineFileInputFormat创建虚拟分割
多个文件,如果可能的话按公共节点、机架分组。组合分割的大小由下式确定
mapred.max.split.size
or
mapreduce.input.fileinputformat.split.maxsize ( in yarn/MR2);
因此,如果你想要更少的分割(更少的映射器),你需要将此参数设置得更高。
此链接对于了解更多信息很有用。
每个 Hadoop 映射器将读取的默认大小是多少? https://stackoverflow.com/questions/17852838/what-is-the-default-size-that-each-hadoop-mapper-will-read
此外,映射器和减速器的数量始终取决于集群的可用映射器和减速器插槽。