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 in artifactId für die Spark-Version geeignet ist. In dem Beispiel ist artifactId für Scala 2.12 auf spark-core_2.12 gesetzt.
Schließen Sie Spark-binärdateien, die bereits im Standard-Spark-Bundle enthalten sind, mit dem scope-Wert provided 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 in artifactId.
<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>