私はJavaアプリケーションを使用しており、ここでFlink Api
を使用しています。したがって、基本的に私がコードでやろうとしていることは、レコードが少ない2つのデータセットを作成し、次に、それらを必要なフィールドとともに2つのテーブルとして登録します。
DataSet<Company> comp = env.fromElements(
new Company("Aux", 1),
new Company("Comp2", 2),
new Company("Comp3", 3));
DataSet<Employee> emp = env.fromElements(
new Employee("Kula", 1),
new Employee("Ish", 1),
new Employee("Kula", 3));
tEnv.registerDataSet("Employee", emp, "name, empId");
tEnv.registerDataSet("Company", comp, "cName, empId");
次に、Table API
を使用して、これら2つのテーブルを結合しようとしています。
Table anotherJoin = tEnv.sql("SELECT Employee.name, Employee.empId, Company.cName FROM " +
"Employee RIGHT JOIN Company on Employee.empId = Company.empId");
そして、結果をコンソールに出力しています。 これはローカルで完全に機能します私のマシンで。依存関係のあるfat-jar
を使用してmaven-shade-plugin
を作成し、AWS Lambda
で実行しようとしています。
そこで、そこで実行しようとすると、次の例外が出てスローされます(最初の数行のみを投稿しています)。
reference.conf @ file:/var/task/reference.conf:804:置換を値に解決できませんでした:$ {akka.stream.materializer}:com.typesafe.config.ConfigException $ UnresolvedSubstitution com.typesafe.config.ConfigException $ UnresolvedSubstitution:reference.conf @ file:/var/task/reference.conf:804:置換を値に解決できませんでした:com.typesafe.config.impl.ConfigReference.resolveSubstitutions(ConfigReferenceで$ {akka.stream.materializer} .Java:111)com.typesafe.config.impl.ResolveContext.realResolve(ResolveContext.Java:179)at com.typesafe.config.impl.ResolveContext.resolve(ResolveContext.Java:142)で
Lambdaで実行する前にjarを抽出したところ、たまたますべての依存関係がそこにあることがわかりました。それがどこで間違っているのか分かりませんか?
任意の助けをいただければ幸いです。
最終的に、これを理解することができました、そしてそれは私のpom内のいくつかのメジャーバージョンの問題でした。次に、すべての依存関係をFlink 1.3.2
にダウングレードし、shade
プラグイン内に<relocations>
を追加しました。現在は機能しています。私はpom全体を添付するので、いつか誰かを助けるでしょう:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.ink.FlinkLambdaTest.FlinkToLambda</mainClass>
</transformer>
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
</transformers>
<relocations>
<relocation>
<pattern>org.codehaus.plexus.util</pattern>
<shadedPattern>org.shaded.plexus.util</shadedPattern>
<excludes>
<exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
<exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-table_2.10</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-Java</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-streaming-Java_2.10</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-clients_2.10</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-scala_2.10</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.Apache.flink</groupId>
<artifactId>flink-streaming-scala_2.10</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
必ずメインクラスを自分のものに変更してください。
このコードをpom-> maven-shaded-plugin->構成セクションに追加する必要があります。
<transformers>
<!-- append default configs -->
<transformer implementation="org.Apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
</transformers>
グラドル:
buildscript {
repositories {
maven {
url 'https://plugins.gradle.org/m2/'
}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
次に、akka依存関係を集約するプロジェクトで:
shadowJar {
include 'reference.conf'
}
これを配置すると、(たとえば、アセンブルタスクとビルドタスクを呼び出して)通常どおりにビルドできるようになります。
Intellij IDEAはこれもサポートしました。FTW!以下のSBT構成もサポートしました。
lazy val assemblySettings = Seq(
assemblyJarName in Assembly := name.value + ".jar",
assemblyMergeStrategy in Assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case _ => MergeStrategy.first
})
SBTユーザーにとって、これは私にとってはうまくいきます。
assemblyMergeStrategy in Assembly := {
{
case PathList("META-INF", xs@_*) => MergeStrategy.discard
case "reference.conf" => MergeStrategy.concat
case x => MergeStrategy.first
}
}
これは少し遅れる可能性がありますが、このトピックに関する flink Webサイト からの回答です。
また、META-INFフォルダーに関する情報も除外されます。これは、jarを使用するときにセキュリティの問題を引き起こす可能性があります。
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
<exclude>org.slf4j:*</exclude>
<exclude>log4j:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.
Otherwise, this might cause SecurityExceptions when using the JAR. -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>my.programs.main.clazz</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>