您的位置:首页 > 其它

写分布式程序经验小结

2013-04-10 00:08 169 查看
从学习hadoop到现在有一年多了,前段时间又接触了hbase和hama,小结一下一点经验吧,当然这些经验出自小菜,很可能适用性不广,大家慎重采纳。

写程序前先写好以下4部分:

[转载请注明出处:/article/7712039.html]

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上,都是很方便的,或者自己想办法把配置文件分发到各个节点上也可以。

以后想到了别的再来补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: