/**
* Project: dataserver.tools-0.1.0-SNAPSHOT
*
* File Created at 2011-8-4
* $Id$
*
* Copyright 1999-2100 Alibaba.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Alibaba Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Alibaba.com.
*/
package com.alibaba.doris.client.tools.importdata;
import java.net.InetSocketAddress;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import com.alibaba.doris.cli.CommandLineHandler;
import com.alibaba.doris.cli.Option;
import com.alibaba.doris.client.net.Connection;
import com.alibaba.doris.client.net.ConnectionFactory;
import com.alibaba.doris.client.tools.concurrent.ParralelExecutor;
import com.alibaba.doris.client.tools.concurrent.ParralelTask;
import com.alibaba.doris.client.tools.concurrent.ParralelTaskFactory;
import com.alibaba.doris.common.route.MockVirtualRouter;
import com.alibaba.doris.common.route.VirtualRouter;
/**
* TODO Comment of NodeDataImporter
*
* @author luyi.huangly
*/
public class NodeDataImporter extends CommandLineHandler {
private String ip;
private int port;
private int vn;
private int c;
private String f;
private String t;
private String p;
private String verbose;
private Connection connection = null;
@Override
public void handleCommand() {
if ("log".equals(t)) {
} else if ("txt".equals(t)) {
final Queue<KeyPair> keyQueue = new LinkedBlockingQueue<KeyPair>();
final AtomicBoolean finish = new AtomicBoolean(false);
try {
final VirtualRouter virtualRouter = new MockVirtualRouter(vn);
ConnectionFactory factory = ConnectionFactory.getInstance();
InetSocketAddress remoteAddress = new InetSocketAddress(ip, port);
final Connection connection0 = factory.getConnection(remoteAddress);
connection0.open();
connection = connection0;
boolean needProfiling = "true".equals(p);
final ReentrantLock lock = new ReentrantLock(); //锁
//根据锁产生Condition对象
final Condition produced = lock.newCondition();
//读取数据线程池
ParralelExecutor readExecutor = new ImportExecutorImpl(0, 0, 1, false,
FileReadTask.class);
readExecutor.setParralelTaskFactory(new ParralelTaskFactory() {
@Override
public ParralelTask createTask(Class<? extends ParralelTask> parralelTaskClass,
int i, long start, long end,
CountDownLatch countDownLatch,
CountDownLatch resultCountDownLatch) {
FileReadTask fileReadTask = (FileReadTask) super.createTask(
parralelTaskClass, i, start, end, countDownLatch,
resultCountDownLatch);
fileReadTask.setFileName(f);
fileReadTask.setKeyQueue(keyQueue);
fileReadTask.setFinish(finish);
fileReadTask.setLock(lock);
fileReadTask.setProduced(produced);
return fileReadTask;
}
});
readExecutor.start();
//导入数据线程池
ParralelExecutor putExecutor = new ImportExecutorImpl(0, 0, c, needProfiling,
QueuePutTask.class);
putExecutor.setParralelTaskFactory(new ParralelTaskFactory() {
@Override
public ParralelTask createTask(Class<? extends ParralelTask> parralelTaskClass,
int i, long start, long end,
CountDownLatch countDownLatch,
CountDownLatch resultCountDownLatch) {
QueuePutTask queuePutTask = (QueuePutTask) super.createTask(
parralelTaskClass, i, start, end, countDownLatch,
resultCountDownLatch);
queuePutTask.setConnection(connection0);
queuePutTask.setVirtualRouter(virtualRouter);
queuePutTask.setKeyQueue(keyQueue);
queuePutTask.setLock(lock);
queuePutTask.setFinish(finish);
queuePutTask.setProduced(produced);
return queuePutTask;
}
});
putExecutor.start();
Object result;
try {
result = readExecutor.getResult();
} catch (Exception e) {
}
try {
result = putExecutor.getResult();
} catch (Exception e) {
}
if ("true".endsWith(p)) {
putExecutor.getPermMeter().printReport();
}
} finally {
if (connection != null)
connection.close();
}
}
}
public NodeDataImporter() {
options.add(new Option("-ip", "IP", "DataServer IP"));
options.add(new Option("-port", "Port", "DataServer Port"));
options.add(new Option("-vn", "VirtualNumber", "Virtual Number to routing.", false, true));
options.add(new Option("-c", "Concurrent", "number, Concurrent worker thread,default =1 ",
false, true));
options.add(new Option("-f", "file", "the import file path", true, true));
options.add(new Option("-t", "type", "log/txt, the format of import file", false, true));
options.add(new Option("-h", "Help", "Print command usage", false, false));
options.add(new Option("-p", "Performance",
"true/false, performance anlyze and print result. ", false, true));
}
@Override
public void prepareParameters() {
ip = commandLine.getValue("-ip");
port = commandLine.getInt("-port");
vn = commandLine.getInt("-vn");
c = commandLine.getInt("-c");
f = commandLine.getValue("-f");
t = commandLine.getValue("-t");
p = commandLine.getValue("-p");
if ("true".equals(verbose)) {
System.out.println(" ip: " + ip);
System.out.println(" port: " + port);
System.out.println(" v: " + vn);
System.out.println(" c: " + c);
System.out.println(" f: " + f);
System.out.println(" t: " + t);
}
}
public static void main(String[] args) {
//Command e.g : clientDataMaker -config doris-client.properties -ns StringName -kp abc -vp vvv -s 0 -e 1000 -c 10 -p true
NodeDataImporter nodeDataImporter = new NodeDataImporter();
nodeDataImporter.handle(args);
System.exit(0);
}
}