ちなみに当人、Javaは普段書きませんので、簡単なことでも教えていただけると非常にありがたいです。
右側の目次でやりたいことを探してください。
カラム
カラムを絞る方法
元ネタ
List<String> columnNames = task.getColumns();
ImmutableList.Builder<Column> builder = ImmutableList.builder();
int i = 0;
for (String columnName : columnNames) {
for (Column inputColumn: inputSchema.getColumns()) {
if (inputColumn.getName().equals(columnName)) {
Column outputColumn = new Column(i++, columnName, inputColumn.getType());
builder.add(outputColumn);
break;
}
}
}
Schema outputSchema = new Schema(builder.build());
時刻
時刻パースの仕方(Embulk 0.6.14以降)
sonotsさんが詳しく書いてくださいました。
Embulk の Timestamp クラスまわりのメモ (Java)
TimestampParser.Task をPluginTaskに追記します。
public interface PluginTask
extends Task, LineDecoder.DecoderTask, TimestampParser.Task
クラスのインスタンス化
final TimestampParser time_parser = new TimestampParser(task.getJRuby(),"%d/%b/%Y:%T %z",task.getDefaultTimeZone());
パース
try {
pageBuilder.setTimestamp(3,time_parser.parse(accessLogEntryMatcher.group(4)));
} catch(TimestampParseException ex) {
throw Throwables.propagate(ex);
}
時刻出力時のフォーマット指定
元ネタ
sonotsさんが詳しく書いてくださいました。
Embulk の Timestamp クラスまわりのメモ (Java)
テスト
gemインストールせずに開発中のプラグインをテストする
travisでテスト
LocalFile
- LocalFileクラスの使い方1 その2 v0.6.16 ~
gradle
javaのオプション追記方法(Deprecation確認)
build.gradleに下記のエントリを追加します。
//
// for deprecation check
//
allprojects {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:deprecation"
}
}
タスクの依存関係を表示する。
gradlew tasks --all
とするとタスクの依存関係が出力されます。--all
を省略するとトップレベルのタスクだけ出力されます。
/gradlew tasks --all
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build tasks
-----------
assemble - Assembles the outputs of this project. [jar]
build - Assembles and tests this project. [assemble, check]
buildDependents - Assembles and tests this project and all projects that depend on it. [build]
buildNeeded - Assembles and tests this project and all projects it depends on. [build]
classes - Assembles classes 'main'.
compileJava - Compiles Java source 'main:java'.
processResources - Processes JVM resources 'main:resources'.
...
プロジェクトの依存関係を出力
./gradlew dependencies
:dependencies
------------------------------------------------------------
Root project
------------------------------------------------------------
archives - Configuration for archive artifacts.
No dependencies
checkstyle - The Checkstyle libraries to be used for this project.
\--- com.puppycrawl.tools:checkstyle:6.7
+--- org.apache.commons:commons-lang3:3.4
+--- antlr:antlr:2.7.7
+--- org.antlr:antlr4-runtime:4.5
+--- commons-beanutils:commons-beanutils-core:1.8.3
+--- commons-cli:commons-cli:1.3
\--- com.google.guava:guava:18.0
compile - Compile classpath for source set 'main'.
+--- org.embulk:embulk-core:0.7.0
| +--- com.google.guava:guava:18.0
| +--- com.google.inject:guice:4.0
| | +--- javax.inject:javax.inject:1
| | +--- aopalliance:aopalliance:1.0
| | \--- com.google.guava:guava:16.0.1 -> 18.0
| +--- com.google.inject.extensions:guice-multibindings:4.0
| | \--- com.google.inject:guice:4.0 (*)
| +--- javax.inject:javax.inject:1
一時ファイル
一時ファイルの作り方
一時ファイルは、Exec.getTempFileSpace() APIを使って作成できます。将来的には、一時ファイルを保存するディスクを複数指定できるようにして、そこからround-robindで選択するような機構が追加される予定です。
— FURUHASHI Sadayuki (@frsyuki) 2015, 7月 2
Embulkのソースコード整形
Embulkのソースコードスタイルチェック方法 (Java編)を参照
DynamicPageBuilder
String→long/timestamp…の型変換を自動でやってくれて、ColumnVisitorが不要になるDynamicPageBuilderという実験的実装
EmbulkEmbed
ソースの変更を検出して自動でコンパイルしてくれるgradleオプション
./gradlew gem -t
gradleがフォアグランドで起動します。コンパイルが終わってもコマンドは終了せず次のようなメッセ〜ジが表示されます。
Waiting for changes to input files of tasks... (ctrl-d to exit)
ソースを修正すると変更を自動的に検出し次のようなメッセージを出力してコンパイルを継続します。
Change detected, executing build...
embulk migrateの注意点
build.gradle
にorg.embulk:embulk-core:0.7.+
のように+
を利用している場合にembulk migrate
を実行すると最新のバージョン番号に置き換わります。(Emblk 0.8.0から)
これは仕様です。参考
build.gradleの変更前と変更後の値は次のようになります。
diff --git a/build.gradle b/build.gradle
index c3985ed..478f544 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,13 +21,13 @@ sourceCompatibility = 1.7
targetCompatibility = 1.7
dependencies {
- compile "org.embulk:embulk-core:0.7.+"
- provided "org.embulk:embulk-core:0.7.+"
+ compile "org.embulk:embulk-core:0.8.1"
+ provided "org.embulk:embulk-core:0.8.1"
// compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION"
compile 'org.apache.hadoop:hadoop-client:2.6.0'
testCompile "junit:junit:4.+"
- testCompile "org.embulk:embulk-core:0.7.+:tests"
- testCompile "org.embulk:embulk-standards:0.7.+"
+ testCompile "org.embulk:embulk-core:0.8.1:tests"
+ testCompile "org.embulk:embulk-standards:0.8.1"
}
最後に一度だけ実行
@toyama0919 処理の内容にもよると思いますがcleanupの中で実行するとか。ESの例のPRだとcleanupの中でaliasの貼り替えするようにしました。 https://t.co/ugVrOLz7f6
— oreradio (@oreradio) 2016, 1月 22
SimpleDateFormatは使わないほうが良いらしい。
ImmutableでスレッドセーフになったJavaの新しい日時APIの基礎知識 (1/5)
SimpleDateFormatはスレッドセーフでないらしく、誤ったデータを返すことがあるようだ。Joda-Timeを使うのが良い模様。
(パーサーは良いかもしれない(自信なし)が、フィルタでは使わないほうがよさそう)
JavaでGuessを実装する
embulk-parser-grokを参考にしましょう。
Mapreduce-executor.
@sonots transactionはMapReduceを発行するサーバで実行され、各タスクだけがMRで分散実行されますよ
— Sadayuki Furuhashi (@frsyuki) 2016年9月5日
mapreduce executorちょっと触ってみて思うのは、temp fileの書き出しが上手く動くかどうかかなあ。あそこがちゃんと動くなら問題無さそうだけど。
— joker1007 (きのこ派) (@joker1007) 2016年9月5日
リトライ
追補
@Civitaspo 書いたのが昔なので載ってないですが、接続先のAPIによってはステータス:429だけは拾ってここでtrue返してリトライした方が良さげ。https://t.co/B67zYcxud5
— oreradio (@oreradio) 2017年5月22日
EmbulkのRetryExecutor、例外処理+リトライの時は同じコード書かなくて便利だと思う。
— oreradio (@oreradio) 2017年5月22日
ただjob/処理のステータスのポーリングみたいに単純にexponential back offが欲しい、例外処理は他でやってるからいらないといった場合はちょっと重すぎるかも。 https://t.co/TOAt71B0xI
— oreradio (@oreradio) 2017年5月22日
trunsationとrunでのパラメータの共有
embulkのtransaction -> openのデータの受け渡し下記で実現できた。
— masa (@smdmts) 2017年8月18日
- transaction
val t = task.dump()
t.set("abc", "efg")
- open
ts.get(classOf[String] , "abc")