|
@@ -0,0 +1,180 @@
|
|
|
+//package cn.com.taiji.track.utils;// Copyright (c) 2021 Beijing Dingshi Zongheng Technology Co., Ltd. All rights reserved.
|
|
|
+////
|
|
|
+//// Licensed to the Apache Software Foundation (ASF) under one
|
|
|
+//// or more contributor license agreements. See the NOTICE file
|
|
|
+//// distributed with this work for additional information
|
|
|
+//// regarding copyright ownership. The ASF licenses this file
|
|
|
+//// to you 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.
|
|
|
+//
|
|
|
+//import org.apache.commons.codec.binary.Base64;
|
|
|
+//import org.apache.http.HttpHeaders;
|
|
|
+//import org.apache.http.client.methods.CloseableHttpResponse;
|
|
|
+//import org.apache.http.client.methods.HttpPut;
|
|
|
+//import org.apache.http.entity.StringEntity;
|
|
|
+//import org.apache.http.impl.client.CloseableHttpClient;
|
|
|
+//import org.apache.http.impl.client.DefaultRedirectStrategy;
|
|
|
+//import org.apache.http.impl.client.HttpClientBuilder;
|
|
|
+//import org.apache.http.impl.client.HttpClients;
|
|
|
+//import org.apache.http.util.EntityUtils;
|
|
|
+//
|
|
|
+//import java.io.IOException;
|
|
|
+//import java.nio.charset.StandardCharsets;
|
|
|
+///**
|
|
|
+// * This class is a java demo for starrocks stream load
|
|
|
+// *
|
|
|
+// * The pom.xml dependency:
|
|
|
+// *
|
|
|
+// * <dependency>
|
|
|
+// * <groupId>org.apache.httpcomponents</groupId>
|
|
|
+// * <artifactId>httpclient</artifactId>
|
|
|
+// * <version>4.5.3</version>
|
|
|
+// * </dependency>
|
|
|
+// *
|
|
|
+// * How to use:
|
|
|
+// *
|
|
|
+// * 1 create a table in starrocks with any mysql client
|
|
|
+// *
|
|
|
+// * CREATE TABLE `stream_test` (
|
|
|
+// * `id` bigint(20) COMMENT "",
|
|
|
+// * `id2` bigint(20) COMMENT "",
|
|
|
+// * `username` varchar(32) COMMENT ""
|
|
|
+// * ) ENGINE=OLAP
|
|
|
+// * DUPLICATE KEY(`id`)
|
|
|
+// * DISTRIBUTED BY HASH(`id`) BUCKETS 20;
|
|
|
+// *
|
|
|
+// *
|
|
|
+// * 2 change the StarRocks cluster, db, user config in this class
|
|
|
+// *
|
|
|
+// * 3 run this class, you should see the following output:
|
|
|
+// *
|
|
|
+// * {
|
|
|
+// * "TxnId": 27,
|
|
|
+// * "Label": "39c25a5c-7000-496e-a98e-348a264c81de",
|
|
|
+// * "Status": "Success",
|
|
|
+// * "Message": "OK",
|
|
|
+// * "NumberTotalRows": 10,
|
|
|
+// * "NumberLoadedRows": 10,
|
|
|
+// * "NumberFilteredRows": 0,
|
|
|
+// * "NumberUnselectedRows": 0,
|
|
|
+// * "LoadBytes": 50,
|
|
|
+// * "LoadTimeMs": 151
|
|
|
+// * }
|
|
|
+// *
|
|
|
+// * Attention:
|
|
|
+// *
|
|
|
+// * 1 wrong dependency version(such as 4.4) of httpclient may cause shaded.org.apache.http.ProtocolException
|
|
|
+// * Caused by: shaded.org.apache.http.ProtocolException: Content-Length header already present
|
|
|
+// * at shaded.org.apache.http.protocol.RequestContent.process(RequestContent.java:96)
|
|
|
+// * at shaded.org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:132)
|
|
|
+// * at shaded.org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:182)
|
|
|
+// * at shaded.org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
|
|
|
+// * at shaded.org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
|
|
|
+// * at shaded.org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
|
|
|
+// *
|
|
|
+// *2 run this class more than once, the status code for http response is still ok, and you will see
|
|
|
+// * the following output:
|
|
|
+// *
|
|
|
+// * {
|
|
|
+// * "TxnId": -1,
|
|
|
+// * "Label": "39c25a5c-7000-496e-a98e-348a264c81de",
|
|
|
+// * "Status": "Label Already Exists",
|
|
|
+// * "ExistingJobStatus": "FINISHED",
|
|
|
+// * "Message": "Label [39c25a5c-7000-496e-a98e-348a264c81de"] has already been used.",
|
|
|
+// * "NumberTotalRows": 0,
|
|
|
+// * "NumberLoadedRows": 0,
|
|
|
+// * "NumberFilteredRows": 0,
|
|
|
+// * "NumberUnselectedRows": 0,
|
|
|
+// * "LoadBytes": 0,
|
|
|
+// * "LoadTimeMs": 0
|
|
|
+// * }
|
|
|
+// * 3 when the response statusCode is 200, that doesn't mean your stream load is ok, there may be still
|
|
|
+// * some stream problem unless you see the output with 'ok' message
|
|
|
+// */
|
|
|
+//public class StarRocksStreamLoad {
|
|
|
+// private final static String STARROCKS_HOST = "xxx.com";
|
|
|
+// private final static String STARROCKS_DB = "test";
|
|
|
+// private final static String STARROCKS_TABLE = "stream_test";
|
|
|
+// private final static String STARROCKS_USER = "root";
|
|
|
+// private final static String STARROCKS_PASSWORD = "xxx";
|
|
|
+// private final static int STARROCKS_HTTP_PORT = 8030;
|
|
|
+//
|
|
|
+// private void sendData(String content) throws Exception {
|
|
|
+// final String loadUrl = String.format("http://%s:%s/api/%s/%s/_stream_load",
|
|
|
+// STARROCKS_HOST,
|
|
|
+// STARROCKS_HTTP_PORT,
|
|
|
+// STARROCKS_DB,
|
|
|
+// STARROCKS_TABLE);
|
|
|
+//
|
|
|
+// final HttpClientBuilder httpClientBuilder = HttpClients
|
|
|
+// .custom()
|
|
|
+// .setRedirectStrategy(new DefaultRedirectStrategy() {
|
|
|
+// @Override
|
|
|
+// protected boolean isRedirectable(String method) {
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// });
|
|
|
+//
|
|
|
+// try (CloseableHttpClient client = httpClientBuilder.build()) {
|
|
|
+// HttpPut put = new HttpPut(loadUrl);
|
|
|
+// StringEntity entity = new StringEntity(content, "UTF-8");
|
|
|
+// put.setHeader(HttpHeaders.EXPECT, "100-continue");
|
|
|
+// put.setHeader(HttpHeaders.AUTHORIZATION, basicAuthHeader(STARROCKS_USER, STARROCKS_PASSWORD));
|
|
|
+// // the label header is optional, not necessary
|
|
|
+// // use label header can ensure at most once semantics
|
|
|
+// put.setHeader("label", "39c25a5c-7000-496e-a98e-348a264c81de");
|
|
|
+// put.setEntity(entity);
|
|
|
+//
|
|
|
+// try (CloseableHttpResponse response = client.execute(put)) {
|
|
|
+// String loadResult = "";
|
|
|
+// if (response.getEntity() != null) {
|
|
|
+// loadResult = EntityUtils.toString(response.getEntity());
|
|
|
+// }
|
|
|
+// final int statusCode = response.getStatusLine().getStatusCode();
|
|
|
+// // statusCode 200 just indicates that starrocks be service is ok, not stream load
|
|
|
+// // you should see the output content to find whether stream load is success
|
|
|
+// if (statusCode != 200) {
|
|
|
+// throw new IOException(
|
|
|
+// String.format("Stream load failed, statusCode=%s load result=%s", statusCode, loadResult));
|
|
|
+// }
|
|
|
+//
|
|
|
+// System.out.println(loadResult);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// private String basicAuthHeader(String username, String password) {
|
|
|
+// final String tobeEncode = username + ":" + password;
|
|
|
+// byte[] encoded = Base64.encodeBase64(tobeEncode.getBytes(StandardCharsets.UTF_8));
|
|
|
+// return "Basic " + new String(encoded);
|
|
|
+// }
|
|
|
+//
|
|
|
+// public static void main(String[] args) throws Exception {
|
|
|
+// int id1 = 1;
|
|
|
+// int id2 = 10;
|
|
|
+// String id3 = "Simon";
|
|
|
+// int rowNumber = 10;
|
|
|
+// String oneRow = id1 + "\t" + id2 + "\t" + id3 + "\n";
|
|
|
+//
|
|
|
+// StringBuilder stringBuilder = new StringBuilder();
|
|
|
+// for (int i = 0; i < rowNumber; i++) {
|
|
|
+// stringBuilder.append(oneRow);
|
|
|
+// }
|
|
|
+//
|
|
|
+// stringBuilder.deleteCharAt(stringBuilder.length() - 1);
|
|
|
+//
|
|
|
+// String loadData = stringBuilder.toString();
|
|
|
+// StarRocksStreamLoad starrocksStreamLoad = new StarRocksStreamLoad();
|
|
|
+// starrocksStreamLoad.sendData(loadData);
|
|
|
+// }
|
|
|
+//}
|