2017-12-11 9 views
1

は、ここに私のコードです:なぜkryo登録がSparkSessionで機能しないのですか?

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(); 
} 

しかし、レジスタが動作しないようです:私はまだレジに直列化可能ではない登録した

  • クラス。
  • 誤った登録者クラスを設定しても、警告/エラーログはありません。
  • 私はログレベルをDEBUGに設定し、kryoについてはただ1つの行ログしか見つけられませんでした:DEBUG SparkEnv:58 Using serializer: class org.apache.spark.serializer.KryoSerializer

質問:レジが動作するかどうか

  • にはどうすれば確認できますか?
  • 私はmvn testでスパークセッションを実行しています。送信操作は必要ですか?
+0

あなたは登録者のためのconfを得るためにsparkに問い合わせることができます。 – eliasah

+0

ありがとうございます。もっと教えていただけますか? – secfree

+0

私はチェックしました。 configureの設定操作は成功し、 'getConf'またはUIページで確認できます。しかし、スパークは設定を適用しなかったようです。出来ますか? – secfree

答えて

2

Sparkが設定を考慮していることを確認したい場合は、Sparkに登録者のためのconfを取得するように頼むことができます。

あなただけSparkSessionから基礎となるSparkContextを取得し、以下のようにgetConf関数を呼び出す必要があります。

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

そうでない場合、あなたは常にスパークUIを確認することができます。

登録を強制する場合は、spark.kryo.registrationRequiredtrueに設定する必要があります。 (ただし、手動でたくさんのものを登録する必要があります)

このパラメータのデフォルトの場合はfalseに設定されていますので、Kryoは各オブジェクトと共に登録されていないクラス名を書き込みます。クラス名を書くと、パフォーマンス上のオーバーヘッドが大きくなる可能性があるため、このオプションを有効にすると、ユーザーがクラスを登録から除外していないことが厳密に強制できます。

一方、 'true'に設定されている場合、登録されていないクラスがシリアル化されている場合、Kryoは例外をスローします。

私は、トピックについての私の他の回答を読むことを助言する:

私はこれが役に立てば幸い!

0

実際には、Kryo登録が機能します。まだ登録されていないクラスがシリアライズ可能でない理由は、Kryoによっていくつかのコンポーネントをシリアライズすることができないためです。誤解を招く可能性があるのは、ログに理由が示されていないということです。

警告/エラー・ログにも私が間違ってレジクラスを設定がありません理由。

テストコードには、Kryoがシリアル化できないクラスを呼び出すコンストラクタがあります。

関連する問題