acromusashi.stream.example.ml.client.KMeansDrpcClient.java Source code

Java tutorial

Introduction

Here is the source code for acromusashi.stream.example.ml.client.KMeansDrpcClient.java

Source

/**
* Copyright (c) Acroquest Technology Co, Ltd. All Rights Reserved.
* Please read the associated COPYRIGHTS file for more details.
*
* THE SOFTWARE IS PROVIDED BY Acroquest Technolog Co., Ltd.,
* WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDER BE LIABLE FOR ANY
* CLAIM, DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package acromusashi.stream.example.ml.client;

import java.io.IOException;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.thrift7.TException;

import acromusashi.stream.config.StormConfigGenerator;
import acromusashi.stream.config.StormConfigUtil;
import backtype.storm.Config;
import backtype.storm.generated.DRPCExecutionException;
import backtype.storm.utils.DRPCClient;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * KMeansTopology??????????DRPC
 * 
 * @author kimura
 */
public class KMeansDrpcClient {
    /** ? */
    public static final int DEFAULT_DRPCPORT = 3772;

    /**
     * ?????
     */
    public KMeansDrpcClient() {
    }

    /**
     * ?<br/>
     * <br/>
     * ?/?<br/>
     * <ul>
     * <li>-c KMeansTopology(</li>
     * <li>-d KMeans Data(?????)</li>
     * <li>-h </li>
     * </ul>
     * 
     * @param args 
     */
    public static void main(String... args) {
        KMeansDrpcClient client = new KMeansDrpcClient();
        client.startSendRequest(args);
    }

    /**
     * KMeansTopology??DRPC??
     * 
     * @param args 
     */
    protected void startSendRequest(String[] args) {
        Options cliOptions = createOptions();
        CommandLineParser parser = new PosixParser();
        CommandLine commandLine = null;
        HelpFormatter help = new HelpFormatter();

        try {
            commandLine = parser.parse(cliOptions, args);
        } catch (ParseException pex) {
            help.printHelp(KMeansDrpcClient.class.getName(), cliOptions, true);
            return;
        }

        if (commandLine.hasOption("h")) {
            // ??????????
            help.printHelp(KMeansDrpcClient.class.getName(), cliOptions, true);
            return;
        }

        // ??
        String confPath = commandLine.getOptionValue("c");
        String kmeansData = commandLine.getOptionValue("d");

        Config stormConfig = null;

        try {
            stormConfig = StormConfigGenerator.loadStormConfig(confPath);
        } catch (IOException ex) {
            // ???????
            ex.printStackTrace();
            return;
        }

        String drpcHost = StormConfigUtil.getStringListValue(stormConfig, "drpc.servers").get(0);
        int drpcPort = StormConfigUtil.getIntValue(stormConfig, "drpc.port", DEFAULT_DRPCPORT);
        String drpcFunction = StormConfigUtil.getStringValue(stormConfig, "kmeans.drpc.function", "kmeans");

        String kmeanResult = null;

        try {
            kmeanResult = sendRequest(drpcHost, drpcPort, drpcFunction, kmeansData);
        } catch (TException | DRPCExecutionException | IOException ex) {
            // ??????
            ex.printStackTrace();
            return;
        }

        System.out.println("KMeans Data=" + kmeansData + ", KMeans Result=" + kmeanResult);
    }

    /**
     * KMeans??DRPC???LOF??
     * 
     * @param drpcHost DRPC
     * @param drpcPort DRPC?
     * @param drpcFunction ????
     * @param kmeansData KMeans
     * @return KMeans?
     * @throws DRPCExecutionException DRPC
     * @throws TException DRPC
     * @throws IOException ?
     */
    public String sendRequest(String drpcHost, int drpcPort, String drpcFunction, String kmeansData)
            throws TException, DRPCExecutionException, IOException {
        DRPCClient client = new DRPCClient(drpcHost, drpcPort);
        String drpcResult = client.execute(drpcFunction, kmeansData);

        // ?????????
        // [["0.3230647,0.4288709,0.2918048,0.7904559,5",
        // "KmeansPoint[label=<null>,dataPoint={0.3230647,0.4288709,0.2918048,0.7904559,5.0}]",
        // "{\"dataPoint\":[0.3230647,0.4288709,0.2918048,0.7904559,5.0],\"centroidIndex\":2,
        // \"centroid\":[0.49254449862586597,0.29060293775519647,0.19902678114457303,0.7925079800808319,5.0],\"distance\":0.23759924945376112}"]]

        ObjectMapper mapper = new ObjectMapper();
        JsonNode baseNode = mapper.readTree(drpcResult);
        String kmeanResultStr = baseNode.get(0).get(2).asText();
        JsonNode kmeanResultTree = mapper.readTree(kmeanResultStr);
        return kmeanResultTree.toString();
    }

    /**
     * ???
     * 
     * @return ??
     */
    public static Options createOptions() {
        Options cliOptions = new Options();

        // KMeansTopology
        OptionBuilder.hasArg(true);
        OptionBuilder.withArgName("KMeansTopology Conf Path");
        OptionBuilder.withDescription("KMeansTopology Conf Path");
        OptionBuilder.isRequired(true);
        Option confPathOption = OptionBuilder.create("c");

        // LOF
        OptionBuilder.hasArg(true);
        OptionBuilder.withArgName("KMeans Data");
        OptionBuilder.withDescription("KMeans Data");
        OptionBuilder.isRequired(true);
        Option dataOption = OptionBuilder.create("d");

        // 
        OptionBuilder.withDescription("show help");
        Option helpOption = OptionBuilder.create("h");

        cliOptions.addOption(confPathOption);
        cliOptions.addOption(dataOption);
        cliOptions.addOption(helpOption);
        return cliOptions;
    }
}