阅读背景:

关于hadoop程序优化的几点建议

来源:互联网 

我最近在写代码的进程中发明了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处置那末就减轻了他的压力。
我最近在写代码的进程中发明了hadoop的mapreduce程序的一些操作有的是耗时的有的可使得程序




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: