From c7caebe2ada53cb51bdc2834c37fd79bfcb31c6e Mon Sep 17 00:00:00 2001 From: ascrutae Date: Wed, 4 May 2016 21:01:37 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E5=87=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E7=BB=93=E6=9E=9C=E7=9A=84bug=202.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chainbuild/ChainBuildReducer.java | 116 +++++++-------- .../chainbuild/util/TokenGenerator.java | 37 +++-- .../analysis/config/HBaseTableMetaData.java | 2 + .../analysis/datacheck/02.scan4ColumnValue.md | 22 +++ .../analysis/mapper/CallChainMapperTest.java | 136 +----------------- .../mapper/ValidateMonthSummaryResult.java | 64 +++++++++ .../analysis/mapper/util/HBaseUtils.java | 60 ++++++++ 7 files changed, 227 insertions(+), 210 deletions(-) create mode 100644 skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/ValidateMonthSummaryResult.java create mode 100644 skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/util/HBaseUtils.java diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildReducer.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildReducer.java index 163670cd7..7e9947e2c 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildReducer.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildReducer.java @@ -1,8 +1,9 @@ package com.ai.cloud.skywalking.analysis.chainbuild; -import java.io.IOException; -import java.util.Iterator; - +import com.ai.cloud.skywalking.analysis.chainbuild.action.IStatisticsAction; +import com.ai.cloud.skywalking.analysis.chainbuild.po.SummaryType; +import com.ai.cloud.skywalking.analysis.config.Config; +import com.ai.cloud.skywalking.analysis.config.ConfigInitializer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -10,65 +11,64 @@ import org.apache.hadoop.mapreduce.Reducer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.ai.cloud.skywalking.analysis.chainbuild.action.IStatisticsAction; -import com.ai.cloud.skywalking.analysis.chainbuild.po.SummaryType; -import com.ai.cloud.skywalking.analysis.config.Config; -import com.ai.cloud.skywalking.analysis.config.ConfigInitializer; +import java.io.IOException; +import java.util.Iterator; public class ChainBuildReducer extends Reducer { - private Logger logger = LogManager.getLogger(ChainBuildReducer.class); + private Logger logger = LogManager.getLogger(ChainBuildReducer.class); - @Override - protected void setup(Context context) throws IOException, - InterruptedException { - ConfigInitializer.initialize(); - Config.AnalysisServer.IS_ACCUMULATE_MODE = Boolean.parseBoolean(context - .getConfiguration().get("skywalking.analysis.mode", "false")); - logger.info("Skywalking analysis mode :[{}]", - Config.AnalysisServer.IS_ACCUMULATE_MODE ? "ACCUMULATE" - : "REWRITE"); - } + @Override + protected void setup(Context context) throws IOException, + InterruptedException { + ConfigInitializer.initialize(); + Config.AnalysisServer.IS_ACCUMULATE_MODE = Boolean.parseBoolean(context + .getConfiguration().get("skywalking.analysis.mode", "false")); + logger.info("Skywalking analysis mode :[{}]", + Config.AnalysisServer.IS_ACCUMULATE_MODE ? "ACCUMULATE" + : "REWRITE"); + } - @Override - protected void reduce(Text key, Iterable values, Context context) - throws IOException, InterruptedException { - String reduceKey = Bytes.toString(key.getBytes()); - int index = reduceKey.indexOf(":"); - if (index == -1) { - return; - } - String summaryTypeAndDateStr = reduceKey.substring(0, index); - String entryKey = reduceKey.substring(index + 1); - - logger.debug("begin to reduce for key: {}", reduceKey); - IStatisticsAction summaryAction = SummaryType.chooseSummaryAction( - summaryTypeAndDateStr, entryKey); - doReduceAction(reduceKey, summaryAction, values.iterator()); - } + @Override + protected void reduce(Text key, Iterable values, Context context) + throws IOException, InterruptedException { + String reduceKey = key.toString(); - public void doReduceAction(String reduceKey, IStatisticsAction summaryAction, - Iterator iterator) { - long dataCounter = 0; - while (iterator.hasNext()) { - String summaryData = iterator.next().toString(); - try { - summaryAction.doAction(summaryData); - } catch (Exception e) { - logger.error( - "Failed to summary call chain, maybe illegal data:" - + summaryData, e); - }finally{ - dataCounter++; - } - if(dataCounter % 1000 == 0){ - logger.debug("reduce for key: {}, count: {}", reduceKey, dataCounter); - } - } + int index = reduceKey.indexOf(":"); + if (index == -1) { + return; + } + String summaryTypeAndDateStr = reduceKey.substring(0, index); + String entryKey = reduceKey.substring(index + 1); - try { - summaryAction.doSave(); - } catch (Exception e) { - logger.error("Failed to save summaryresult/chainTree.", e); - } - } + IStatisticsAction summaryAction = SummaryType.chooseSummaryAction( + summaryTypeAndDateStr, entryKey); + doReduceAction(entryKey, summaryAction, values.iterator()); + } + + public void doReduceAction(String reduceKey, IStatisticsAction summaryAction, + Iterator iterator) { + long dataCounter = 0; + while (iterator.hasNext()) { + String summaryData = iterator.next().toString(); + try { + summaryAction.doAction(summaryData); + } catch (Exception e) { + logger.error( + "Failed to summary call chain, maybe illegal data:" + + summaryData, e); + } finally { + dataCounter++; + } + if (dataCounter % 1000 == 0) { + logger.debug("reduce for key: {}, count: {}", reduceKey, dataCounter); + } + } + + try { + summaryAction.doSave(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("Failed to save summaryresult/chainTree.", e); + } + } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/TokenGenerator.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/TokenGenerator.java index c27936d3c..7023ebbb9 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/TokenGenerator.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/util/TokenGenerator.java @@ -26,24 +26,23 @@ public class TokenGenerator { } private static String generate(String originData) { -// StringBuilder result = new StringBuilder(); -// if (originData != null) { -// try { -// MessageDigest md = MessageDigest.getInstance("MD5"); -// byte bytes[] = md.digest(originData.getBytes()); -// for (int i = 0; i < bytes.length; i++) { -// String str = Integer.toHexString(bytes[i] & 0xFF); -// if (str.length() == 1) { -// str += "F"; -// } -// result.append(str); -// } -// } catch (NoSuchAlgorithmException e) { -// logger.error("Cannot found algorithm.", e); -// System.exit(-1); -// } -// } -// return result.toString().toUpperCase(); - return originData; + StringBuilder result = new StringBuilder(); + if (originData != null) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte bytes[] = md.digest(originData.getBytes()); + for (int i = 0; i < bytes.length; i++) { + String str = Integer.toHexString(bytes[i] & 0xFF); + if (str.length() == 1) { + str += "F"; + } + result.append(str); + } + } catch (NoSuchAlgorithmException e) { + logger.error("Cannot found algorithm.", e); + System.exit(-1); + } + } + return result.toString().toUpperCase(); } } \ No newline at end of file diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/HBaseTableMetaData.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/HBaseTableMetaData.java index b4e4842de..869b473cb 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/HBaseTableMetaData.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/HBaseTableMetaData.java @@ -8,6 +8,8 @@ public class HBaseTableMetaData { */ public final static class TABLE_CALL_CHAIN { public static final String TABLE_NAME = "sw-call-chain"; + + public static final String FAMILY_NAME = "call-chain"; } diff --git a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/datacheck/02.scan4ColumnValue.md b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/datacheck/02.scan4ColumnValue.md index d3581f1de..1fa10fa9f 100644 --- a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/datacheck/02.scan4ColumnValue.md +++ b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/datacheck/02.scan4ColumnValue.md @@ -10,4 +10,26 @@ scan 'sw-chain-info', { FILTER =>SingleColumnValueFilter.new(Bytes.toBytes('trace_info'),Bytes.toBytes('cid'), CompareFilter::CompareOp.valueOf('EQUAL'), BinaryComparator.new(Bytes.toBytes('CID_B4CAEE3953B3C0DBD7A43656B2EEE345')))} +``` + +* 限制查询某张表的条数 +**以下只返回10条记录** +```java +scan "sw-treeId-cid-mapping",{LIMIT =>10} +``` + +* 根据TreeId查询某个月份合并过的CID +**以下是查询2016年4月份TREE_ID_BF32F7D57F6E69912C8AF2487F1FFCE1合并过的CID** +```java +get "sw-treeId-cid-mapping","TREE_ID_354AF3F3F58CE4AECFCC7782A188396B@2016-3" +``` + +* 根据CID查询所有归属TraceId +```java +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; +import org.apache.hadoop.hbase.filter.BinaryComparator; +import org.apache.hadoop.hbase.filter.CompareFilter; +import org.apache.hadoop.hbase.filter. Filter; +scan 'sw-traceId-cid-mapping', { FILTER =>SingleColumnValueFilter.new(Bytes.toBytes('cid'),Bytes.toBytes('cid'), CompareFilter::CompareOp.valueOf('EQUAL'),BinaryComparator.new(Bytes.toBytes('CID_A4AD2F204E3DA016BC455AB95FAEFFF9')))} ``` \ No newline at end of file diff --git a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapperTest.java b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapperTest.java index bd13ce47f..68dc01d65 100644 --- a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapperTest.java +++ b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapperTest.java @@ -2,23 +2,15 @@ package com.ai.cloud.skywalking.analysis.mapper; import com.ai.cloud.skywalking.analysis.chainbuild.ChainBuildMapper; -import com.ai.cloud.skywalking.analysis.chainbuild.ChainBuildReducer; -import com.ai.cloud.skywalking.analysis.chainbuild.action.IStatisticsAction; import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainInfo; -import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; -import com.ai.cloud.skywalking.analysis.chainbuild.po.SummaryType; -import com.ai.cloud.skywalking.analysis.chainbuild.util.TokenGenerator; import com.ai.cloud.skywalking.analysis.config.ConfigInitializer; import com.ai.cloud.skywalking.analysis.config.HBaseTableMetaData; +import com.ai.cloud.skywalking.analysis.mapper.util.HBaseUtils; import com.ai.cloud.skywalking.protocol.Span; -import com.google.gson.Gson; -import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.io.Text; import org.junit.Test; import java.io.IOException; @@ -26,30 +18,12 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; -/** - * Created by astraea on 2016/1/15. - */ public class CallChainMapperTest { - private static String ZK_QUORUM = "10.1.235.197,10.1.235.198,10.1.235.199"; - // private static String ZK_QUORUM = "10.1.241.18,10.1.241.19,10.1.241.20"; - private static String ZK_CLIENT_PORT = "29181"; - private static String chain_Id = "1.0b.1461569643178.5b468e7.23292.118.68"; - //private static String chain_Id = "1.0a2.1453429608422.2701d43.6468.56.1"; - - private static Configuration configuration = null; - private static Connection connection; - - - private static SimpleDateFormat hourSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); - private static SimpleDateFormat daySimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); - private static SimpleDateFormat monthSimpleDateFormat = new SimpleDateFormat("yyyy-MM"); - private static SimpleDateFormat yearSimpleDateFormat = new SimpleDateFormat("yyyy"); + private static Connection connection = HBaseUtils.getConnection(); public static void main(String[] args) throws Exception { ConfigInitializer.initialize(); - initHBaseClient(); - // 2016-04-22/23:57:03 to 2016-05-02/23:47:03 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss"); Date startDate = simpleDateFormat.parse("2016-04-22/23:57:03"); Date endDate = simpleDateFormat.parse("2016-05-02/23:47:03"); @@ -58,113 +32,9 @@ public class CallChainMapperTest { Table table = connection.getTable(TableName.valueOf(HBaseTableMetaData.TABLE_CALL_CHAIN.TABLE_NAME)); ResultScanner result = table.getScanner(scan); int count = 0; - for (Result result1 : result){ + for (Result result1 : result) { count++; } System.out.println(count); - -// List spanList = selectByTraceId(chain_Id); -// ChainInfo chainInfo = ChainBuildMapper.spanToChainInfo(chain_Id, spanList); -// List chainNodeInfo = new ArrayList<>(); -// for (ChainNode chainNode : chainInfo.getNodes()) { -// List value1 = new ArrayList(); -// Text key =new Text(SummaryType.YEAR.getValue() + "-" + yearSimpleDateFormat.format( -// new Date(chainNode.getStartDate()) -// ) + ":" + chainInfo.getCallEntrance()); -// value1.add(new Text(new Gson().toJson(chainNode))); -// -// String reduceKey = Bytes.toString(key.getBytes()); -// int index = reduceKey.indexOf(":"); -// if (index == -1) { -// return; -// } -// -// String summaryTypeAndDateStr = reduceKey.substring(0, index); -// String entryKey = reduceKey.substring(index + 1); -// IStatisticsAction summaryAction = SummaryType.chooseSummaryAction(summaryTypeAndDateStr, entryKey); -// -// new ChainBuildReducer().doReduceAction(reduceKey, summaryAction, value1.iterator()); -// } - } - - public static List selectByTraceId(String traceId) throws IOException { - List entries = new ArrayList(); - Table table = connection.getTable(TableName.valueOf(HBaseTableMetaData.TABLE_CALL_CHAIN.TABLE_NAME)); - Get g = new Get(Bytes.toBytes(traceId)); - Result r = table.get(g); - for (Cell cell : r.rawCells()) { - if (cell.getValueArray().length > 0) - entries.add(new Span(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()))); - } - return entries; - } - - @Test - public void validateSummaryResult() throws IOException, ParseException { - List chainInfoList = selectSpecificCallEntranceSpansOnSpecificCallTime("com.ai.aisse.core.service.impl.SynchAisseWorkDataServiceImpl.SynchAisseDataDel()", "2016-01-26/10:00:00", "2016-02-08/10:00:00"); - - System.out.println("size :" + chainInfoList.size()); - Map summaryResult = new HashMap(); - for (ChainInfo chainInfo : chainInfoList) { - String key = generateKey(chainInfo.getStartDate()); - Integer total = summaryResult.get(key); - if (total == null) { - total = 0; - } - summaryResult.put(key, ++total); - } - - for (Map.Entry entry : summaryResult.entrySet()) { - System.out.println(entry.getKey() + " " + entry.getValue()); - } - - } - - private String generateKey(long startDate) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(new Date(startDate)); - return calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" - + calendar.get(Calendar.DAY_OF_MONTH); - } - - public static List selectSpecificCallEntranceSpansOnSpecificCallTime(String callEntrance, String startDate, String endDate) throws IOException, ParseException { - List chainInfos = new ArrayList(); - Table table = connection.getTable(TableName.valueOf(HBaseTableMetaData.TABLE_CALL_CHAIN.TABLE_NAME)); - Scan scan = new Scan(); - scan.setTimeRange(new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss").parse(startDate).getTime(), new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss").parse(endDate).getTime()); - ResultScanner resultScanner = table.getScanner(scan); - Iterator resultIterator = resultScanner.iterator(); - while (resultIterator.hasNext()) { - Result result = resultIterator.next(); - List entries = new ArrayList(); - for (Cell cell : result.rawCells()) { - if (cell.getValueArray().length > 0) - entries.add(new Span(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()))); - } - ChainInfo chainInfo = null; - try { - chainInfo = ChainBuildMapper.spanToChainInfo(Bytes.toString(result.getRow()), entries); - } catch (Exception e) { - continue; - } - // System.out.println(chainInfo.getCallEntrance()); - if (callEntrance.equalsIgnoreCase(chainInfo.getCallEntrance())) { - chainInfos.add(chainInfo); - } - } - - return chainInfos; - } - - public static void initHBaseClient() throws IOException { - if (configuration == null) { - configuration = HBaseConfiguration.create(); - configuration.set("hbase.zookeeper.quorum", ZK_QUORUM); - configuration.set("hbase.zookeeper.property.clientPort", ZK_CLIENT_PORT); - configuration.set("hbase.rpc.timeout", "600000"); - connection = ConnectionFactory.createConnection(configuration); - } - - ConfigInitializer.initialize(); } } \ No newline at end of file diff --git a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/ValidateMonthSummaryResult.java b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/ValidateMonthSummaryResult.java new file mode 100644 index 000000000..e65d7f972 --- /dev/null +++ b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/ValidateMonthSummaryResult.java @@ -0,0 +1,64 @@ +package com.ai.cloud.skywalking.analysis.mapper; + +import com.ai.cloud.skywalking.analysis.chainbuild.ChainBuildMapper; +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainInfo; +import com.ai.cloud.skywalking.analysis.chainbuild.po.ChainNode; +import com.ai.cloud.skywalking.analysis.config.HBaseTableMetaData; +import com.ai.cloud.skywalking.analysis.mapper.util.HBaseUtils; +import com.ai.cloud.skywalking.protocol.Span; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.*; +import org.apache.hadoop.hbase.filter.CompareFilter; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; +import org.apache.hadoop.hbase.util.Bytes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ValidateMonthSummaryResult { + public static void main(String[] args) throws IOException { + Connection connection = HBaseUtils.getConnection(); + Table table = connection.getTable(TableName.valueOf + (HBaseTableMetaData.TABLE_CALL_CHAIN.TABLE_NAME)); + Scan scan = new Scan(); + Filter filter = new SingleColumnValueFilter(HBaseTableMetaData.TABLE_CALL_CHAIN.FAMILY_NAME.getBytes(), + "0-S".getBytes(), CompareFilter.CompareOp.EQUAL, + "http://hire.asiainfo.com/Aisse-Mobile-Web/aisseWorkUser/queryProsonLoding".getBytes()); + scan.setFilter(filter); + ResultScanner resultScanner = table.getScanner(scan); + + List chainInfos = new ArrayList(); + + for (Result result : resultScanner) { + List spanList = new ArrayList(); + for (Cell cell : result.rawCells()) { + spanList.add(new Span(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()))); + } + + chainInfos.add(ChainBuildMapper.spanToChainInfo(Bytes.toString(result.getRow()), spanList)); + } + + Map totalCallSize = new HashMap(); + Map totalCallTimes = new HashMap<>(); + for (ChainInfo chainInfo : chainInfos) { + for (ChainNode chainNode : chainInfo.getNodes()) { + Integer totalCall = totalCallSize.get(chainNode.getViewPoint()); + if (totalCallSize == null) { + totalCall = 0; + } + totalCallSize.put(chainNode.getTraceLevelId(), ++totalCall); + + Float totalCallTime = totalCallTimes.get(chainNode.getViewPoint()); + if (totalCallTime == null) { + totalCallTime = 0F; + } + totalCallTimes.put(chainNode.getTraceLevelId(), (totalCallTime + chainNode.getCost())); + } + } + } +} diff --git a/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/util/HBaseUtils.java b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/util/HBaseUtils.java new file mode 100644 index 000000000..fef08ebe8 --- /dev/null +++ b/skywalking-analysis/src/test/java/com/ai/cloud/skywalking/analysis/mapper/util/HBaseUtils.java @@ -0,0 +1,60 @@ +package com.ai.cloud.skywalking.analysis.mapper.util; + +import com.ai.cloud.skywalking.analysis.config.ConfigInitializer; +import com.ai.cloud.skywalking.analysis.config.HBaseTableMetaData; +import com.ai.cloud.skywalking.protocol.Span; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.*; +import org.apache.hadoop.hbase.util.Bytes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by xin on 16-5-4. + */ +public class HBaseUtils { + + private static String ZK_QUORUM = "host-10-1-241-18,host-10-1-241-19,host-10-1-241-20"; + private static String ZK_CLIENT_PORT = "29181"; + + private static Configuration configuration = null; + private static Connection connection; + + static { + if (configuration == null) { + configuration = HBaseConfiguration.create(); + configuration.set("hbase.zookeeper.quorum", ZK_QUORUM); + configuration.set("hbase.zookeeper.property.clientPort", ZK_CLIENT_PORT); + configuration.set("hbase.rpc.timeout", "600000"); + try { + connection = ConnectionFactory.createConnection(configuration); + } catch (IOException e) { + e.printStackTrace(); + System.exit(-1); + } + } + + ConfigInitializer.initialize(); + } + + public static Connection getConnection() { + return connection; + } + + public static List selectByTraceId(String traceId) throws IOException { + List entries = new ArrayList(); + Table table = connection.getTable(TableName.valueOf(HBaseTableMetaData.TABLE_CALL_CHAIN.TABLE_NAME)); + Get g = new Get(Bytes.toBytes(traceId)); + Result r = table.get(g); + for (Cell cell : r.rawCells()) { + if (cell.getValueArray().length > 0) + entries.add(new Span(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()))); + } + return entries; + } +}