embulk-output-parquet 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e731ad9c445bd5adef66ce8c994fa73dca87252e
4
- data.tar.gz: 392706f907d2dd684f2d2778863ae7dd28e4dfca
3
+ metadata.gz: 887eeba43ad66ae6159048504e253542162a8988
4
+ data.tar.gz: a04dba91a7abeecc957d7265f809c9bf1276ae0e
5
5
  SHA512:
6
- metadata.gz: ed522bf62b23bd0d236c945f4bbffcd3991d86ed93a835bae4739a3be96717e83ed0f584bdd968330ee426a8fd81e3d2cde11090605050bf2d9a3d70d700c603
7
- data.tar.gz: a3e6429370cfaefc7e777f8ba27912049d9649e51b8574330b957e2495a29640466e68f8173f052f6c881c33564efbc49fb4b301d59ae9f4b21ce7b58039b684
6
+ metadata.gz: 56ec1d8ad587e73a97ad769bbaad04793bb28ccf9119c638cde85e6dd38e06626fe8343ecfa9cc2e497cec78724366c2f3d8fdd7656b892c44ad32d9c4d65718
7
+ data.tar.gz: a99aa07e1b1507c6d375c4d2a21fa6d99341bf72f4022059eda90c88900f7597f687be5baed3c26728187212f59028e8679906fc8f6bba02795e1927f5e1ddcd
data/README.md CHANGED
@@ -19,13 +19,19 @@
19
19
  - **default_timestamp_format**: Format of timestamp columns. This can be overwritten for each column using column_options
20
20
  - **column_options**: Specify timezone and timestamp format for each column. Format of this option is the same as the official csv formatter. See [document](
21
21
  http://www.embulk.org/docs/built-in.html#csv-formatter-plugin).
22
+ - **extra_configurations**: Add extra entries to Configuration which will be passed to ParquetWriter
23
+ - **overwrite**: Overwrite if output files already exist. (default: fail if files exist)
22
24
 
23
25
  ## Example
24
26
 
25
27
  ```yaml
26
28
  out:
27
29
  type: parquet
28
- path_prefix: file:///data/output
30
+ path_prefix: s3a://bucket/keys
31
+ extra_configuration:
32
+ fs.s3a.access.key: 'your_access_key'
33
+ fs.s3a.secret.key: 'your_secret_access_key'
34
+
29
35
  ```
30
36
 
31
37
  ## Build
data/build.gradle CHANGED
@@ -7,25 +7,22 @@ import com.github.jrubygradle.JRubyExec
7
7
  repositories {
8
8
  mavenCentral()
9
9
  jcenter()
10
- maven {
11
- url "http://maven.twttr.com/"
12
- }
13
10
  }
14
11
  configurations {
15
12
  provided
16
13
  runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
17
14
  }
18
15
 
19
- version = "0.3.0"
16
+ version = "0.4.0"
20
17
 
21
18
  dependencies {
22
19
  compile "org.embulk:embulk-core:0.7.10"
23
20
  provided "org.embulk:embulk-core:0.7.10"
24
21
 
25
- compile "com.twitter:parquet-hadoop:1.5.0"
26
- compile "org.apache.hadoop:hadoop-client:2.6.0"
22
+ compile "org.apache.parquet:parquet-hadoop:1.8.1"
23
+ compile "org.apache.hadoop:hadoop-client:2.7.1"
24
+ compile "org.apache.hadoop:hadoop-aws:2.7.1"
27
25
  compile "org.xerial.snappy:snappy-java:1.1.1.6"
28
- compile "org.apache.hadoop:hadoop-aws:2.6.0"
29
26
 
30
27
  testCompile "junit:junit:4.+"
31
28
  testCompile "org.embulk:embulk-core:0.7.7:tests"
@@ -1,19 +1,19 @@
1
1
  package org.embulk.output;
2
2
 
3
3
  import org.apache.hadoop.conf.Configuration;
4
+ import org.apache.parquet.hadoop.api.WriteSupport;
5
+ import org.apache.parquet.io.api.Binary;
6
+ import org.apache.parquet.io.api.RecordConsumer;
7
+ import org.apache.parquet.schema.MessageType;
8
+ import org.apache.parquet.schema.PrimitiveType;
9
+ import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;
10
+ import org.apache.parquet.schema.Type;
4
11
  import org.embulk.spi.Column;
5
12
  import org.embulk.spi.ColumnVisitor;
6
13
  import org.embulk.spi.PageReader;
7
14
  import org.embulk.spi.Schema;
8
15
  import org.embulk.spi.time.Timestamp;
9
16
  import org.embulk.spi.time.TimestampFormatter;
10
- import parquet.hadoop.api.WriteSupport;
11
- import parquet.io.api.Binary;
12
- import parquet.io.api.RecordConsumer;
13
- import parquet.schema.MessageType;
14
- import parquet.schema.PrimitiveType;
15
- import parquet.schema.PrimitiveType.PrimitiveTypeName;
16
- import parquet.schema.Type;
17
17
 
18
18
  import java.util.ArrayList;
19
19
  import java.util.HashMap;
@@ -0,0 +1,30 @@
1
+ package org.embulk.output;
2
+
3
+ import org.apache.hadoop.conf.Configuration;
4
+ import org.apache.hadoop.fs.Path;
5
+ import org.apache.parquet.hadoop.ParquetWriter;
6
+ import org.apache.parquet.hadoop.api.WriteSupport;
7
+ import org.embulk.spi.PageReader;
8
+ import org.embulk.spi.Schema;
9
+ import org.embulk.spi.time.TimestampFormatter;
10
+
11
+ public class EmbulkWriterBuilder extends ParquetWriter.Builder<PageReader, EmbulkWriterBuilder> {
12
+ final Schema schema;
13
+ final TimestampFormatter[] timestampFormatters;
14
+
15
+ public EmbulkWriterBuilder(Path file, Schema schema, TimestampFormatter[] timestampFormatters) {
16
+ super(file);
17
+ this.schema = schema;
18
+ this.timestampFormatters = timestampFormatters;
19
+ }
20
+
21
+ @Override
22
+ protected EmbulkWriterBuilder self() {
23
+ return this;
24
+ }
25
+
26
+ @Override
27
+ protected WriteSupport<PageReader> getWriteSupport(Configuration conf) {
28
+ return new EmbulkWriteSupport(schema, timestampFormatters);
29
+ }
30
+ }
@@ -5,6 +5,9 @@ import org.apache.hadoop.conf.Configuration;
5
5
  import org.apache.hadoop.fs.LocalFileSystem;
6
6
  import org.apache.hadoop.fs.Path;
7
7
  import org.apache.hadoop.hdfs.DistributedFileSystem;
8
+ import org.apache.parquet.hadoop.ParquetFileWriter;
9
+ import org.apache.parquet.hadoop.ParquetWriter;
10
+ import org.apache.parquet.hadoop.metadata.CompressionCodecName;
8
11
  import org.embulk.config.Config;
9
12
  import org.embulk.config.ConfigDefault;
10
13
  import org.embulk.config.ConfigDiff;
@@ -20,9 +23,6 @@ import org.embulk.spi.Schema;
20
23
  import org.embulk.spi.TransactionalPageOutput;
21
24
  import org.embulk.spi.time.TimestampFormatter;
22
25
  import org.embulk.spi.util.Timestamps;
23
- import parquet.hadoop.ParquetWriter;
24
- import parquet.hadoop.api.WriteSupport;
25
- import parquet.hadoop.metadata.CompressionCodecName;
26
26
 
27
27
  import java.io.IOException;
28
28
  import java.util.List;
@@ -30,11 +30,9 @@ import java.util.Map;
30
30
 
31
31
  @SuppressWarnings("unused")
32
32
  public class ParquetOutputPlugin
33
- implements OutputPlugin
34
- {
33
+ implements OutputPlugin {
35
34
  public interface PluginTask
36
- extends Task, TimestampFormatter.Task
37
- {
35
+ extends Task, TimestampFormatter.Task {
38
36
  @Config("path_prefix")
39
37
  String getPathPrefix();
40
38
 
@@ -47,11 +45,13 @@ public class ParquetOutputPlugin
47
45
  String getSequenceFormat();
48
46
 
49
47
  @Config("block_size")
50
- @ConfigDefault("134217728") // 128M
48
+ @ConfigDefault("134217728")
49
+ // 128M
51
50
  int getBlockSize();
52
51
 
53
52
  @Config("page_size")
54
- @ConfigDefault("1048576") // 1M
53
+ @ConfigDefault("1048576")
54
+ // 1M
55
55
  int getPageSize();
56
56
 
57
57
  @Config("compression_codec")
@@ -61,16 +61,23 @@ public class ParquetOutputPlugin
61
61
  @Config("column_options")
62
62
  @ConfigDefault("{}")
63
63
  Map<String, TimestampColumnOption> getColumnOptions();
64
+
65
+ @Config("extra_configurations")
66
+ @ConfigDefault("{}")
67
+ Map<String, String> getExtraConfigurations();
68
+
69
+ @Config("overwrite")
70
+ @ConfigDefault("false")
71
+ boolean getOverwrite();
64
72
  }
65
73
 
66
74
  public interface TimestampColumnOption
67
- extends Task, TimestampFormatter.TimestampColumnOption
68
- { }
75
+ extends Task, TimestampFormatter.TimestampColumnOption {
76
+ }
69
77
 
70
78
  public ConfigDiff transaction(ConfigSource config,
71
- Schema schema, int processorCount,
72
- OutputPlugin.Control control)
73
- {
79
+ Schema schema, int processorCount,
80
+ OutputPlugin.Control control) {
74
81
  PluginTask task = config.loadConfig(PluginTask.class);
75
82
 
76
83
  //TODO
@@ -80,65 +87,78 @@ public class ParquetOutputPlugin
80
87
  }
81
88
 
82
89
  public ConfigDiff resume(TaskSource taskSource,
83
- Schema schema, int processorCount,
84
- OutputPlugin.Control control)
85
- {
90
+ Schema schema, int processorCount,
91
+ OutputPlugin.Control control) {
86
92
  throw new UnsupportedOperationException("parquet output plugin does not support resuming");
87
93
  }
88
94
 
89
95
  public void cleanup(TaskSource taskSource,
90
- Schema schema, int processorCount,
91
- List<TaskReport> successTaskReports)
92
- {
96
+ Schema schema, int processorCount,
97
+ List<TaskReport> successTaskReports) {
93
98
  //TODO
94
99
  }
95
100
 
96
- public TransactionalPageOutput open(TaskSource taskSource, final Schema schema, int processorIndex)
97
- {
101
+ public TransactionalPageOutput open(TaskSource taskSource, final Schema schema, int processorIndex) {
98
102
  PluginTask task = taskSource.loadTask(PluginTask.class);
99
103
 
104
+ final PageReader reader = new PageReader(schema);
105
+ final ParquetWriter<PageReader> writer = createWriter(task, schema, processorIndex);
106
+
107
+ return new ParquetTransactionalPageOutput(reader, writer);
108
+ }
109
+
110
+ private String buildPath(PluginTask task, int processorIndex) {
100
111
  final String pathPrefix = task.getPathPrefix();
101
112
  final String pathSuffix = task.getFileNameExtension();
102
113
  final String sequenceFormat = task.getSequenceFormat();
114
+ return pathPrefix + String.format(sequenceFormat, processorIndex) + pathSuffix;
115
+ }
116
+
117
+ private ParquetWriter<PageReader> createWriter(PluginTask task, Schema schema, int processorIndex) {
118
+ final TimestampFormatter[] timestampFormatters = Timestamps.newTimestampColumnFormatters(task, schema, task.getColumnOptions());
119
+
120
+ final Path path = new Path(buildPath(task, processorIndex));
103
121
  final CompressionCodecName codec = CompressionCodecName.valueOf(task.getCompressionCodec());
104
122
  final int blockSize = task.getBlockSize();
105
123
  final int pageSize = task.getPageSize();
124
+ final Configuration conf = createConfiguration(task.getExtraConfigurations());
125
+ final boolean overwrite = task.getOverwrite();
106
126
 
107
- final String path = pathPrefix + String.format(sequenceFormat, processorIndex) + pathSuffix;
108
-
109
- final PageReader reader = new PageReader(schema);
110
-
111
- final TimestampFormatter[] timestampFormatters = Timestamps.newTimestampColumnFormatters(task, schema, task.getColumnOptions());
112
- final EmbulkWriteSupport writeSupport = new EmbulkWriteSupport(schema, timestampFormatters);
113
- ParquetWriter<PageReader> writer = createParquetWriter(new Path(path), writeSupport, codec, blockSize, pageSize);
127
+ ParquetWriter<PageReader> writer = null;
128
+ try {
129
+ EmbulkWriterBuilder builder = new EmbulkWriterBuilder(path, schema, timestampFormatters)
130
+ .withCompressionCodec(codec)
131
+ .withRowGroupSize(blockSize)
132
+ .withPageSize(pageSize)
133
+ .withDictionaryPageSize(pageSize)
134
+ .withConf(conf);
135
+
136
+ if (overwrite) {
137
+ builder.withWriteMode(ParquetFileWriter.Mode.OVERWRITE);
138
+ }
114
139
 
115
- return new ParquetTransactionalPageOutput(reader, writer);
140
+ writer = builder.build();
141
+ } catch (IOException e) {
142
+ Throwables.propagate(e);
143
+ }
144
+ return writer;
116
145
  }
117
146
 
118
- private <T> ParquetWriter<T> createParquetWriter(Path path, WriteSupport<T> writeSupport, CompressionCodecName codec, int blockSize, int pageSize) {
119
- ParquetWriter<T> writer = null;
120
-
147
+ private Configuration createConfiguration(Map<String, String> extra) {
121
148
  Configuration conf = new Configuration();
149
+
150
+ // Default values
122
151
  conf.set("fs.hdfs.impl", DistributedFileSystem.class.getName());
123
152
  conf.set("fs.file.impl", LocalFileSystem.class.getName());
124
- conf.setClassLoader(this.getClass().getClassLoader());
125
153
 
126
- try {
127
- writer = new ParquetWriter<>(
128
- path,
129
- writeSupport,
130
- codec,
131
- blockSize,
132
- pageSize,
133
- pageSize,
134
- ParquetWriter.DEFAULT_IS_DICTIONARY_ENABLED,
135
- ParquetWriter.DEFAULT_IS_VALIDATING_ENABLED,
136
- ParquetWriter.DEFAULT_WRITER_VERSION,
137
- conf);
138
- } catch (IOException e) {
139
- Throwables.propagate(e);
154
+ // Optional values
155
+ for (Map.Entry<String, String> entry : extra.entrySet()) {
156
+ conf.set(entry.getKey(), entry.getValue());
140
157
  }
141
- return writer;
158
+
159
+ conf.setClassLoader(this.getClass().getClassLoader());
160
+
161
+ return conf;
142
162
  }
143
163
 
144
164
  class ParquetTransactionalPageOutput implements TransactionalPageOutput {
@@ -157,7 +177,7 @@ public class ParquetOutputPlugin
157
177
  while (reader.nextRecord()) {
158
178
  writer.write(reader);
159
179
  }
160
- } catch(IOException e) {
180
+ } catch (IOException e) {
161
181
  Throwables.propagate(e);
162
182
  }
163
183
  }
@@ -1,5 +1,6 @@
1
1
  package org.embulk.output;
2
2
 
3
+ import org.apache.hadoop.conf.Configuration;
3
4
  import org.embulk.EmbulkTestRuntime;
4
5
  import org.embulk.config.ConfigException;
5
6
  import org.embulk.config.ConfigSource;
@@ -7,6 +8,11 @@ import org.embulk.spi.Exec;
7
8
  import org.junit.Rule;
8
9
  import org.junit.Test;
9
10
 
11
+ import java.lang.reflect.InvocationTargetException;
12
+ import java.lang.reflect.Method;
13
+ import java.util.HashMap;
14
+ import java.util.Map;
15
+
10
16
  import static org.junit.Assert.*;
11
17
 
12
18
  public class ParquetOutputPluginTest {
@@ -24,6 +30,7 @@ public class ParquetOutputPluginTest {
24
30
  assertEquals(134217728, task.getBlockSize());
25
31
  assertEquals(1048576, task.getPageSize());
26
32
  assertEquals("UNCOMPRESSED", task.getCompressionCodec());
33
+ assertFalse(task.getOverwrite());
27
34
  }
28
35
 
29
36
  @Test(expected = ConfigException.class)
@@ -33,5 +40,25 @@ public class ParquetOutputPluginTest {
33
40
  config.loadConfig(ParquetOutputPlugin.PluginTask.class);
34
41
  }
35
42
 
43
+ @Test
44
+ public void checkExtraConfigurations() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
45
+ ConfigSource map = Exec.newConfigSource()
46
+ .set("foo", "bar");
47
+
48
+ ConfigSource config = Exec.newConfigSource()
49
+ .set("path_prefix", "test")
50
+ .setNested("extra_configurations", map);
51
+
52
+ ParquetOutputPlugin.PluginTask task = config.loadConfig(ParquetOutputPlugin.PluginTask.class);
53
+
54
+ Map<String, String> extra = task.getExtraConfigurations();
55
+ assertTrue(extra.containsKey("foo"));
56
+ assertEquals("bar", extra.get("foo"));
36
57
 
58
+ ParquetOutputPlugin plugin = new ParquetOutputPlugin();
59
+ Method method = ParquetOutputPlugin.class.getDeclaredMethod("createConfiguration", Map.class);
60
+ method.setAccessible(true);
61
+ Configuration conf = (Configuration) method.invoke(plugin, extra);
62
+ assertEquals("bar", conf.get("foo"));
63
+ }
37
64
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-parquet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OKUNO Akihiro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -56,6 +56,7 @@ files:
56
56
  - gradlew.bat
57
57
  - lib/embulk/output/parquet.rb
58
58
  - src/main/java/org/embulk/output/EmbulkWriteSupport.java
59
+ - src/main/java/org/embulk/output/EmbulkWriterBuilder.java
59
60
  - src/main/java/org/embulk/output/ParquetOutputPlugin.java
60
61
  - src/test/java/org/embulk/output/ParquetOutputPluginTest.java
61
62
  - classpath/activation-1.1.jar
@@ -73,43 +74,40 @@ files:
73
74
  - classpath/commons-compress-1.4.1.jar
74
75
  - classpath/commons-configuration-1.6.jar
75
76
  - classpath/commons-digester-1.8.jar
76
- - classpath/commons-el-1.0.jar
77
77
  - classpath/commons-httpclient-3.1.jar
78
78
  - classpath/commons-io-2.4.jar
79
79
  - classpath/commons-lang-2.6.jar
80
80
  - classpath/commons-logging-1.1.3.jar
81
81
  - classpath/commons-math3-3.1.1.jar
82
82
  - classpath/commons-net-3.1.jar
83
- - classpath/curator-client-2.6.0.jar
84
- - classpath/curator-framework-2.6.0.jar
85
- - classpath/curator-recipes-2.6.0.jar
86
- - classpath/embulk-output-parquet-0.3.0.jar
83
+ - classpath/curator-client-2.7.1.jar
84
+ - classpath/curator-framework-2.7.1.jar
85
+ - classpath/curator-recipes-2.7.1.jar
86
+ - classpath/embulk-output-parquet-0.4.0.jar
87
87
  - classpath/gson-2.2.4.jar
88
- - classpath/hadoop-annotations-2.6.0.jar
89
- - classpath/hadoop-auth-2.6.0.jar
90
- - classpath/hadoop-aws-2.6.0.jar
91
- - classpath/hadoop-client-2.6.0.jar
92
- - classpath/hadoop-common-2.6.0.jar
93
- - classpath/hadoop-hdfs-2.6.0.jar
94
- - classpath/hadoop-mapreduce-client-app-2.6.0.jar
95
- - classpath/hadoop-mapreduce-client-common-2.6.0.jar
96
- - classpath/hadoop-mapreduce-client-core-2.6.0.jar
97
- - classpath/hadoop-mapreduce-client-jobclient-2.6.0.jar
98
- - classpath/hadoop-mapreduce-client-shuffle-2.6.0.jar
99
- - classpath/hadoop-yarn-api-2.6.0.jar
100
- - classpath/hadoop-yarn-client-2.6.0.jar
101
- - classpath/hadoop-yarn-common-2.6.0.jar
102
- - classpath/hadoop-yarn-server-common-2.6.0.jar
103
- - classpath/hadoop-yarn-server-nodemanager-2.6.0.jar
104
- - classpath/htrace-core-3.0.4.jar
88
+ - classpath/hadoop-annotations-2.7.1.jar
89
+ - classpath/hadoop-auth-2.7.1.jar
90
+ - classpath/hadoop-aws-2.7.1.jar
91
+ - classpath/hadoop-client-2.7.1.jar
92
+ - classpath/hadoop-common-2.7.1.jar
93
+ - classpath/hadoop-hdfs-2.7.1.jar
94
+ - classpath/hadoop-mapreduce-client-app-2.7.1.jar
95
+ - classpath/hadoop-mapreduce-client-common-2.7.1.jar
96
+ - classpath/hadoop-mapreduce-client-core-2.7.1.jar
97
+ - classpath/hadoop-mapreduce-client-jobclient-2.7.1.jar
98
+ - classpath/hadoop-mapreduce-client-shuffle-2.7.1.jar
99
+ - classpath/hadoop-yarn-api-2.7.1.jar
100
+ - classpath/hadoop-yarn-client-2.7.1.jar
101
+ - classpath/hadoop-yarn-common-2.7.1.jar
102
+ - classpath/hadoop-yarn-server-common-2.7.1.jar
103
+ - classpath/hadoop-yarn-server-nodemanager-2.7.1.jar
104
+ - classpath/htrace-core-3.1.0-incubating.jar
105
105
  - classpath/httpclient-4.2.5.jar
106
106
  - classpath/httpcore-4.2.4.jar
107
107
  - classpath/jackson-core-asl-1.9.13.jar
108
108
  - classpath/jackson-jaxrs-1.9.13.jar
109
109
  - classpath/jackson-mapper-asl-1.9.13.jar
110
110
  - classpath/jackson-xc-1.9.13.jar
111
- - classpath/jasper-compiler-5.5.23.jar
112
- - classpath/jasper-runtime-5.5.23.jar
113
111
  - classpath/java-xmlbuilder-0.4.jar
114
112
  - classpath/jaxb-api-2.2.2.jar
115
113
  - classpath/jaxb-impl-2.2.3-1.jar
@@ -126,18 +124,18 @@ files:
126
124
  - classpath/joda-time-2.9.1.jar
127
125
  - classpath/jsch-0.1.42.jar
128
126
  - classpath/jsp-api-2.1.jar
129
- - classpath/jsr305-1.3.9.jar
127
+ - classpath/jsr305-3.0.0.jar
130
128
  - classpath/leveldbjni-all-1.8.jar
131
129
  - classpath/log4j-1.2.17.jar
132
130
  - classpath/netty-3.7.0.Final.jar
131
+ - classpath/netty-all-4.0.23.Final.jar
133
132
  - classpath/paranamer-2.3.jar
134
- - classpath/parquet-column-1.5.0.jar
135
- - classpath/parquet-common-1.5.0.jar
136
- - classpath/parquet-encoding-1.5.0.jar
137
- - classpath/parquet-format-2.1.0.jar
138
- - classpath/parquet-generator-1.5.0.jar
139
- - classpath/parquet-hadoop-1.5.0.jar
140
- - classpath/parquet-jackson-1.5.0.jar
133
+ - classpath/parquet-column-1.8.1.jar
134
+ - classpath/parquet-common-1.8.1.jar
135
+ - classpath/parquet-encoding-1.8.1.jar
136
+ - classpath/parquet-format-2.3.0-incubating.jar
137
+ - classpath/parquet-hadoop-1.8.1.jar
138
+ - classpath/parquet-jackson-1.8.1.jar
141
139
  - classpath/protobuf-java-2.5.0.jar
142
140
  - classpath/servlet-api-2.5.jar
143
141
  - classpath/snappy-java-1.1.1.6.jar