2016-04-26 8 views
0

Ich habe eine alte Topologie, die eine Weile läuft. Aber in letzter Zeit muss ich diese Topologie aktualisieren und habe sie dadurch getötet. Wenn ich versuche, die aktualisierte Topologie vorlegen zu stürmen, solche Ausnahme aufgetreten:lokale Klasse inkompatibel im Sturm

java.io.InvalidClassException: com.weibo.security.storm.bolt.IpCountBolt; local class incompatible: stream classdesc serialVersionUID = -5336119852024782309, local class serialVersionUID = -572783398581060861

Also, ich den Sturm Prozess getötet und versuchte, alles zu Sturm mit Bezug zu löschen, einschließlich storm.log.dir, storm.local.dir, der gesamten Knoten /storm in Tierpfleger und das gesamte Verzeichnis /tmp. Als ich jedoch den Sturm startete und die Topologie erneut einreichte, ist diese Ausnahme immer noch vorhanden.

Ich schaffte es, sie zu umgehen, indem Sie den Klassennamen in meiner Topologie ändern, aber dies sollte nicht die richtige Lösung sein.

Ich verstehe, wie es InvalidClassException verursacht. Aber ich glaube, dass ich alle Daten entfernt habe, die sich auf die alte Topologie beziehen. Warum ist immer noch da? Gibt es irgendwo anders, das ich vermisse, das den Cache für alte Topologie verstecken könnte?

+0

Überprüfen Sie, um (1) zu sehen, definiert die Quelle für die Klasse sogar den Wert der seriellen Version (es wählt einen zufälligen aus wenn nicht) und (2) ist es möglich, dass du irgendwo eine neuere Version der Klasse aufnimmst? –

+0

(1) Nein, es wurde standardmäßig ein zufälliger Wert verwendet. (2) Was meinst du damit, eine neuere Version der Klasse "abzuholen"? –

Antwort

0

Das Problem ist mit Standardwerten für serialVersionID. Wenn Sie keinen Wert für die serialVersionID-Variable deklarieren, wird die JVM mit einem zufälligen Ergebnis versehen. Wenn der Sturm auf JVMs zuläuft, dann wird jeder seinen eigenen Wert haben. Dies führt zu Problemen, wenn Sie die Schraube einer anderen JVM deserialisieren, die serialisiert wurde, da die serialVersionID des deserialisierten Objekts mit der serialVersionID der Klasse in der lokalen jvm übereinstimmen muss.

Um zu lösen, versuchen Sie, die Variable für diese Klasse zu definieren. Wenn Sie nicht über die Quelle verfügen, müssen Sie eine Unterklasse mit der angegebenen serialVersionID erstellen.

+0

In meinem Verständnis bedeutet Ihre Antwort, dass die Topologie am Anfang fehlschlagen würde, da die serialVersionID zwischen JVMs unterschiedlich ist. Aber es nicht. Es funktioniert gut, wenn ich es das erste Mal starte und es versagte, bis ich versuche, die Schrauben zu wechseln und es erneut zu starten. –