统计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 }

浙公网安备 33010602011771号