embulk-output-td 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/build.gradle +9 -8
- data/embulk-output-td.gemspec +1 -1
- data/src/main/java/org/embulk/output/td/MsgpackGZFileBuilder.java +11 -12
- data/src/main/java/org/embulk/output/td/RecordWriter.java +4 -7
- data/src/main/java/org/embulk/output/td/TdOutputPlugin.java +89 -84
- data/src/main/java/org/embulk/output/td/writer/FieldWriterSet.java +9 -0
- data/src/main/java/org/embulk/output/td/writer/JsonFieldWriter.java +23 -0
- data/src/test/java/org/embulk/output/td/TestRecordWriter.java +37 -38
- data/src/test/java/org/embulk/output/td/TestTdOutputPlugin.java +53 -49
- metadata +9 -30
- data/src/main/java/com/treasuredata/api/TdApiClient.java +0 -506
- data/src/main/java/com/treasuredata/api/TdApiClientConfig.java +0 -79
- data/src/main/java/com/treasuredata/api/TdApiConflictException.java +0 -10
- data/src/main/java/com/treasuredata/api/TdApiConstants.java +0 -10
- data/src/main/java/com/treasuredata/api/TdApiException.java +0 -20
- data/src/main/java/com/treasuredata/api/TdApiExecutionException.java +0 -10
- data/src/main/java/com/treasuredata/api/TdApiExecutionInterruptedException.java +0 -16
- data/src/main/java/com/treasuredata/api/TdApiExecutionTimeoutException.java +0 -18
- data/src/main/java/com/treasuredata/api/TdApiNotFoundException.java +0 -10
- data/src/main/java/com/treasuredata/api/TdApiResponseException.java +0 -32
- data/src/main/java/com/treasuredata/api/model/TDArrayColumnType.java +0 -80
- data/src/main/java/com/treasuredata/api/model/TDBulkImportSession.java +0 -157
- data/src/main/java/com/treasuredata/api/model/TDColumn.java +0 -129
- data/src/main/java/com/treasuredata/api/model/TDColumnType.java +0 -23
- data/src/main/java/com/treasuredata/api/model/TDColumnTypeDeserializer.java +0 -128
- data/src/main/java/com/treasuredata/api/model/TDDatabase.java +0 -49
- data/src/main/java/com/treasuredata/api/model/TDDatabaseList.java +0 -24
- data/src/main/java/com/treasuredata/api/model/TDMapColumnType.java +0 -88
- data/src/main/java/com/treasuredata/api/model/TDPrimitiveColumnType.java +0 -61
- data/src/main/java/com/treasuredata/api/model/TDTable.java +0 -64
- data/src/main/java/com/treasuredata/api/model/TDTableList.java +0 -33
- data/src/main/java/com/treasuredata/api/model/TDTablePermission.java +0 -50
- data/src/main/java/com/treasuredata/api/model/TDTableSchema.java +0 -44
- data/src/main/java/com/treasuredata/api/model/TDTableType.java +0 -37
- data/src/test/java/com/treasuredata/api/TestTdApiClient.java +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f6572b7067dbe90e8b8687e796cace68c784653
|
4
|
+
data.tar.gz: df2090ebd8861f183447b4800f4847f1c4a847e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f95ec8ff2e4a4bc6ea2ede82b92c0bd325421c848ddaa05ec1cd73c6f31a6e16357835bfb5a046202ad917c6a9ba047d44bc8a80b6cc9227c6d249c844b49e51
|
7
|
+
data.tar.gz: 4b97abbd2486cb0556c18257f6c5b9d922452798a80d68d9097bab9f9bdc03ce463c492a13109925c021ec6572a22d391f1cf876c4ee4f61a6ecaa5e7c1c70fc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 0.3.0 - 2016-03-03
|
2
|
+
|
3
|
+
* [maintenance] Upgrade embulk v08 [#37](https://github.com/treasure-data/embulk-output-td/pull/37)
|
4
|
+
|
1
5
|
## 0.2.2 - 2016-02-29
|
2
6
|
|
3
7
|
* [maintenance] Update a table schema by Embulk's guessed columns if the # of the uploaded record is zero [#36](https://github.com/treasure-data/embulk-output-td/pull/36)
|
data/build.gradle
CHANGED
@@ -16,23 +16,24 @@ configurations {
|
|
16
16
|
provided
|
17
17
|
}
|
18
18
|
|
19
|
-
version = "0.
|
19
|
+
version = "0.3.0"
|
20
20
|
|
21
21
|
compileJava.options.encoding = 'UTF-8' // source encoding
|
22
22
|
sourceCompatibility = 1.7
|
23
23
|
targetCompatibility = 1.7
|
24
24
|
|
25
25
|
dependencies {
|
26
|
-
compile "org.embulk:embulk-core:0.
|
27
|
-
provided "org.embulk:embulk-core:0.
|
28
|
-
compile "org.embulk:embulk-standards:0.
|
29
|
-
provided "org.embulk:embulk-standards:0.
|
30
|
-
compile "org.
|
31
|
-
|
26
|
+
compile "org.embulk:embulk-core:0.8.+"
|
27
|
+
provided "org.embulk:embulk-core:0.8.+"
|
28
|
+
compile "org.embulk:embulk-standards:0.8.+"
|
29
|
+
provided "org.embulk:embulk-standards:0.8.+"
|
30
|
+
compile "org.msgpack:msgpack-core:0.8.+"
|
31
|
+
provided "org.msgpack:msgpack-core:0.8.+"
|
32
|
+
compile "com.treasuredata.client:td-client:0.7.8"
|
32
33
|
|
33
34
|
testCompile "junit:junit:4.+"
|
34
35
|
testCompile "org.bigtesting:fixd:1.0.0"
|
35
|
-
testCompile "org.embulk:embulk-core:0.
|
36
|
+
testCompile "org.embulk:embulk-core:0.8.+:tests"
|
36
37
|
testCompile "org.mockito:mockito-core:1.9.5"
|
37
38
|
}
|
38
39
|
|
data/embulk-output-td.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
spec.name = "embulk-output-td"
|
4
|
-
spec.version = "0.
|
4
|
+
spec.version = "0.3.0"
|
5
5
|
spec.authors = ["Muga Nishizawa"]
|
6
6
|
spec.summary = %[TreasureData output plugin for Embulk]
|
7
7
|
spec.description = %[TreasureData output plugin is an Embulk plugin that loads records to TreasureData read by any input plugins. Search the input plugins by 'embulk-output' keyword.]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
package org.embulk.output.td;
|
2
2
|
|
3
|
-
import org.msgpack.MessagePack;
|
4
|
-
import org.msgpack.
|
3
|
+
import org.msgpack.core.MessagePack;
|
4
|
+
import org.msgpack.core.MessagePacker;
|
5
5
|
|
6
6
|
import java.io.BufferedOutputStream;
|
7
7
|
import java.io.Closeable;
|
@@ -60,16 +60,16 @@ public class MsgpackGZFileBuilder
|
|
60
60
|
private final DataSizeFilter out;
|
61
61
|
private final GZIPOutputStream gzout;
|
62
62
|
|
63
|
-
private
|
63
|
+
private MessagePacker packer;
|
64
64
|
private long recordCount;
|
65
65
|
|
66
|
-
public MsgpackGZFileBuilder(
|
66
|
+
public MsgpackGZFileBuilder(File file)
|
67
67
|
throws IOException
|
68
68
|
{
|
69
69
|
this.file = checkNotNull(file);
|
70
70
|
this.out = new DataSizeFilter(new BufferedOutputStream(new FileOutputStream(file)));
|
71
71
|
this.gzout = new GZIPOutputStream(this.out);
|
72
|
-
this.packer =
|
72
|
+
this.packer = MessagePack.newDefaultPacker(this.gzout);
|
73
73
|
|
74
74
|
this.recordCount = 0;
|
75
75
|
}
|
@@ -118,43 +118,42 @@ public class MsgpackGZFileBuilder
|
|
118
118
|
public void writeNil()
|
119
119
|
throws IOException
|
120
120
|
{
|
121
|
-
packer.
|
121
|
+
packer.packNil();
|
122
122
|
}
|
123
123
|
|
124
124
|
public void writeMapBegin(int size)
|
125
125
|
throws IOException
|
126
126
|
{
|
127
|
-
packer.
|
127
|
+
packer.packMapHeader(size);
|
128
128
|
}
|
129
129
|
|
130
130
|
public void writeMapEnd()
|
131
131
|
throws IOException
|
132
132
|
{
|
133
|
-
packer.writeMapEnd();
|
134
133
|
recordCount++;
|
135
134
|
}
|
136
135
|
|
137
136
|
public void writeString(String v)
|
138
137
|
throws IOException
|
139
138
|
{
|
140
|
-
packer.
|
139
|
+
packer.packString(v);
|
141
140
|
}
|
142
141
|
|
143
142
|
public void writeBoolean(boolean v)
|
144
143
|
throws IOException
|
145
144
|
{
|
146
|
-
packer.
|
145
|
+
packer.packBoolean(v);
|
147
146
|
}
|
148
147
|
|
149
148
|
public void writeLong(long v)
|
150
149
|
throws IOException
|
151
150
|
{
|
152
|
-
packer.
|
151
|
+
packer.packLong(v);
|
153
152
|
}
|
154
153
|
|
155
154
|
public void writeDouble(double v)
|
156
155
|
throws IOException
|
157
156
|
{
|
158
|
-
packer.
|
157
|
+
packer.packDouble(v);
|
159
158
|
}
|
160
159
|
}
|
@@ -3,7 +3,7 @@ package org.embulk.output.td;
|
|
3
3
|
import com.google.common.annotations.VisibleForTesting;
|
4
4
|
import com.google.common.base.Stopwatch;
|
5
5
|
import com.google.common.base.Throwables;
|
6
|
-
import com.treasuredata.
|
6
|
+
import com.treasuredata.client.TDClient;
|
7
7
|
import org.embulk.config.TaskReport;
|
8
8
|
import org.embulk.output.td.writer.FieldWriterSet;
|
9
9
|
import org.embulk.spi.Exec;
|
@@ -11,7 +11,6 @@ import org.embulk.spi.Page;
|
|
11
11
|
import org.embulk.spi.PageReader;
|
12
12
|
import org.embulk.spi.Schema;
|
13
13
|
import org.embulk.spi.TransactionalPageOutput;
|
14
|
-
import org.msgpack.MessagePack;
|
15
14
|
import org.slf4j.Logger;
|
16
15
|
|
17
16
|
import java.io.File;
|
@@ -28,11 +27,10 @@ public class RecordWriter
|
|
28
27
|
implements TransactionalPageOutput
|
29
28
|
{
|
30
29
|
private final Logger log;
|
31
|
-
private final
|
30
|
+
private final TDClient client;
|
32
31
|
private final String sessionName;
|
33
32
|
private final int taskIndex;
|
34
33
|
|
35
|
-
private final MessagePack msgpack;
|
36
34
|
private final FieldWriterSet fieldWriters;
|
37
35
|
private final File tempDir;
|
38
36
|
|
@@ -44,14 +42,13 @@ public class RecordWriter
|
|
44
42
|
private final int uploadConcurrency;
|
45
43
|
private final long fileSplitSize; // unit: kb
|
46
44
|
|
47
|
-
public RecordWriter(TdOutputPlugin.PluginTask task, int taskIndex,
|
45
|
+
public RecordWriter(TdOutputPlugin.PluginTask task, int taskIndex, TDClient client, FieldWriterSet fieldWriters)
|
48
46
|
{
|
49
47
|
this.log = Exec.getLogger(getClass());
|
50
48
|
this.client = checkNotNull(client);
|
51
49
|
this.sessionName = task.getSessionName();
|
52
50
|
this.taskIndex = taskIndex;
|
53
51
|
|
54
|
-
this.msgpack = new MessagePack();
|
55
52
|
this.fieldWriters = fieldWriters;
|
56
53
|
this.tempDir = new File(task.getTempDir());
|
57
54
|
this.executor = new FinalizableExecutorService();
|
@@ -77,7 +74,7 @@ public class RecordWriter
|
|
77
74
|
{
|
78
75
|
String prefix = String.format("%s-", sessionName);
|
79
76
|
File tempFile = File.createTempFile(prefix, ".msgpack.gz", tempDir);
|
80
|
-
this.builder = new MsgpackGZFileBuilder(
|
77
|
+
this.builder = new MsgpackGZFileBuilder(tempFile);
|
81
78
|
}
|
82
79
|
|
83
80
|
@VisibleForTesting
|
@@ -14,23 +14,23 @@ import javax.validation.constraints.Min;
|
|
14
14
|
import javax.validation.constraints.Max;
|
15
15
|
|
16
16
|
import com.google.common.annotations.VisibleForTesting;
|
17
|
+
import com.google.common.base.Function;
|
17
18
|
import com.google.common.base.Optional;
|
18
19
|
import com.google.common.base.Throwables;
|
19
20
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
20
21
|
import com.fasterxml.jackson.annotation.JsonValue;
|
21
22
|
import com.google.common.collect.ImmutableMap;
|
22
23
|
import com.google.common.collect.Lists;
|
23
|
-
import com.treasuredata.
|
24
|
-
import com.treasuredata.
|
25
|
-
import com.treasuredata.
|
26
|
-
import com.treasuredata.
|
27
|
-
import com.treasuredata.
|
28
|
-
import com.treasuredata.
|
29
|
-
import com.treasuredata.
|
30
|
-
import com.treasuredata.
|
31
|
-
import com.treasuredata.
|
32
|
-
import com.treasuredata.
|
33
|
-
import com.treasuredata.api.model.TDPrimitiveColumnType;
|
24
|
+
import com.treasuredata.client.ProxyConfig;
|
25
|
+
import com.treasuredata.client.TDClient;
|
26
|
+
import com.treasuredata.client.TDClientBuilder;
|
27
|
+
import com.treasuredata.client.TDClientHttpConflictException;
|
28
|
+
import com.treasuredata.client.TDClientHttpNotFoundException;
|
29
|
+
import com.treasuredata.client.model.TDBulkImportSession;
|
30
|
+
import com.treasuredata.client.model.TDBulkImportSession.ImportStatus;
|
31
|
+
import com.treasuredata.client.model.TDColumn;
|
32
|
+
import com.treasuredata.client.model.TDColumnType;
|
33
|
+
import com.treasuredata.client.model.TDTable;
|
34
34
|
import org.embulk.config.TaskReport;
|
35
35
|
import org.embulk.config.Config;
|
36
36
|
import org.embulk.config.ConfigDefault;
|
@@ -51,9 +51,9 @@ import org.embulk.spi.TransactionalPageOutput;
|
|
51
51
|
import org.embulk.spi.time.Timestamp;
|
52
52
|
import org.embulk.spi.time.TimestampFormatter;
|
53
53
|
import org.joda.time.format.DateTimeFormat;
|
54
|
-
import org.msgpack.MessagePack;
|
55
|
-
import org.msgpack.
|
56
|
-
import org.msgpack.
|
54
|
+
import org.msgpack.core.MessagePack;
|
55
|
+
import org.msgpack.core.MessageUnpacker;
|
56
|
+
import org.msgpack.value.Value;
|
57
57
|
import org.slf4j.Logger;
|
58
58
|
|
59
59
|
public class TdOutputPlugin
|
@@ -324,7 +324,7 @@ public class TdOutputPlugin
|
|
324
324
|
// generate session name
|
325
325
|
task.setSessionName(buildBulkImportSessionName(task, Exec.session()));
|
326
326
|
|
327
|
-
try (
|
327
|
+
try (TDClient client = newTDClient(task)) {
|
328
328
|
String databaseName = task.getDatabase();
|
329
329
|
String tableName = task.getTable();
|
330
330
|
|
@@ -361,13 +361,13 @@ public class TdOutputPlugin
|
|
361
361
|
OutputPlugin.Control control)
|
362
362
|
{
|
363
363
|
PluginTask task = taskSource.loadTask(PluginTask.class);
|
364
|
-
try (
|
364
|
+
try (TDClient client = newTDClient(task)) {
|
365
365
|
return doRun(client, schema, task, control);
|
366
366
|
}
|
367
367
|
}
|
368
368
|
|
369
369
|
@VisibleForTesting
|
370
|
-
ConfigDiff doRun(
|
370
|
+
ConfigDiff doRun(TDClient client, Schema schema, PluginTask task, OutputPlugin.Control control)
|
371
371
|
{
|
372
372
|
boolean doUpload = startBulkImportSession(client, task.getSessionName(), task.getDatabase(), task.getLoadTargetTableName());
|
373
373
|
task.setDoUpload(doUpload);
|
@@ -395,7 +395,7 @@ public class TdOutputPlugin
|
|
395
395
|
List<TaskReport> successTaskReports)
|
396
396
|
{
|
397
397
|
PluginTask task = taskSource.loadTask(PluginTask.class);
|
398
|
-
try (
|
398
|
+
try (TDClient client = newTDClient(task)) {
|
399
399
|
String sessionName = task.getSessionName();
|
400
400
|
log.info("Deleting bulk import session '{}'", sessionName);
|
401
401
|
client.deleteBulkImportSession(sessionName);
|
@@ -416,65 +416,52 @@ public class TdOutputPlugin
|
|
416
416
|
}
|
417
417
|
|
418
418
|
@VisibleForTesting
|
419
|
-
public
|
419
|
+
public TDClient newTDClient(final PluginTask task)
|
420
420
|
{
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
}
|
430
|
-
return
|
431
|
-
}
|
432
|
-
|
433
|
-
private Optional<HttpProxyConfig> newHttpProxyConfig(Optional<HttpProxyTask> task)
|
434
|
-
{
|
435
|
-
Optional<HttpProxyConfig> httpProxyConfig;
|
436
|
-
if (task.isPresent()) {
|
437
|
-
HttpProxyTask pt = task.get();
|
438
|
-
httpProxyConfig = Optional.of(new HttpProxyConfig(pt.getHost(), pt.getPort(), pt.getUseSsl()));
|
439
|
-
}
|
440
|
-
else {
|
441
|
-
httpProxyConfig = Optional.absent();
|
442
|
-
}
|
443
|
-
return httpProxyConfig;
|
421
|
+
TDClientBuilder builder = TDClient.newBuilder();
|
422
|
+
builder.setApiKey(task.getApiKey());
|
423
|
+
builder.setEndpoint(task.getEndpoint());
|
424
|
+
builder.setUseSSL(task.getUseSsl());
|
425
|
+
if (task.getHttpProxy().isPresent()) {
|
426
|
+
HttpProxyTask proxyTask = task.getHttpProxy().get();
|
427
|
+
builder.setProxy(new ProxyConfig(proxyTask.getHost(), proxyTask.getPort(), proxyTask.getUseSsl(),
|
428
|
+
Optional.<String>absent(), Optional.<String>absent()));
|
429
|
+
}
|
430
|
+
return builder.build();
|
444
431
|
}
|
445
432
|
|
446
433
|
@VisibleForTesting
|
447
|
-
void createTableIfNotExists(
|
434
|
+
void createTableIfNotExists(TDClient client, String databaseName, String tableName)
|
448
435
|
{
|
449
436
|
log.debug("Creating table \"{}\".\"{}\" if not exists", databaseName, tableName);
|
450
437
|
try {
|
451
438
|
client.createTable(databaseName, tableName);
|
452
439
|
log.debug("Created table \"{}\".\"{}\"", databaseName, tableName);
|
453
440
|
}
|
454
|
-
catch (
|
441
|
+
catch (TDClientHttpNotFoundException e) {
|
455
442
|
try {
|
456
443
|
client.createDatabase(databaseName);
|
457
444
|
log.debug("Created database \"{}\"", databaseName);
|
458
445
|
}
|
459
|
-
catch (
|
446
|
+
catch (TDClientHttpConflictException ex) {
|
460
447
|
// ignorable error
|
461
448
|
}
|
462
449
|
try {
|
463
450
|
client.createTable(databaseName, tableName);
|
464
451
|
log.debug("Created table \"{}\".\"{}\"", databaseName, tableName);
|
465
452
|
}
|
466
|
-
catch (
|
453
|
+
catch (TDClientHttpConflictException exe) {
|
467
454
|
// ignorable error
|
468
455
|
}
|
469
456
|
}
|
470
|
-
catch (
|
457
|
+
catch (TDClientHttpConflictException e) {
|
471
458
|
// ignorable error
|
472
459
|
}
|
473
460
|
}
|
474
461
|
|
475
462
|
@VisibleForTesting
|
476
|
-
String createTemporaryTableWithPrefix(
|
477
|
-
throws
|
463
|
+
String createTemporaryTableWithPrefix(TDClient client, String databaseName, String tablePrefix)
|
464
|
+
throws TDClientHttpConflictException
|
478
465
|
{
|
479
466
|
String tableName = tablePrefix;
|
480
467
|
while (true) {
|
@@ -484,7 +471,7 @@ public class TdOutputPlugin
|
|
484
471
|
log.debug("Created temporal table \"{}\".\"{}\"", databaseName, tableName);
|
485
472
|
return tableName;
|
486
473
|
}
|
487
|
-
catch (
|
474
|
+
catch (TDClientHttpConflictException e) {
|
488
475
|
log.debug("\"{}\".\"{}\" table already exists. Renaming temporal table.", databaseName, tableName);
|
489
476
|
tableName += "_";
|
490
477
|
}
|
@@ -492,17 +479,17 @@ public class TdOutputPlugin
|
|
492
479
|
}
|
493
480
|
|
494
481
|
@VisibleForTesting
|
495
|
-
void validateTableExists(
|
482
|
+
void validateTableExists(TDClient client, String databaseName, String tableName)
|
496
483
|
{
|
497
484
|
try {
|
498
|
-
for (TDTable table : client.
|
485
|
+
for (TDTable table : client.listTables(databaseName)) {
|
499
486
|
if (table.getName().equals(tableName)) {
|
500
487
|
return;
|
501
488
|
}
|
502
489
|
}
|
503
490
|
throw new ConfigException(String.format("Table \"%s\".\"%s\" doesn't exist", databaseName, tableName));
|
504
491
|
}
|
505
|
-
catch (
|
492
|
+
catch (TDClientHttpNotFoundException ex) {
|
506
493
|
throw new ConfigException(String.format("Database \"%s\" doesn't exist", databaseName), ex);
|
507
494
|
}
|
508
495
|
}
|
@@ -523,7 +510,7 @@ public class TdOutputPlugin
|
|
523
510
|
|
524
511
|
// return false if all files are already uploaded
|
525
512
|
@VisibleForTesting
|
526
|
-
boolean startBulkImportSession(
|
513
|
+
boolean startBulkImportSession(TDClient client,
|
527
514
|
String sessionName, String databaseName, String tableName)
|
528
515
|
{
|
529
516
|
log.info("Create bulk_import session {}", sessionName);
|
@@ -531,7 +518,7 @@ public class TdOutputPlugin
|
|
531
518
|
try {
|
532
519
|
client.createBulkImportSession(sessionName, databaseName, tableName);
|
533
520
|
}
|
534
|
-
catch (
|
521
|
+
catch (TDClientHttpConflictException ex) {
|
535
522
|
// ignorable error
|
536
523
|
}
|
537
524
|
session = client.getBulkImportSession(sessionName);
|
@@ -539,7 +526,7 @@ public class TdOutputPlugin
|
|
539
526
|
|
540
527
|
switch (session.getStatus()) {
|
541
528
|
case UPLOADING:
|
542
|
-
if (session.
|
529
|
+
if (session.isUploadFrozen()) {
|
543
530
|
return false;
|
544
531
|
}
|
545
532
|
return true;
|
@@ -558,24 +545,24 @@ public class TdOutputPlugin
|
|
558
545
|
}
|
559
546
|
|
560
547
|
@VisibleForTesting
|
561
|
-
void completeBulkImportSession(
|
548
|
+
void completeBulkImportSession(TDClient client, Schema schema, PluginTask task, int priority)
|
562
549
|
{
|
563
550
|
String sessionName = task.getSessionName();
|
564
551
|
TDBulkImportSession session = client.getBulkImportSession(sessionName);
|
565
552
|
|
566
553
|
switch (session.getStatus()) {
|
567
554
|
case UPLOADING:
|
568
|
-
if (!session.
|
555
|
+
if (!session.isUploadFrozen()) {
|
569
556
|
// freeze
|
570
557
|
try {
|
571
558
|
client.freezeBulkImportSession(sessionName);
|
572
559
|
}
|
573
|
-
catch (
|
560
|
+
catch (TDClientHttpConflictException e) {
|
574
561
|
// ignorable error
|
575
562
|
}
|
576
563
|
}
|
577
564
|
// perform
|
578
|
-
client.performBulkImportSession(sessionName
|
565
|
+
client.performBulkImportSession(sessionName); // TODO use priority
|
579
566
|
|
580
567
|
// pass
|
581
568
|
case PERFORMING:
|
@@ -629,7 +616,7 @@ public class TdOutputPlugin
|
|
629
616
|
}
|
630
617
|
}
|
631
618
|
|
632
|
-
Map<String, TDColumnType> updateSchema(
|
619
|
+
Map<String, TDColumnType> updateSchema(TDClient client, Schema inputSchema, PluginTask task)
|
633
620
|
{
|
634
621
|
String databaseName = task.getDatabase();
|
635
622
|
TDTable table = findTable(client, databaseName, task.getTable());
|
@@ -638,27 +625,32 @@ public class TdOutputPlugin
|
|
638
625
|
inputSchema.visitColumns(new ColumnVisitor() {
|
639
626
|
public void booleanColumn(Column column)
|
640
627
|
{
|
641
|
-
guessedSchema.put(column.getName(),
|
628
|
+
guessedSchema.put(column.getName(), TDColumnType.LONG);
|
642
629
|
}
|
643
630
|
|
644
631
|
public void longColumn(Column column)
|
645
632
|
{
|
646
|
-
guessedSchema.put(column.getName(),
|
633
|
+
guessedSchema.put(column.getName(), TDColumnType.LONG);;
|
647
634
|
}
|
648
635
|
|
649
636
|
public void doubleColumn(Column column)
|
650
637
|
{
|
651
|
-
guessedSchema.put(column.getName(),
|
638
|
+
guessedSchema.put(column.getName(), TDColumnType.DOUBLE);
|
652
639
|
}
|
653
640
|
|
654
641
|
public void stringColumn(Column column)
|
655
642
|
{
|
656
|
-
guessedSchema.put(column.getName(),
|
643
|
+
guessedSchema.put(column.getName(), TDColumnType.STRING);
|
657
644
|
}
|
658
645
|
|
659
646
|
public void timestampColumn(Column column)
|
660
647
|
{
|
661
|
-
guessedSchema.put(column.getName(),
|
648
|
+
guessedSchema.put(column.getName(), TDColumnType.STRING);
|
649
|
+
}
|
650
|
+
|
651
|
+
public void jsonColumn(Column column)
|
652
|
+
{
|
653
|
+
guessedSchema.put(column.getName(), TDColumnType.STRING);
|
662
654
|
}
|
663
655
|
});
|
664
656
|
|
@@ -693,13 +685,13 @@ public class TdOutputPlugin
|
|
693
685
|
newSchema.add(new TDColumn(pair.getKey(), pair.getValue(), key.getBytes(StandardCharsets.UTF_8)));
|
694
686
|
}
|
695
687
|
|
696
|
-
client.
|
688
|
+
client.updateTableSchema(databaseName, task.getLoadTargetTableName(), newSchema);
|
697
689
|
return guessedSchema;
|
698
690
|
}
|
699
691
|
|
700
|
-
private static TDTable findTable(
|
692
|
+
private static TDTable findTable(TDClient client, String databaseName, String tableName)
|
701
693
|
{
|
702
|
-
for (TDTable table : client.
|
694
|
+
for (TDTable table : client.listTables(databaseName)) {
|
703
695
|
if (table.getName().equals(tableName)) {
|
704
696
|
return table;
|
705
697
|
}
|
@@ -718,34 +710,47 @@ public class TdOutputPlugin
|
|
718
710
|
return COLUMN_NAME_SQUASH_PATTERN.matcher(origName).replaceAll("_").toLowerCase();
|
719
711
|
}
|
720
712
|
|
721
|
-
void showBulkImportErrorRecords(
|
713
|
+
void showBulkImportErrorRecords(TDClient client, String sessionName, final int recordCountLimit)
|
722
714
|
{
|
723
715
|
log.info("Show {} error records", recordCountLimit);
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
716
|
+
client.getBulkImportErrorRecords(sessionName, new Function<InputStream, Void>()
|
717
|
+
{
|
718
|
+
@Override
|
719
|
+
public Void apply(InputStream input)
|
720
|
+
{
|
721
|
+
int errorRecordCount = 0;
|
722
|
+
try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(new GZIPInputStream(input))) {
|
723
|
+
while (unpacker.hasNext()) {
|
724
|
+
Value v = unpacker.unpackValue();
|
725
|
+
log.info(" {}", v.toJson());
|
726
|
+
errorRecordCount += 1;
|
727
|
+
|
728
|
+
if (errorRecordCount >= recordCountLimit) {
|
729
|
+
break;
|
730
|
+
}
|
731
|
+
}
|
732
|
+
}
|
733
|
+
catch (IOException ignored) {
|
734
|
+
log.info("Stop downloading error records");
|
735
|
+
}
|
736
|
+
return null;
|
729
737
|
}
|
730
|
-
}
|
731
|
-
catch (Exception ignored) {
|
732
|
-
log.info("Stop downloading error records", ignored);
|
733
|
-
}
|
738
|
+
});
|
734
739
|
}
|
735
740
|
|
736
741
|
@VisibleForTesting
|
737
|
-
TDBulkImportSession waitForStatusChange(
|
742
|
+
TDBulkImportSession waitForStatusChange(TDClient client, String sessionName,
|
738
743
|
ImportStatus current, ImportStatus expecting, String operation)
|
739
744
|
{
|
740
745
|
TDBulkImportSession importSession;
|
741
746
|
while (true) {
|
742
747
|
importSession = client.getBulkImportSession(sessionName);
|
743
748
|
|
744
|
-
if (importSession.
|
749
|
+
if (importSession.getStatus() == expecting) {
|
745
750
|
return importSession;
|
746
751
|
|
747
752
|
}
|
748
|
-
else if (importSession.
|
753
|
+
else if (importSession.getStatus() == current) {
|
749
754
|
// in progress
|
750
755
|
|
751
756
|
}
|
@@ -763,7 +768,7 @@ public class TdOutputPlugin
|
|
763
768
|
}
|
764
769
|
|
765
770
|
@VisibleForTesting
|
766
|
-
void renameTable(
|
771
|
+
void renameTable(TDClient client, String databaseName, String oldName, String newName)
|
767
772
|
{
|
768
773
|
log.debug("Renaming table \"{}\".\"{}\" to \"{}\"", databaseName, oldName, newName);
|
769
774
|
client.renameTable(databaseName, oldName, newName, true);
|
@@ -777,7 +782,7 @@ public class TdOutputPlugin
|
|
777
782
|
RecordWriter closeLater = null;
|
778
783
|
try {
|
779
784
|
FieldWriterSet fieldWriters = new FieldWriterSet(log, task, schema);
|
780
|
-
closeLater = new RecordWriter(task, taskIndex,
|
785
|
+
closeLater = new RecordWriter(task, taskIndex, newTDClient(task), fieldWriters);
|
781
786
|
RecordWriter recordWriter = closeLater;
|
782
787
|
recordWriter.open(schema);
|
783
788
|
closeLater = null;
|