现在的位置: 首页 > 综合 > 正文

写分布式程序经验小结

2018年05月18日 ⁄ 综合 ⁄ 共 1844字 ⁄ 字号 评论关闭

从学习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();
		}
	}
}

2、写好文件读写的程序,把文件读写最好写成一个工具类。

这个工具类可以读写本地和hdfs上的文件,甚至是nfs或者ftp上的文件。如果程序中到处都是随手编写的文件IO的代码,很容易在分布式的程序中造成混乱,甚至导致程序异常挂起或终止(操作系统会对打开的文件加锁)、破坏文件内容。写成一个工具类,用上单例模式、加上适当的并发控制,就可以避免很多麻烦。

3、写好数据库连接和网络通信的程序

这也和上面一条的道理差不多,数据库连接、tcp连接、网络带宽都是有限的资源,分布式的程序不小心的话很可能会导致诡异的问题。

4、写好配置管理

程序可能要有一些配置信息,在写主要程序前先写一个配置工具类,管理系统的配置。分布式程序的配置文件还要考虑分发的问题,可以把配置文件写在nfs、ftp或者hdfs上,都是很方便的,或者自己想办法把配置文件分发到各个节点上也可以。

以后想到了别的再来补充。

抱歉!评论已关闭.