Dataproc 集群中的 Scala Spark 作业 returns java.util.NoSuchElementException:None.get
Scala Spark Job in Dataproc cluster returns java.util.NoSuchElementException: None.get
我收到错误
ERROR org.apache.spark.executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.util.NoSuchElementException: None.get
当我 运行 我的工作使用 Dataproc 集群时,当我 运行 它在本地时它 运行 完美。我使用以下玩具示例重现了该问题。
package com.deequ_unit_tests
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
object reduce_by_key_example {def main(args: Array[String]): Unit = {
// Set the log level to only print errors
Logger.getLogger("org").setLevel(Level.ERROR)
val spark: SparkSession = SparkSession.builder()
.master("local[1]")
.appName("SparkByExamples.com")
.getOrCreate()
println("Step 1")
val data = Seq(("Project", 1),
("Gutenberg’s", 1),
("Alice’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1))
println("Step 2")
val rdd = spark.sparkContext.parallelize(data)
println("Step 3")
val rdd2 = rdd.reduceByKey(_ + _)
println("Step 4")
rdd2.foreach(println)
}
}
当我 运行 在 Dataproc 中执行此作业时,我在执行行
时收到此错误
rdd2.foreach(println)
作为附加信息,我不得不说,直到在我公司的 Dataproc 集群中应用了一些更改后,我才收到此错误。对于使用 PySpark 的同事,在 Pyspark 中使用上述示例的等效版本,更改
sc = SparkContext('local')
到
sc = SparkContext()
成功了,但我在 Spark Scala 中找不到等效的解决方案。您知道可能导致此问题的原因吗?欢迎任何帮助。
- 按如下方式配置您的 pom.xml 或 build.sbt:
在脚本中添加提供的范围:
<?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>org.example</groupId>
<artifactId>WhosebugGcp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!-- assembly Maven Plugin -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>mainPackage.mainObject</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 创建您的包:清理 => 重建 => 编译 => 包
package mainPackage
import org.apache.spark.sql.SparkSession
object mainObject {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
//.master("local[*]")
.appName("SparkByExamples")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
println("Step 1")
val data = Seq(("Project", 1),
("Gutenberg’s", 1),
("Alice’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1))
println("Step 2")
val rdd = spark.sparkContext.parallelize(data)
println("Step 3")
val rdd2 = rdd.reduceByKey(_ + _)
println("Step 4")
rdd2.foreach(println)
}
}
- 创建您的 dataproc 集群
- 运行 dataproc 中的 spark 作业
在 dataproc 中,您不会看到之前提到的结果,如果您想知道,只需阅读有关 Dataproc approch 的更多信息。但是,如果您愿意,可以在 dataproc 中显示数据框。
正如您在 dataproc 中看到的那样,一切正常。
完成后不要忘记关闭集群或删除它;)
我收到错误
ERROR org.apache.spark.executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.util.NoSuchElementException: None.get
当我 运行 我的工作使用 Dataproc 集群时,当我 运行 它在本地时它 运行 完美。我使用以下玩具示例重现了该问题。
package com.deequ_unit_tests
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
object reduce_by_key_example {def main(args: Array[String]): Unit = {
// Set the log level to only print errors
Logger.getLogger("org").setLevel(Level.ERROR)
val spark: SparkSession = SparkSession.builder()
.master("local[1]")
.appName("SparkByExamples.com")
.getOrCreate()
println("Step 1")
val data = Seq(("Project", 1),
("Gutenberg’s", 1),
("Alice’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1))
println("Step 2")
val rdd = spark.sparkContext.parallelize(data)
println("Step 3")
val rdd2 = rdd.reduceByKey(_ + _)
println("Step 4")
rdd2.foreach(println)
}
}
当我 运行 在 Dataproc 中执行此作业时,我在执行行
时收到此错误rdd2.foreach(println)
作为附加信息,我不得不说,直到在我公司的 Dataproc 集群中应用了一些更改后,我才收到此错误。对于使用 PySpark 的同事,在 Pyspark 中使用上述示例的等效版本,更改
sc = SparkContext('local')
到
sc = SparkContext()
成功了,但我在 Spark Scala 中找不到等效的解决方案。您知道可能导致此问题的原因吗?欢迎任何帮助。
- 按如下方式配置您的 pom.xml 或 build.sbt:
在脚本中添加提供的范围:
<?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>org.example</groupId>
<artifactId>WhosebugGcp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!-- assembly Maven Plugin -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>mainPackage.mainObject</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 创建您的包:清理 => 重建 => 编译 => 包
package mainPackage
import org.apache.spark.sql.SparkSession
object mainObject {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
//.master("local[*]")
.appName("SparkByExamples")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
println("Step 1")
val data = Seq(("Project", 1),
("Gutenberg’s", 1),
("Alice’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1),
("Adventures", 1),
("in", 1),
("Wonderland", 1),
("Project", 1),
("Gutenberg’s", 1))
println("Step 2")
val rdd = spark.sparkContext.parallelize(data)
println("Step 3")
val rdd2 = rdd.reduceByKey(_ + _)
println("Step 4")
rdd2.foreach(println)
}
}
- 创建您的 dataproc 集群
- 运行 dataproc 中的 spark 作业
在 dataproc 中,您不会看到之前提到的结果,如果您想知道,只需阅读有关 Dataproc approch 的更多信息。但是,如果您愿意,可以在 dataproc 中显示数据框。
正如您在 dataproc 中看到的那样,一切正常。 完成后不要忘记关闭集群或删除它;)