从学习hadoop到现在有一年多了,前段时间又接触了hbase和hama,小结一下一点经验吧,当然这些经验出自小菜,很可能适用性不广,大家慎重采纳。
写程序前先写好以下三部分:
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(); } } }
2、写好文件读写的程序,把文件读写最好写成一个工具类。
这个工具类可以读写本地和hdfs上的文件,甚至是nfs或者ftp上的文件。如果程序中到处都是随手编写的文件IO的代码,很容易在分布式的程序中造成混乱,甚至导致程序异常挂起或终止(操作系统会对打开的文件加锁)、破坏文件内容。写成一个工具类,用上单例模式、加上适当的并发控制,就可以避免很多麻烦。
3、写好数据库连接和网络通信的程序
这也和上面一条的道理差不多,数据库连接、tcp连接、网络带宽都是有限的资源,分布式的程序不小心的话很可能会导致诡异的问题。
4、写好配置管理
程序可能要有一些配置信息,在写主要程序前先写一个配置工具类,管理系统的配置。分布式程序的配置文件还要考虑分发的问题,可以把配置文件写在nfs、ftp或者hdfs上,都是很方便的,或者自己想办法把配置文件分发到各个节点上也可以。
以后想到了别的再来补充。
作者:bhq2010 发表于2013-4-10 0:08:24 原文链接
阅读:133 评论:0 查看评论