gpt4 book ai didi

java - 无法在单元测试的 Before 和 After 方法中启动/停止 Spark

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:21 25 4
gpt4 key购买 nike

我正在为我的 spark 应用程序编写单元测试,但遇到了问题。理想情况下,我希望有一个 BeforeAfter 方法来启动和停止 spark(而不是在单元测试方法本身中执行)。

下面的实现有效,我可以在测试开始时声明 SparkConfJavaSparkContext 然后执行 sc.close() 最后。

@Test
public void testMethod(){
SparkConf conf = new SparkConf().setMaster("local").setAppName("testGeoHashAggregation");
JavaSparkContext sc = new JavaSparkContext(conf);

// yadda yadda yadda
//tests here

sc.close()
}

但我想设置它,以便开始和停止有自己的方法

@Before
public void init(){
SparkConf conf = new SparkConf().setMaster("local").setAppName("testGeoHashAggregation");
JavaSparkContext sc = new JavaSparkContext(conf);
}

@After
public void close(){
sc.close();
}

知道为什么后者不起作用吗?我会遇到一些对象不可序列化的异常。

最佳答案

  1. 一开始sc应该是类域,不是init()方法的局部变量
  2. 其次,使用@BeforeClass@AfterClass 不是更好吗? spark启动比较长(web ui、cluster等每次都在启动),如果完全隔离不是问题,那么@BeforeClass会更好。但是,这只是一个建议,而不是您问题的解决方案。

因此,此示例中的代码如下所示:

public class SomeSparkTest implements Serializable {

private static transient JavaSparkContext jsc;

@BeforeClass
public static void init () {
SparkConf conf = new SparkConf().setMaster("local").setAppName("testGeoHashAggregation");
jsc = new JavaSparkContext(conf);
}

@AfterClass
public static void close(){
jsc.close();
}

@Test
public void shouldSomethingHappend () {
// given
// preparation of RDDs
JavaRDD<String> rdd = jsc.textFile(...)

// when
// actions
long count = rdd.count()

// then
// verify output; assertThat is from FestAssertions, not necessary
assertThat(count).isEqualTo(5)
}
}

Here你已经从 Spark 存储库中获得了一些测试套件

说明:您在测试中使用的任何 lambda 或内部类都引用了外部类,在本例中它是测试类。 Spark 始终序列化 lambdas/内部类,即使在本地集群模式下也是如此。如果你的测试类不可序列化或者它有任何不可序列化的字段,那么就会出现这样的错误

关于java - 无法在单元测试的 Before 和 After 方法中启动/停止 Spark ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com