Best Practices für die Erstellung von Java Spark-Streaminganwendungen
Tipps und Best Practices zum Konfigurieren von Java-Build-Projekten in Data Flow.
In den folgenden Beispielen wird Maven verwendet, um die verschiedenen Konfigurationsmöglichkeiten zu zeigen.
- Verwenden Sie eine konsistente Spark-Version in Ihren Librarys und in Data Flow
- Am einfachsten ist es, eine allgemeine Variable zu definieren und wiederzuverwenden. Im folgenden Beispiel lautet die allgemeine Variable
spark.version
.<properties> ... <spark.version>3.0.2</spark.version> ... </properties> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency>
Hinweis
Stellen Sie sicher, dass die Scala-Version inartifactId
für die Spark-Version geeignet ist. In dem Beispiel istartifactId
für Scala 2.12 aufspark-core_2.12
gesetzt.
- Schließen Sie Spark-binärdateien, die bereits im Standard-Spark-Bundle enthalten sind, mit dem
scope
-Wertprovided
ein, um eine Codeduplikation zu vermeiden. - Erweiterung des vorherigen Beispiels:
<properties> ... <spark.version>3.0.2</spark.version> ... </properties> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency> ...
Hinweis
Weitere Informationen zum Abhängigkeitsgeltungsbereich finden Sie in der Maven-Dokumentation.
- Verpacken Sie Spark-binärdateien, die nicht zum Standard-Bundle gehören, mit Ihrer Spark-Anwendung.
- Dieses Beispiel enthält
spark-sql-kafka-0-10_2.12
inartifactId
.<properties> ... <spark.version>3.0.2</spark.version> ... </properties> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql-kafka-0-10_2.12</artifactId> <version>${spark.version}</version> </dependency> ...
- Das Oracle Cloud Infrastructure-SDK kann mit einer anderen Version von Drittanbieter-Librarys kompiliert werden, was zu Laufzeitfehlern führen kann. Um solche Fehler zu vermeiden, verpacken Sie das Oracle Cloud Infrastructure-SDK und Librarys von Drittanbietern mit Ihrer Spark-Anwendung, und verschieben Sie neuere Drittanbieter-Librarys in einen schattigen Namespace.
- Beispiel:
<dependencies> <dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId> </artifactId> <optional>false</optional> <version>1.36.1</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.11.1</version> </dependency> </dependencies> ... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <configuration> <!-- The final uber jar file name will not have a version component. --> <finalName>${project.artifactId}</finalName> <createDependencyReducedPom>false</createDependencyReducedPom> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/> </transformers> <relocations> <relocation> <pattern>com.google.</pattern> <shadedPattern>com.shaded.google.</shadedPattern> </relocation> <relocation> <pattern>com.oracle.bmc.</pattern> <shadedPattern>com.shaded.oracle.bmc.</shadedPattern> </relocation> </relocations> <!-- exclude signed Manifests --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> ...
POM.xml-Beispieldatei für Java Spark-Streaminganwendung
Ein POM.xml-Beispiel für die Verwendung beim Erstellen einer Java-basierten Spark-Streaminganwendung für die Verwendung mit Data Flow.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>StructuredKafkaWordCount</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<spark.version>3.2.1</spark.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-addons-sasl</artifactId>
<optional>false</optional>
<version>1.36.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql-kafka-0-10_2.12/3.2.1</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<skipAssembly>false</skipAssembly>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<!-- The final uber jar file name will not have a version component. -->
<finalName>${project.artifactId}</finalName>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
</transformers>
<relocations>
<relocation>
<pattern>com.google.</pattern>
<shadedPattern>com.shaded.google.</shadedPattern>
</relocation>
<relocation>
<pattern>com.oracle.bmc.</pattern>
<shadedPattern>com.shaded.oracle.bmc.</shadedPattern>
</relocation>
</relocations>
<!-- exclude signed Manifests -->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>