写分布式程序经验小结
从学习hadoop到现在有一年多了,前段时间又接触了hbase和hama,小结一下一点经验吧,当然这些经验出自小菜,很可能适用性不广,大家慎重采纳。
写程序前先写好以下4部分:
[转载请注明出处:http://blog.csdn.net/bhq2010/article/details/8780613]
1、日志处理程序
分布式程序的日志是很重要的,因为几乎没法单步调试分布式的程序。日志可以记在hdfs上:
import java.io.BufferedWriter;import java.io.IOException;import java.util.Random;public class Logger{private static String fileName = null;private static Logger instance = null;private BufferedWriter writer = null;static{Random rand = new Random();fileName = Network.getLocalIp() + "_" + rand.nextInt();}private Logger(String peerName){try{Configuration conf = new Configuration("cocktail.conf");writer = OutputFactory.getWriter(conf.getItemValue("hamajob_tmp_dir") + "log/" + peerName,1024, true);} catch (IOException e){e.printStackTrace();}}public static synchronized void setFileName(String fileName){Logger.fileName = fileName;}public static synchronized Logger log(){if (instance == null){instance = new Logger(fileName);}return instance;}public synchronized void exception(String msg){try{writer.write("[Exception:]" + msg + "\n\n");writer.flush();} catch (IOException e){e.printStackTrace();}}public synchronized void info(String msg){try{writer.write("[INFO:]" + msg + "\n\n");writer.flush();} catch (IOException e){e.printStackTrace();}}public synchronized void exception(StackTraceElement[] trace){try{String msg = "";for (StackTraceElement element : trace){msg += "[Exception:]" + element.getClassName()+ ":" + element.getMethodName() + ":"+ element.getLineNumber() + "\n";}writer.write(msg + "\n");writer.flush();} catch (IOException e){e.printStackTrace();}}}
这个工具类可以读写本地和hdfs上的文件,甚至是nfs或者ftp上的文件。如果程序中到处都是随手编写的文件IO的代码,很容易在分布式的程序中造成混乱,甚至导致程序异常挂起或终止(操作系统会对打开的文件加锁)、破坏文件内容。写成一个工具类,用上单例模式、加上适当的并发控制,就可以避免很多麻烦。
3、写好数据库连接和网络通信的程序
这也和上面一条的道理差不多,数据库连接、tcp连接、网络带宽都是有限的资源,分布式的程序不小心的话很可能会导致诡异的问题。
4、写好配置管理
程序可能要有一些配置信息,在写主要程序前先写一个配置工具类,管理系统的配置。分布式程序的配置文件还要考虑分发的问题,可以把配置文件写在nfs、ftp或者hdfs上,都是很方便的,或者自己想办法把配置文件分发到各个节点上也可以。
以后想到了别的再来补充。