Как явно установить прямой бегун с другими аргументами командной строки? - PullRequest
0 голосов
/ 24 апреля 2019

Я написал этот конвейер, но когда я запускаю его как jar, он не может найти прямого бегуна, когда он указан в моем build.gradle и когда я пытаюсь передать параметр --runner = direct или --runner = Directrunner. Ниже мой код и мой файл build.gradle. Я запускаю задачу gradle fatJar, чтобы создать jar, перейдя в папку build / libs для запуска jar и увидев эту ошибку. это моя команда, которую я использую java -jar filepipeline-all-1.0-SNAPSHOT.jar --input="../testdata" --output="./manifest.json" --runner=DirectRunner Любая помощь с этим вопросом будет принята с благодарностью!

Моя структура папок выглядит так: --src --главный --Джава --com.pipeline --BeamPipeline.java

build.gradle

plugins {
    id 'java'

}

group 'com.dustin'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File',
                'Implementation-Version': version,
                'Main-Class': 'com.pipeline.BeamPipeline'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}


apply plugin: 'application'
mainClassName = 'src.main.java.com.pipeline.BeamPipeline'

dependencies {
    runtime group: 'org.apache.beam', name: 'beam-runners-direct-java', version:'2.8.0'
    compile group: 'org.apache.beam', name: 'beam-sdks-java-core', version:'2.8.0'
    runtime group: 'org.slf4j', name: 'slf4j-jdk14', version:'1.7.25'

    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
    compile group: 'commons-io', name: 'commons-io', version: '2.6'
    compile group: 'commons-codec', name:'commons-codec', version:'1.12'
    compileOnly 'org.projectlombok:lombok:1.18.6'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
    compile group: 'org.json', name: 'json', version: '20180813'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'
}

Pipeline:

package com.pipeline;

import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineRunner;
import org.apache.beam.sdk.io.FileIO;
import org.apache.beam.sdk.options.*;
import org.apache.beam.sdk.transforms.*;
import org.apache.beam.sdk.values.KV;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;



public class BeamPipeline {
    private static final Logger log = LoggerFactory.getLogger(BeamPipeline.class);
    public static interface MyOptions extends PipelineOptions {

        @Validation.Required
        @Description("Input Path(with gs:// prefix)")
        String getInput();
        void setInput(String value);

        @Validation.Required
        @Description("Output Path (with gs:// prefix)")
        String getOutput();
        void setOutput(String value);

    }


    public static void main(String[] args) {

        MyOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(MyOptions.class);
        Pipeline p = Pipeline.create(options);

        File dir = new File(options.getInput());
        String output = options.getOutput();

        for (File file : dir.listFiles()) {
                String inputString = file.toString();
                p
                        .apply("Match Files", FileIO.match().filepattern(inputString))
                        .apply("Read Files", FileIO.readMatches())
                        .apply(MapElements.via(new SimpleFunction<FileIO.ReadableFile, KV<String, String>>() {
                            public KV<String, String> apply(FileIO.ReadableFile file) {
                                String temp = null;

                                try {
                                    temp = file.readFullyAsUTF8String();

                                } catch (IOException e) {

                                }

                                String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(temp);

                                return KV.of(file.getMetadata().resourceId().toString(), sha256hex);

                            }
                        }))
                        .apply("Print", ParDo.of(new DoFn<KV<String, String>, Void>() {
                            @ProcessElement
                            public void processElement(ProcessContext c) throws IOException {

                                FileWriter fileWriter = new FileWriter(output,true);
                                JSONObject obj = new JSONObject();

                                obj.put(c.element().getKey(), c.element().getValue());

                                fileWriter.write(obj.toString());
                                fileWriter.close();

                                log.info(String.format("File: %s, SHA-256 %s", c.element().getKey(), c.element().getValue()));

                            }
                        }));
                }
            p.run().waitUntilFinish();
        }
}

1 Ответ

1 голос
/ 25 апреля 2019

beam-runners-direct-java добавляется как зависимость времени выполнения и, следовательно, не добавляется в толстый файл. Вы можете добавить beam-runners-direct-java в качестве зависимости времени компиляции, чтобы использовать его.

plugins {
    id 'java'
}

group 'com.dustin'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File',
                'Implementation-Version': version,
                'Main-Class': 'com.pipeline.BeamPipeline'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}


apply plugin: 'application'
mainClassName = 'src.main.java.com.pipeline.BeamPipeline'

dependencies {
    compile group: 'org.apache.beam', name: 'beam-runners-direct-java', version:'2.8.0'
    compile group: 'org.apache.beam', name: 'beam-sdks-java-core', version:'2.8.0'
    runtime group: 'org.slf4j', name: 'slf4j-jdk14', version:'1.7.25'

    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
    compile group: 'commons-io', name: 'commons-io', version: '2.6'
    compile group: 'commons-codec', name:'commons-codec', version:'1.12'
    compileOnly 'org.projectlombok:lombok:1.18.6'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
    compile group: 'org.json', name: 'json', version: '20180813'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'
}

В качестве альтернативы, если вы не хотите упаковывать DirectRunner с помощью fatjar и хотите использовать его только для тестирования, вы можете создать отдельный DirectRunner jar и добавить его в часть класса во время работы конвейера.

plugins {
    id 'java'
}

group 'com.dustin'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File',
                'Implementation-Version': version,
                'Main-Class': 'com.pipeline.BeamPipeline'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

task directrunnerjar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File',
                'Implementation-Version': version,
                'Main-Class': 'com.pipeline.BeamPipeline'
    }
    baseName = project.name + '-runtime'
    from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}


apply plugin: 'application'
mainClassName = 'src.main.java.com.pipeline.BeamPipeline'

dependencies {
    runtime group: 'org.apache.beam', name: 'beam-runners-direct-java', version:'2.8.0'
    compile group: 'org.apache.beam', name: 'beam-sdks-java-core', version:'2.8.0'
    runtime group: 'org.slf4j', name: 'slf4j-jdk14', version:'1.7.25'

    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
    compile group: 'commons-io', name: 'commons-io', version: '2.6'
    compile group: 'commons-codec', name:'commons-codec', version:'1.12'
    compileOnly 'org.projectlombok:lombok:1.18.6'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
    compile group: 'org.json', name: 'json', version: '20180813'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'
}

java -cp "libs/myartifact-runtime-1.0-SNAPSHOT.jar:libs/filepipeline-all-1.0-SNAPSHOT" com.pipeline.BeamPipeline --input="../testdata" --output="./manifest.json" --runner=DirectRunner

...