【问题标题】:Why kryo register not work in SparkSession?为什么 kryo 寄存器在 SparkSession 中不起作用?
【发布时间】:2017-12-11 06:30:41
【问题描述】:

这是我的代码:

public static SparkSession getTestSparkSession(String name) {
    SparkConf conf = new SparkConf()
            .set("spark.master", "local")
            .set("spark.ui.port", "8040")
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .set("spark.kryo.registrator", "com.test.MyKryoRegistrator");
    return SparkSession.builder()
            .appName(name)
            .config(conf)
            .getOrCreate();
}

但是注册机好像不行:

  • 我在 registrator 中注册的类仍然无法序列化。
  • 即使我设置了错误的注册器类,也没有警告/错误日志。
  • 我将日志级别设置为DEBUG,发现只有一行关于kryo的日志:DEBUG SparkEnv:58 Using serializer: class org.apache.spark.serializer.KryoSerializer

问题:

  • 如何检查注册器是否有效?
  • 我正在通过mvn test 运行火花会话。是否需要提交操作?

【问题讨论】:

  • 你可以要求 spark 为你获取注册者的 conf。
  • 谢谢。你能告诉我更多吗?
  • 我已经检查过了。配置集操作成功,我可以通过getConf或者UI页面验证。但是,火花似乎没有应用配置。有可能吗?

标签: apache-spark elasticsearch serialization kryo


【解决方案1】:

如果您想验证 Spark 是否考虑了您的配置,您可以要求 Spark 为您获取注册器的 conf。

您只需要从SparkSession 中获取底层SparkContext 并调用getConf 函数,如下所示:

sparkContext.getConf.get("spark.kryo.registrator") // (this is in scala)

否则,您可以随时检查 Spark UI

现在,如果您想强制注册,您需要将 spark.kryo.registrationRequired 设置为 true。 (但是你需要手动注册很多东西)

该参数的默认大小写设置为 false,因此Kryo 将与每个对象一起写入未注册的类名。编写类名会导致显着的性能开销,因此启用此选项可以严格强制用户没有在注册时遗漏类。

另一方面,如果设置为“true”,Kryo 将在未注册的类被序列化时抛出异常。

我建议您阅读我关于该主题的其他答案:

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    实际上,Kryo 寄存器有效。注册的类仍然不能序列化的原因是某些组件不能被 Kryo 序列化。可能会产生误导的是日志没有显示原因。

    原因

    即使我设置了错误的注册器类,也没有警告/错误日志。

    是测试代码有一个构造函数,它调用了Kryo无法序列化的类。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2010-10-31
      相关资源
      最近更新 更多