我最近在写代码的过程中发现了hadoop的mapreduce程序的一些操作有的是耗时的有的可以使得程序运行更快 1.不知道大家有没有用过那个partioner的,这个类可以帮助我们将我们的数据通过自定义的方式输出到指定的文件当中去 比如说: private static Map<String ,Integer > provider_map= new HashMap<String ,Integer>(); static { provider_map.put("135", 3); provider_map.put("136", 3); provider_map.put("137", 1); provider_map.put("182", 1); provider_map.put("183", 1); provider_map.put("132", 2); provider_map.put("159", 2); provider_map.put("150", 2); } public int getPartition(Text key, DataBean value, int numPartitions) { // TODO Auto-generated method stub String account = key.toString(); String str_num = account.substring(0, 3); Integer in = provider_map.get(str_num); if(in == null) { in = 0; } return in; } 这段代码是一个例子中摘出来的一段,在前面定义了几个电话号码:一部分对应着1,一部分对应着的是2等等。 这样在Reduce端输出的时候会自动的根据这里面的返回的数据值进行放入相应的文档中,比如说part-000000/part-000001 那么是通过什么方式就能达到这样的效果的呢,partitioner结束之后,会根据这个返回值进行排序将相同值的数据放在一块, 一个缓冲区里面就会放了几个不同这样值的数据部分,分配任务的Reduce会向这个缓冲区寻找自己对应编号的数据获取到Reduce的 缓存中进行排序和处理。 这里我想说一下,可能你的程序不需要这一步分开文件的操作,那么尽量就不要用这个partitioner,因为这个我用的过程中的确是耗时的,不过如果说你的程序需要这个来完成你的逻辑那么还是很有必要的,但是也要做好耗时长些的准备。 2.Combiner : 在map端执行,进行对数据的小计,然后将数据交付给Reduce,这样减轻了Reduce的压力,从而实现效率的提升。 Combiner :如果他的功能与Reduce的功能是一致的那么应该说是可行的,因为combiner要实现可插拔,也就是说我这里有这个combiner和没有这个combiner应该是一样的结果。 不过也有的是这样的,通过combiner实现自己的业务逻辑等等,这样的话不是可插拔了,比如对于数据的过滤。 比如说单词统计的程序学过hadoop的朋友应该都学过,在map端结束的时候,会生成键值对比如说<hello, 1>,<word,1>,<hello, 1>等等,这样显然如果这一个文件里面的数据 <hello,1>到达Reduce端再进行加法运算那样会使得Reduce端压力比较大,但是当你引入combiner的时候,他会在map端一个文件映射完成之后,我进行一次小计的求和运算, 把多个文件小计之后的结果我再交给Reduce处理那么就减轻了他的压力。
时间: 2024-10-08 09:11:19