统计Druid集群DataSource的数据量

如果要统计Druid集群中各个DataSource的数据量,分两步:先获取DataSource列表,再获取每个DataSource的数据分片。

1、获取DataSource列表

get  http://clusterIP:clusterPort/druid/v2/datasources

Result: ["HATest","ETL_DataTest","DruidMonitoring","TerminalStatus"]

2、获取每个DataSource的数据分片。

post  http://clusterIP:clusterPort/druid/v2/

"Content-type: application/json"

参数:

{
"queryType":"segmentMetadata",
"dataSource":"HATest",
"intervals":["2013-01-01/2018-01-01"]
}

参数说明:

dataSource:要查询的DataSource

intervals:要查询的分片时间范围。Druid是以时间进行分片的。

特别注意:

Druid的深度存储机制,导致Druid默认的存储就有2份,一个是深度存储,一个是分发到各节点上的备份。此处取到的tableSize是深度存储的值。

/*Druid的备份数说明:默认为1表示无副本,此时实际存储了两份,即2=深度存储1 + 节点备份1。
当有一个副本时,备份数为2,此时实际存储了三份,即3=深度存储1 + 节点备份1 + 副本1。*/
/*ES的副本数则不同:默认为0表示无副本,实际只存一份。副本数为n表示 实际存储1+n份。*/

-----------------------------------

c#代码:

  1         public Dictionary<string,ResourceEntity> GetDruidTableSizeInfo()
  2         {
  3             StreamReader reader = null;
  4             WebResponse rs = null;
  5             HttpWebRequest req = null;
  6             string druidUrl = AppConfigGetter.Get(ConfigConstants.KEY_Druidurl);
  7             #region 获取 DataSource列表
  8             string uri_datasources = string.Format("{0}/druid/v2/datasources", druidUrl);
  9             List<string> dataSources = new List<string>();
 10             try
 11             {
 12                 req = WebRequest.Create(new Uri(uri_datasources)) as HttpWebRequest;
 13                 req.Method = "GET";
 14                 rs = req.GetResponse();
 15                 Stream rss = rs.GetResponseStream();
 16                 reader = new StreamReader(rss);
 17                 string data = reader.ReadLine();
 18                 /*data示例:["HATest","ETL_CMDataTest","DruidMonitoring","TerminalStatus"]*/
 19                 var dsArray = JArray.Parse(data);
 20                 foreach(var ds in dsArray)
 21                 {
 22                     if (dataSources.Contains(ds.ToString()) == false)
 23                         dataSources.Add(ds.ToString());
 24                 }
 25             }
 26             catch
 27             {
 28                 throw;
 29             }
 30             finally
 31             {
 32                 if (null != reader)
 33                     reader.Close();
 34                 if (null != rs)
 35                     rs.Close();
 36             }
 37             #endregion
 38 
 39             Dictionary<string, ResourceEntity> result = new Dictionary<string, ResourceEntity>();
 40             if (dataSources.Count == 0) return result;
 41 
 42             #region 遍历 DataSource,获取其Segment,从中取出size并合计
 43             string beginDate = AppConfigGetter.Get(ConfigConstants.KEY_DruidBeginDate);
 44             string endDate = AppConfigGetter.Get(ConfigConstants.KEY_DruidEndDate);
 45             HttpWebResponse resp = null;
 46             long tableSize = 0;
 47             int copiesNum = 0;//目前没有副本。后续如果增加副本,再另外获取。注意:copiesNum=获取到的副本数-1,因为获取到的副本数默认=1表示无副本。
 48             foreach (var dataSource in dataSources)
 49             {
 50                 try
 51                 {        
 52                     req = (HttpWebRequest)WebRequest.Create(string.Format("{0}/druid/v2/", druidUrl));
 53                     req.Method = "POST";
 54                     req.ContentType = "application/json";
 55 
 56                     #region 添加Post 参数  
 57                     string param = "{\"queryType\":\"segmentMetadata\",\"dataSource\":\"" + dataSource + "\",\"intervals\":[\"" + beginDate + "/" + endDate + "\"]}";
 58                     byte[] paramData = Encoding.UTF8.GetBytes(param);
 59                     req.ContentLength = paramData.Length;
 60                     using (Stream reqStream = req.GetRequestStream())
 61                     {
 62                         reqStream.Write(paramData, 0, paramData.Length);
 63                         reqStream.Close();
 64                     }
 65                     #endregion
 66 
 67                     resp = (HttpWebResponse)req.GetResponse();
 68                     Stream stream = resp.GetResponseStream();
 69                     //获取响应内容  
 70                     reader = new StreamReader(stream);
 71                     string data = reader.ReadToEnd();
 72 
 73                     var segmentArray = JArray.Parse(data);
 74                     tableSize = 0;
 75                     foreach (var segment in segmentArray)
 76                     {
 77                         tableSize += Convert.ToInt64(((JObject)segment)["size"]);
 78                     }
 79                     result.Add(dataSource, new ResourceEntity()
 80                     {
 81                         Type = ResourceType.Druid,
 82                         TableName = dataSource,
 83                         CopiesNum = copiesNum,
 84                         Size_B = tableSize * (2 + copiesNum)//2=深度存储1 + 节点备份1。取到的tableSize是深度存储值
 85                     });
 86                     /*Druid的备份数说明:默认为1表示无副本,此时实际存储了两份,即2=深度存储1 + 节点备份1。
 87                     当有一个副本时,备份数为2,此时实际存储了三份,即3=深度存储1 + 节点备份1 + 副本1。*/
 88                     /*ES的副本数则不同:默认为0表示无副本,实际只存一份。副本数为n表示 实际存储1+n份。*/
 89                 }
 90                 catch
 91                 {
 92                     throw;
 93                 }
 94                 finally
 95                 {
 96                     if (null != reader)
 97                         reader.Close();
 98                     if (null != rs)
 99                         rs.Close();
100                 }
101             }
102             #endregion
103 
104             return result;
105         }
View Code

 

posted @ 2017-06-12 00:28  闲汉  阅读(604)  评论(0)    收藏  举报