Mapreduce运行67%异常解决

错误信息如下:

经查询为比较器方法调用错误

	//错误代码为:
	job.setSortComparatorClass(ReduceGroupComparetor2.class);
	//修改为
	job.setGroupingComparatorClass(ReduceGroupComparetor2.class);
然后就可以正常运行了

详细代码如下:

package com.zhiyou.bd17.mr1017;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class GroupTopN {

	public static class GroupTopNMap extends Mapper<LongWritable, Text, Text, IntWritable>{
		private String[] infos;
		private IntWritable ONE = new IntWritable(1);
		private Text outKey = new Text();
		@Override
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
				throws IOException, InterruptedException {
			infos = value.toString().split("\\s");
			if (infos!=null && infos.length>0 && infos[1].equals("login")) {
				outKey.set(infos[0]+"_"+infos[2]);
				context.write(outKey, ONE);			
			}
		}
	}
	
	public static class GroupTopNPartitioner extends Partitioner<Text, IntWritable> {
		private String[] infos;
		@Override
		public int getPartition(Text key, IntWritable value, int numPartitions) {
			infos = key.toString().split("_");
			return (infos[0].hashCode() & Integer.MAX_VALUE)%numPartitions;
		}
		
	}
	
	public static class GroupTopNReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		private TreeMap<Integer, String> topN;
		private Map<String, Integer> ipLoginTimes;
		private Text outKey = new Text();
		private IntWritable outValue = new IntWritable();
		//求用户在每个ip上登录的次数,同时也求topN
		@Override
		protected void reduce(Text key, Iterable<IntWritable> values,
				Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
			ipLoginTimes = new HashMap<String, Integer>();
			topN = new TreeMap<Integer, String>();
			//把用户登录的ip放在ipLoginTimes map中
			for (IntWritable value : values) {
				if (ipLoginTimes.containsKey(key.toString())) {
					ipLoginTimes.put(key.toString(), ipLoginTimes.get(key.toString())+value.get());
				}else {
					ipLoginTimes.put(key.toString(), value.get());
				}
			}
			//放入topN中
			for (String userIp : ipLoginTimes.keySet()) {
				if (topN.size()<3) {
					topN.put(ipLoginTimes.get(userIp), userIp);
				} else {
					topN.put(ipLoginTimes.get(userIp), userIp);
					topN.remove(topN.firstKey());
				}
			}
			//输出topN
			for (int times : topN.descendingKeySet()) {
				outKey.set(topN.get(times));
				outValue.set(times);
				context.write(outKey, outValue);
			}
		}
		
	}
	
	public static class ReduceGroupComparetor extends WritableComparator{

		
		
		@Override
		public int compare(WritableComparable a, WritableComparable b) {
			Text ca = (Text)a;
			Text cb = (Text)b;
			return ca.toString().split("_")[0].compareTo(cb.toString().split("_")[0]);
		}
		
	}
	
	public static class ReduceGroupComparetor2 extends Text.Comparator{

		@Override
		public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
			byte[] cb1 = Arrays.copyOfRange(b1, 2, b1.length);
			byte[] cb2 = Arrays.copyOfRange(b2, 2, b2.length);
			String str1 = new String(cb1);
			String str2 = new String(cb2);
			return str1.split("_")[0].compareTo(str2.split("_")[0]);
		}

	
		
	}
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		Configuration configuration = new Configuration();
		Job job = Job.getInstance(configuration);
		job.setJarByClass(GroupTopN.class);
		job.setJobName("分组排序");
		
		job.setMapperClass(GroupTopNMap.class);
		job.setPartitionerClass(GroupTopNPartitioner.class);
		job.setReducerClass(GroupTopNReducer.class);
		//job.setSortComparatorClass(ReduceGroupComparetor2.class);
		job.setGroupingComparatorClass(ReduceGroupComparetor2.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		Path inputPath = new Path("/bd17/user-logs-large.txt");
		Path outputDir = new Path("/bd17/groupTopN");
		
		outputDir.getFileSystem(configuration).delete(outputDir,true);
		FileInputFormat.addInputPath(job, inputPath);
		FileOutputFormat.setOutputPath(job, outputDir);
						
		System.exit(job.waitForCompletion(true)?0:1);
	}
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值