/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.dao.hbase; import com.navercorp.pinpoint.common.hbase.HBaseTables; import com.navercorp.pinpoint.common.hbase.HbaseOperations2; import com.navercorp.pinpoint.common.hbase.ResultsExtractor; import com.navercorp.pinpoint.common.hbase.RowMapper; import com.navercorp.pinpoint.common.util.ApplicationMapStatisticsUtils; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; import com.navercorp.pinpoint.web.dao.MapStatisticsCalleeDao; import com.navercorp.pinpoint.web.mapper.*; import com.navercorp.pinpoint.web.util.TimeWindow; import com.navercorp.pinpoint.web.util.TimeWindowDownSampler; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.Range; import com.navercorp.pinpoint.web.vo.RangeFactory; import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; import org.apache.hadoop.hbase.client.Scan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; /** * @author netspider * @author emeroad */ @Repository public class HbaseMapStatisticsCalleeDao implements MapStatisticsCalleeDao { private static final int MAP_STATISTICS_CALLER_VER2_NUM_PARTITIONS = 32; private Logger logger = LoggerFactory.getLogger(this.getClass()); private int scanCacheSize = 40; @Autowired private HbaseOperations2 hbaseOperations2; @Autowired @Qualifier("mapStatisticsCalleeMapper") private RowMapper<LinkDataMap> mapStatisticsCalleeMapper; @Autowired private RangeFactory rangeFactory; @Autowired @Qualifier("statisticsCalleeRowKeyDistributor") private RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; @Override public LinkDataMap selectCallee(Application calleeApplication, Range range) { if (calleeApplication == null) { throw new NullPointerException("calleeApplication must not be null"); } if (range == null) { throw new NullPointerException("range must not be null"); } final TimeWindow timeWindow = new TimeWindow(range, TimeWindowDownSampler.SAMPLER); // find distributed key - ver2. final Scan scan = createScan(calleeApplication, range, HBaseTables.MAP_STATISTICS_CALLER_VER2_CF_COUNTER); ResultsExtractor<LinkDataMap> resultExtractor = new RowMapReduceResultExtractor<>(mapStatisticsCalleeMapper, new MapStatisticsTimeWindowReducer(timeWindow)); LinkDataMap linkDataMap = hbaseOperations2.findParallel(HBaseTables.MAP_STATISTICS_CALLER_VER2, scan, rowKeyDistributorByHashPrefix, resultExtractor, MAP_STATISTICS_CALLER_VER2_NUM_PARTITIONS); logger.debug("Callee data. {}, {}", linkDataMap, range); if (linkDataMap != null && linkDataMap.size() > 0) { return linkDataMap; } return new LinkDataMap(); } private Scan createScan(Application application, Range range, byte[] family) { range = rangeFactory.createStatisticsRange(range); if (logger.isDebugEnabled()) { logger.debug("scan time:{} ", range.prettyToString()); } // start key is replaced by end key because timestamp has been reversed byte[] startKey = ApplicationMapStatisticsUtils.makeRowKey(application.getName(), application.getServiceTypeCode(), range.getTo()); byte[] endKey = ApplicationMapStatisticsUtils.makeRowKey(application.getName(), application.getServiceTypeCode(), range.getFrom()); Scan scan = new Scan(); scan.setCaching(this.scanCacheSize); scan.setStartRow(startKey); scan.setStopRow(endKey); scan.addFamily(family); scan.setId("ApplicationStatisticsScan"); return scan; } }