MapReduce中job参数及设置map和reduce的个数

来源:互联网 发布:美国10月非农数据预测 编辑:程序博客网 时间:2024/05/29 05:57
map的个数
在map阶段读取数据前,FileInputFormat会将输入文件分割成split。split的个数决定了
map的个数。
影响map个数,即split个数的因素主要有:
1)HDFS块的大小,即HDFS中dfs.block.size的值。如果有一个输入文件为1024m,当块为
256m时,会被划分为4个split;当块为128m时,会被划分为8个split。
2)文件的大小。当块为128m时,如果输入文件为128m,会被划分为1个split;当块为256m,
会被划分为2个split。
3)文件的个数。FileInputFormat按照文件分割split,并且只会分割大文件,即那些大小超过
HDFS块的大小的文件。如果HDFS中dfs.block.size设置为64m,而输入的目录中文件有100个,则
划分后的split个数至少为100个。
4)splitsize的大小。分片是按照splitszie的大小进行分割的,一个split的大小在没有设置的情况下,
默认等于hdfs block的大小。但应用程序可以通过两个参数来对splitsize进行调节。


map个数的计算公式如下:
1,splitsize=max(minimumsize,min(maximumsize,blocksize))。
如果没有设置minimumsize和maximumsize,splitsize的大小默认等于blocksize


2,计算公式
计算过程可以简化为如下的公式,详细算法可以参照FileInputSplit类中的getSplits方法
total_split ;
for(file :输入目录中的每个文件)
{
file_split = 1;
if(file.size>splitsize)
{
file_split=file_size/splitsize;
}
total_split+=file_split;
}14371142.07932


Reduce个数
[python] view plain copy
  1. public static void main(String[] args) throws Exception, IOException, InterruptedException {  
  2.   Configuration conf = new Configuration();  
  3.   Job job = Job.getInstance(conf);  
  4.   FileSystem fs=FileSystem.get(conf);  
  5.   job.setJarByClass(FlowBeanRunner.class);  
  6.    
  7.   job.setMapperClass(FlowBeanMapper.class);  
  8.   job.setReducerClass(FlowBeanReduce.class);  
  9.    
  10.   job.setOutputKeyClass(FlowBean.class);  
  11.   job.setOutputValueClass(Text.class);  
  12.    
  13.   //指定自定义的partitioner类,替换掉框架默认的HashPartitioner  
  14.   job.setPartitionerClass(ProvincePartitioner.class);  
  15.   //指定reduce task数量,跟ProvincePartitioner的分区数匹配  
  16.   job.setNumReduceTasks(6);     //Reduce的个数在这里设定    
  17.    
  18.   //要处理的数据所在的path  
  19.   //指定文件夹即可,该文件夹下的所有文件都会被处理  
  20.   FileInputFormat.setInputPaths(job, new Path("/phone/logs"));  
  21.    
  22.   Path destPath= new Path("/phone/cleanlogs");  
  23.   if(fs.exists(destPath)){  
  24.    fs.delete(destPath, true);  
  25.   }  
  26.    
  27.   //处理完得到的结果输出的path  
  28.   FileOutputFormat.setOutputPath(job, destPath);//提交本次作业  
  29.   job.waitForCompletion(true);  
  30.  }  
阅读全文
1 0
原创粉丝点击