我有一个运行Spark(Java API {{1})的本地集成测试。它使用以下命令设置SparkSession:
SELECT * FROM collection c
WHERE c.Name IN ('Test1', 'Test2')
,然后使用2.11_2.4.0
处理数据:
private static SparkSession SPARK_SESSION;
@BeforeClass
public static void beforeClass() {
SparkConf sparkConf = new SparkConf().registerKryoClasses(new Class<?>[]{LongWritable.class, Text.class});
SPARK_SESSION = SparkSession.builder().master("local[1]").config(sparkConf).getOrCreate();
}
在本地(在Windows上)每次都能成功运行。但是,在Jenkins上运行时,它只能在大约25%的时间内工作,而在以下情况下则无法正常工作:75%
SPARK_SESSION
很明显,詹金斯(Jenkins)的另一份工作已经创建了JavaRDD<Tuple2<LongWritable, Text>> rdd = SPARK_SESSION.sparkContext()
.newAPIHadoopFile(inputDir, CustomInputFormat.class, LongWritable.class,Text.class, conf)
.toJavaRDD();
,因此我的测试使用了它。但是,现有的2019-05-09 10:07:49 WARN o.a.s.s.SparkSession$Builder [Test worker]: Using an existing SparkSession; some configuration may not take effect.
2019-05-09 09:45:36 ERROR o.a.s.e.Executor [Executor task launch worker for task 5]: Exception in task 1.0 in stage 4.0 (TID 5)
java.io.NotSerializableException: org.apache.hadoop.io.LongWritable
Serialization stack:
- object not serializable (class: org.apache.hadoop.io.LongWritable, value: 74888)
- field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
没有附加Kryo配置。
我已经尝试过SparkSession
,但是仍然使用现有的SparkSession
。我尝试将Kryo配置添加到现有的getOrCreate().newSession()
中,但这也没有任何改变。
如何确保测试得到自己的SparkContext
,或者至少能够为配置添加属性?