package com.nexr.platform.search; import com.nexr.platform.search.consumer.DataConsumer; import com.nexr.platform.search.provider.CdrLogRecordDataProvider; import com.nexr.platform.search.provider.DataProvider; import com.nexr.platform.search.provider.SdpXContentDataProvider; import com.nexr.platform.search.router.Router; import com.nexr.platform.search.router.RouterFactory; import com.nexr.platform.search.router.RoutingEvent; import com.nexr.platform.search.util.TimerClass; import java.io.FileInputStream; import java.io.IOException; import java.util.Collection; import java.util.Properties; import java.util.Timer; /** * ElasticSearch 의 Indexing Client 로서의 기능을 수행 한다. * Produce - Consumer Pattern 으로 설계 되어져 있다. * * Mady by David.Woo - 2011.07.20 * david.woo@nexr.com */ public class ClientIndexer implements DataConsumer<RoutingEvent> { private final Router _router; private volatile long _consumeCount; /** * Indexing 을 수행한 data 의 수를 가져 온다. * @return Indexing Count */ public long getConsumeCount() { return _consumeCount; } /** * ClientIndexer 의 생성자. * @param properties Node Client 관련 설정. */ public ClientIndexer(Properties properties) { RouterFactory factory = RouterFactory.getInstance(); _router = factory.create(properties); _consumeCount = 0L; } /** * Data 를 Indexing 한다. * @param data RoutingEvent Data - > key, Value 로 이루어 져 있다. */ public void consume(Collection<DataEvent<RoutingEvent>> data) { if((data != null) && (data.size() > 0)) { for(DataEvent<RoutingEvent> route : data) { try{ _router.route(route.getData()); _consumeCount++; } catch(Exception e){ try { _router.route(route.getData()); _consumeCount++; }catch(Exception e2){ e2.printStackTrace(); } } } } if(data != null) data.clear(); } public static void main(String[] args) throws InterruptedException, IOException { String configFilePath, dataFilePath, logFilePath; String columnFilePath, sdComCellFilePath, sdComSecFilePath, serverIP, usedColumnFilePath; boolean isCdr; if(args.length > 0) { configFilePath = args[0]; dataFilePath = args[1]; logFilePath = args[2]; isCdr = Boolean.parseBoolean(args[3]); columnFilePath = args[4]; serverIP = args[5]; // sdComCellFilePath = args[6]; // sdComSecFilePath = args[7]; usedColumnFilePath = args[6]; } else { /************************************************************************************************************************ * * Sdp Config or Cdr Config 둘 중에 한 가지만 설정 할 것. * ************************************************************************************************************************/ /** * SDP Config in Mac Book. */ /*confFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/config/properties/SdpClient.conf"; dataFilePath = "/Users/david/Data/SearchPlatform/SDP/hdfs/data"; logFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/logs/test.log"; isCdr = false;*/ /** * SDP Config in Linux. */ /*confFilePath = "/home/david/IdeaProjects/DavidResearch/NexrSearchClient/config/properties/SdpClient.conf"; dataFilePath = "/home/david/Data/SearchPlatform/SDP/hdfs/data"; logFilePath = "/home/david/IdeaProjects/DavidResearch/NexrSearchClient/logs/test.log"; isCdr = false;*/ /* CDR Config with Sequence Local File Data */ configFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/config/properties/CdrClient.conf"; dataFilePath = "/Users/david/Data/SearchPlatform/CDR/hdfs/data"; logFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/logs/cdrIndexing.log"; isCdr = true; /** * CDR Config without Sequence Local File Data * Properties prof * String columnFilePath * String dataFilePath * String serverIP * String sdComCellFilePath * String sdComSecFilePath */ configFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/config/properties/CdrClient.conf"; dataFilePath = "/Users/david/Execute/Data/SearchPlatform/CDR/sample_cdr_data.csv"; logFilePath = "/Users/david/IdeaProjects/DavidResearch/NexrSearchClient/logs/cdrIndexing.log"; isCdr = true; columnFilePath = "/Users/david/Execute/nexrsearch_client/config/wcd_column.txt"; sdComCellFilePath = "/Users/david/Execute/nexrsearch_client/config/sd_com_cell.csv"; sdComSecFilePath = "/Users/david/Execute/nexrsearch_client/config/sd_com_sec.csv"; serverIP = "127.0.0.1"; usedColumnFilePath = "/Users/david/Execute/nexrsearch_client/config/wcd_used_column.txt"; } /** * 설정 파일을 읽어 온다. */ FileInputStream fs = new FileInputStream(configFilePath); Properties properties = new Properties(); properties.load(fs); /** * Provider 생성. * BatchSize 는 Provider 에서 한번에 처리할 양. * 여기 서는 데이터 를 hadoop fileSystem 에서 읽어 오는 숫자로 이해 하면 된다. */ DataProvider<RoutingEvent> provider = null; // if(isCdr) provider = new CdrXContentDataProvider(dataFilePath, properties); try { if(isCdr) provider = new CdrLogRecordDataProvider(properties, columnFilePath, dataFilePath, serverIP, usedColumnFilePath); else provider = new SdpXContentDataProvider(dataFilePath, properties); provider.setBatchSize(1000); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(-1); } /** * Consumer 생성. */ DataConsumer<RoutingEvent> consumer = new ClientIndexer(properties); provider.setDataConsumer(consumer); /** * TPS 측정을 위한 Timer Thread Class 생성. */ Timer timer = new Timer(); TimerClass timerClass = new TimerClass(provider, consumer, logFilePath); timer.scheduleAtFixedRate(timerClass, 1000, 1000); /** * 시작! */ provider.start(); } }