在MR中优化用户的代码
1:尽量减少正则表达式的使用
2:String标记:测试标明:StringUtils.split 性能优于 StringTokenizer 优于 String.split 优于 Scanner类
3: Map函数中的对象重用:对象的实例化,尽量不要放在Map函数内,放在函数体之外
Text outputValue = new Text(); 放在函数体外面,尽可能地重用对象将会提高效率。
4:Reduce函数中的对象重用:
如果用户想在Reduce中缓存对象,用户需要克隆对象。
List cached = new ArrayList();
cached.add(WritableUtils.clone(value,context.getConfiguration()))
5: 字符串合并:
线程安全的StringBuilder 优于 StringBuffer 优于 String
但是底线是使用StringBuilder 类是最安全的,最好使用构造函数为产生的字符串预先分配足够的空间以避免StringBuilder内部字节数组的重新分配
6:对象的开销
ArrayList<String> strings = new Arraylist<Stirng>();
strings.add("A");
strings.add("b");
可以计算一下上面的ArrayList 和 其内容所占用的内存量:
在java中,字符串的内存占用是根据以下公式进行计算的:
字符串占用的内存字节数 = (numberOFCharacters * 2) + 38
备注:详细请参考《Hadoop硬实战》247页
1:尽量减少正则表达式的使用
2:String标记:测试标明:StringUtils.split 性能优于 StringTokenizer 优于 String.split 优于 Scanner类
3: Map函数中的对象重用:对象的实例化,尽量不要放在Map函数内,放在函数体之外
Text outputValue = new Text(); 放在函数体外面,尽可能地重用对象将会提高效率。
4:Reduce函数中的对象重用:
如果用户想在Reduce中缓存对象,用户需要克隆对象。
List cached = new ArrayList();
cached.add(WritableUtils.clone(value,context.getConfiguration()))
5: 字符串合并:
线程安全的StringBuilder 优于 StringBuffer 优于 String
但是底线是使用StringBuilder 类是最安全的,最好使用构造函数为产生的字符串预先分配足够的空间以避免StringBuilder内部字节数组的重新分配
6:对象的开销
ArrayList<String> strings = new Arraylist<Stirng>();
strings.add("A");
strings.add("b");
可以计算一下上面的ArrayList 和 其内容所占用的内存量:
在java中,字符串的内存占用是根据以下公式进行计算的:
字符串占用的内存字节数 = (numberOFCharacters * 2) + 38
备注:详细请参考《Hadoop硬实战》247页