/**
*
*/
package com.taobao.top.analysis.config;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.taobao.top.analysis.util.AnalyzerUtil;
import com.taobao.top.analysis.util.ReportUtil;
/**
* 服务端配置类
* @author fangweng
*
*/
public class MasterConfig extends AbstractConfig{
static
{
processorCount = Runtime.getRuntime().availableProcessors();
}
/**
* 当前cpu数量
*/
private static int processorCount;
/**
*
*/
private static final long serialVersionUID = 4127398444132837605L;
/**
* master的名称
*/
private final static String MASTER_NAME = "masterName";
/**
* mater开启的端口
*/
private final static String MASTER_PORT = "masterPort";
/**
* Master端输出系统监控信息目录
*/
private final static String SYSTEM_MONITOR_INFO_OUTPUT = "systemMonitorInfoOutput";
/**
* JobManager处理消息事件最大线程池线程数量
*/
private final static String MAX_JOBEVENT_WORKER = "maxJobEventWorker";
/**
* 用于合并任务结果的线程最大设置,默认是当前处理器数 + 3
*/
private final static String MAX_MERGE_JOB_WORKER = "maxMergeJobWorker";
/**
* 最大的用于输出统计分析结果或者载入导出临时结果的线程数,默认10
*/
private final static String MAX_CREATE_REPORT_WORKER = "maxCreateReportWorker";
/**
* 任务配置的来源,可以自己扩展为DB,HTTP等方式,现在默认实现本地配置文件(file:xxxx)
*/
private final static String JOBS_SOURCE = "jobsSource";
/**
* 合并最小的结果数,默认为1,如果不达到这个值,等待MAX_JOB_RESULT_BUNDLE_WAITTIME到获得必要个数为止
*/
private final static String MIN_MERGE_JOB_COUNT ="minMergeJobCount";
/**
* 设置了minMergeJobCount,单位毫秒,最大等待组成一个bundle批量处理的时间,默认为60秒
*/
private final static String MAX_JOB_RESULT_BUNDLE_WAITTIME ="maxJobResultBundleWaitTime";
/**
* 输出临时文件间隔(单位秒,默认10分钟),如果设置了saveTmpResultToFile,该时间设置无效,每次都会有导出临时文件
*/
private final static String EXPORT_INTERVAL = "exportInterval";
// mod by fangweng 2011 performance
//数据量较小的情况下请勿使用!!!
//导出后清除对应的map内的数据,下次合并过程中再尝试从磁盘载入,通过配置开关判断是否实施
private final static String SAVE_TMP_RESULT_TO_FILE = "saveTmpResultToFile";
//mod by fangweng 2011 performance
//配合磁盘换内存的方式,判断什么时候可以异步载入文件
private final static String ASYN_LOAD_DISK_FILE_PRECENT = "asynLoadDiskFilePrecent";
//是否在JobMaster中采用异步模式去发送服务端的回执消息,比如在SocketConnector模式下就应该开启,memConnector模式下就不用
//默认打开,根据自己实现和选择的Connector判断发送是否消耗来开关
private final static String USE_ASYN_MODE_TO_SEND_RESPONSE = "useAsynModeToSendResponse";
//支持多个master,不过其他master仅仅作为分担合并任务的工作,
//主要目的就是分担主master的业务合并压力,部分报表可以定义给其他master合并
//配置方式(name:ip:port|weight的方式,weight默认是1可以不填写):masterGroup=TOPAnalyzer:127.0.0.1:6800,TOPAnalyzer1:127.0.0.1:6801
private final static String MASTER_GROUP = "masterGroup";
/**
* 当往多个master发送结果时没有成功的时候,将数据保存在本地
*/
private final static String TEMP_STORE_DATA_DIR = "tempStoreDataDir";
/**
* 对于分析过程中的临时文件需要保存多久,用于做数据恢复的临时文件
*/
private final static String OLDDATA_KEEP_MINUTES = "oldDataKeepMinutes";
/**
* 用于区分多个分析集群,一个分析集群可以由多个master和slave组成
*/
private final static String GROUP_ID = "groupId";
/**
* 用于配置指定的报表分发到指定Master上面
*/
private final static String REPORT_TO_MASTER = "report2Master";
/**
* 标识是否有zookeeper作为部分配置存储中心
*/
private final static String ZK_SERVER = "zkServer";
/**
* 监控HTTP服务文档目录
*/
private final static String MONITOR_DOC_ROOT = "monitorDocRoot";
private final static String DEFAULT_MONITOR_DOC_ROOT = "/tmp";
/**
* 监控HTTP服务端口
*/
private final static String MONITOR_PORT = "monitorPort";
/**
* Master导出监控新的周期, 到出到报表
*/
private final static String EXPORT_MONITOR_INTERVAL = "exportMonitorInterval";
/**
* 是否为DispatchMaster
*/
private final static String DISPATCH_MASTER = "dispatchMaster";
public String getZkServer()
{
if(this.properties.containsKey(ZK_SERVER))
return this.properties.get(ZK_SERVER);
else
return null;
}
public void setZkServer(String zkServer)
{
this.properties.put(ZK_SERVER,zkServer);
}
public String getGroupId()
{
if(this.properties.containsKey(GROUP_ID))
return this.properties.get(GROUP_ID);
else
return "_default_group_";
}
public void setGroupId(String GroupId)
{
this.properties.put(GROUP_ID,GroupId);
}
public int getOldDataKeepMinutes()
{
if(this.properties.containsKey(OLDDATA_KEEP_MINUTES))
return Integer.valueOf(this.properties.get(OLDDATA_KEEP_MINUTES));
else
return 120;
}
public void setOldDataKeepMinutes(String oldDataKeepMinutes)
{
this.properties.put(OLDDATA_KEEP_MINUTES,oldDataKeepMinutes);
}
public String getTempStoreDataDir()
{
if(this.properties.containsKey(TEMP_STORE_DATA_DIR))
return (String)this.properties.get(TEMP_STORE_DATA_DIR);
else
return "temp";
}
public void setTempStoreDataDir(String tempStoreDataDir)
{
this.properties.put(TEMP_STORE_DATA_DIR,tempStoreDataDir);
}
public String getMasterGroup()
{
if(this.properties.containsKey(MASTER_GROUP))
return (String)this.properties.get(MASTER_GROUP);
else
return null;
}
public void setMasterGroup(String masterGroup) {
this.properties.put(MASTER_GROUP,masterGroup);
}
public boolean isUseAsynModeToSendResponse() {
if(this.properties.containsKey(USE_ASYN_MODE_TO_SEND_RESPONSE))
return Boolean.valueOf((String)this.properties.get(USE_ASYN_MODE_TO_SEND_RESPONSE));
else
return true;
}
public void setUseAsynModeToSendResponse(String useAsynModeToSendResponse) {
this.properties.put(USE_ASYN_MODE_TO_SEND_RESPONSE,useAsynModeToSendResponse);
}
public String getMasterName() {
if(this.properties.containsKey(MASTER_NAME))
return (String)this.properties.get(MASTER_NAME);
else
return "_Default_Master_" + ReportUtil.getIp();
}
public void setMasterName(String masterName) {
this.properties.put(MASTER_NAME,masterName);
}
public int getMasterPort() {
if(this.properties.containsKey(MASTER_PORT))
return Integer.parseInt((String)this.properties.get(MASTER_PORT));
else
return 7777;
}
public void setMasterPort(String masterPort) {
this.properties.put(MASTER_PORT,masterPort);
}
public String getJobsSource()
{
if(this.properties.containsKey(JOBS_SOURCE))
return (String)this.properties.get(JOBS_SOURCE);
else
return null;
}
public void setJobsSource(String jobsSource)
{
this.properties.put(JOBS_SOURCE,jobsSource);
}
public int getMaxJobEventWorker() {
if(this.properties.containsKey(MAX_JOBEVENT_WORKER))
return Integer.parseInt((String)this.properties.get(MAX_JOBEVENT_WORKER));
else
return 50;
}
public void setMaxJobEventWorker(String maxJobEventWorker) {
this.properties.put(MAX_JOBEVENT_WORKER, maxJobEventWorker);
}
public int getMaxMergeJobWorker() {
if(this.properties.containsKey(MAX_MERGE_JOB_WORKER))
return Integer.parseInt((String)this.properties.get(MAX_MERGE_JOB_WORKER));
else
{
return processorCount + 3;
}
}
public void setMaxMergeJobWorker(String maxMergeJobWorker) {
this.properties.put(MAX_MERGE_JOB_WORKER, maxMergeJobWorker);
}
public int getMaxCreateReportWorker() {
if(this.properties.containsKey(MAX_CREATE_REPORT_WORKER))
return Integer.parseInt((String)this.properties.get(MAX_CREATE_REPORT_WORKER));
else
return 10;
}
public void setMaxCreateReportWorker(String maxCreateReportWorker) {
this.properties.put(MAX_CREATE_REPORT_WORKER, maxCreateReportWorker);
}
public int getMinMergeJobCount() {
if(this.properties.containsKey(MIN_MERGE_JOB_COUNT))
return Integer.parseInt((String)this.properties.get(MIN_MERGE_JOB_COUNT));
else
return 1;
}
public void setMinMergeJobCount(String minMergeJobCount) {
this.properties.put(MIN_MERGE_JOB_COUNT, minMergeJobCount);
}
public long getMaxJobResultBundleWaitTime() {
if(this.properties.containsKey(MAX_JOB_RESULT_BUNDLE_WAITTIME))
return Long.parseLong((String)this.properties.get(MAX_JOB_RESULT_BUNDLE_WAITTIME)) * 1000;
else
return 60 * 1000;
}
public void setMaxJobResultBundleWaitTime(String maxJobResultBundleWaitTime) {
this.properties.put(MAX_JOB_RESULT_BUNDLE_WAITTIME,maxJobResultBundleWaitTime);
}
public long getExportInterval() {
if(this.properties.containsKey(EXPORT_INTERVAL))
return Long.parseLong((String)this.properties.get(EXPORT_INTERVAL)) * 1000;
else
return 600 * 1000;
}
public void setExportInterval(String exportInterval) {
this.properties.put(EXPORT_INTERVAL,exportInterval);
}
public boolean getSaveTmpResultToFile() {
if(this.properties.containsKey(SAVE_TMP_RESULT_TO_FILE))
return Boolean.parseBoolean((String)this.properties.get(SAVE_TMP_RESULT_TO_FILE));
else
return true;
}
public void setSaveTmpResultToFile(String saveTmpResultToFile) {
this.properties.put(SAVE_TMP_RESULT_TO_FILE,saveTmpResultToFile);
}
public int getAsynLoadDiskFilePrecent() {
if(this.properties.containsKey(ASYN_LOAD_DISK_FILE_PRECENT))
return Integer.parseInt((String)this.properties.get(ASYN_LOAD_DISK_FILE_PRECENT));
else
return 85;
}
public void setAsynLoadDiskFilePrecent(String asynLoadDiskFilePrecent) {
this.properties.put(ASYN_LOAD_DISK_FILE_PRECENT,asynLoadDiskFilePrecent);
}
public void setReportToMaster(String report2Master) {
this.properties.put(REPORT_TO_MASTER, report2Master);
}
public Map<String, String> getReportToMaster() {
if(this.properties.containsKey(REPORT_TO_MASTER))
return AnalyzerUtil.convertStringToMap(this.properties.get(REPORT_TO_MASTER), ",", "|");
else
return new HashMap<String, String>();
}
public String getMonitorDocRoot() {
if(this.properties.containsKey(MONITOR_DOC_ROOT))
return (String)this.properties.get(MONITOR_DOC_ROOT);
else
return DEFAULT_MONITOR_DOC_ROOT;
}
public int getMonitorPort() {
if(this.properties.containsKey(MONITOR_PORT))
return Integer.parseInt((String)this.properties.get(MONITOR_PORT));
else
return 8421;
}
public void setMonitorPort(int port) {
this.properties.put(MONITOR_PORT, String.valueOf(port));
}
public int getExportMonitorInterval() {
if(this.properties.containsKey(EXPORT_MONITOR_INTERVAL)) {
return Integer.parseInt((String)this.properties.get(EXPORT_MONITOR_INTERVAL));
} else {
// 默认5分钟
return 300;
}
}
public void setExportMonitorInterval(int interval) {
this.properties.put(EXPORT_MONITOR_INTERVAL, String.valueOf(interval));
}
public String getSystemMonitorInfoOutput() {
if(this.properties.containsKey(SYSTEM_MONITOR_INFO_OUTPUT)) {
return (String)this.properties.get(SYSTEM_MONITOR_INFO_OUTPUT);
} else {
// 默认5分钟
return "./system";
}
}
public void setSystemMonitorInfoOutput(String output) {
this.properties.put(SYSTEM_MONITOR_INFO_OUTPUT, output);
}
public boolean getDispatchMaster() {
if(this.properties.containsKey(DISPATCH_MASTER)) {
return Boolean.parseBoolean((String)this.properties.get(DISPATCH_MASTER));
}
//默认为true
return true;
}
public void setDispatchMaster(String dispatchMaster) {
this.properties.put(DISPATCH_MASTER, dispatchMaster);
}
@Override
public String marshal() {
return new StringBuilder().append("timestamp=").append(System.currentTimeMillis()).append(",")
.append("groupId=").append(this.getGroupId()).append(",")
.append("masterName=").append(this.getMasterName()).append(",")
.append("masterPort=").append(this.getMasterPort()).append(",")
.append("jobsSource=").append(this.getJobsSource()).append(",")
.append("masterGroup=").append(this.getMasterGroup()).toString();
}
@Override
public void unmarshal(String content) {
if (StringUtils.isEmpty(content))
return;
String[] ct = content.split(",");
if (ct.length >= 6)
{
this.setGroupId(ct[1].substring(ct[1].indexOf("=")+1));
this.setMasterName(ct[2].substring(ct[2].indexOf("=")+1));
this.setMasterPort(ct[3].substring(ct[3].indexOf("=")+1));
this.setJobsSource(ct[4].substring(ct[4].indexOf("=")+1));
this.setMasterGroup(ct[5].substring(ct[5].indexOf("=")+1));
}
}
}