web-dev-qa-db-fra.com

Comment récupérer Zookeeper à partir de Java.io.EOFException après une panne de serveur?

Comment récupérer de l'erreur suivante qui a commencé à se produire après une panne de serveur? Zookeeper ne démarre pas et le message suivant s'affiche à plusieurs reprises sur le journal.

2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:Java.library.path=/usr/Java/packages/lib/AMD64:/usr/lib64:/lib64:/lib:/usr/lib 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:Java.io.tmpdir=/tmp 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:Java.compiler=<NA> 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:os.name=Linux 
2017-05-27 01:02:08,072 [myid:] - INFO [main:Environment@100] - Server environment:os.Arch=AMD64 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:os.version=3.10.0-514.16.1.el7.x86_64 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.name=zookeeper 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.home=/opt/zookeeper 
2017-05-27 01:02:08,073 [myid:] - INFO [main:Environment@100] - Server environment:user.dir=/ 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@829] - tickTime set to 2000 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@838] - minSessionTimeout set to -1 
2017-05-27 01:02:08,074 [myid:] - INFO [main:ZooKeeperServer@847] - maxSessionTimeout set to -1 
2017-05-27 01:02:08,080 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181 
2017-05-27 01:02:08,385 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,400 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,403 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,403 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,404 [myid:] - ERROR [main:Util@239] - Last transaction was partial. 
2017-05-27 01:02:08,404 [myid:] - ERROR [main:ZooKeeperServerMain@64] - Unexpected exception, exiting abnormally 
Java.io.EOFException 
at Java.io.DataInputStream.readInt(DataInputStream.Java:392) 
at org.Apache.jute.BinaryInputArchive.readInt(BinaryInputArchive.Java:63) 
at org.Apache.zookeeper.server.persistence.FileHeader.deserialize(FileHeader.Java:64) 
at org.Apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.inStreamCreated(FileTxnLog.Java:585) 
at org.Apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.createInputArchive(FileTxnLog.Java:604) 
at org.Apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.goToNextLog(FileTxnLog.Java:570) 
at org.Apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.Java:652) 
at org.Apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.Java:166) 
at org.Apache.zookeeper.server.ZKDatabase.loadDataBase(ZKDatabase.Java:223) 
at org.Apache.zookeeper.server.ZooKeeperServer.loadData(ZooKeeperServer.Java:283) 
at org.Apache.zookeeper.server.ZooKeeperServer.startdata(ZooKeeperServer.Java:410) 
at org.Apache.zookeeper.server.NIOServerCnxnFactory.startup(NIOServerCnxnFactory.Java:118) 
at org.Apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.Java:119) 
at org.Apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.Java:87) 
at org.Apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.Java:53) 
at org.Apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.Java:116) 
at org.Apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.Java:78)

merci IPVP

12
user3395041

Il semble que vous ayez rencontré un bogue connu d'Apache ZooKeeper. Il existe plusieurs problèmes Apache JIRA liés à cela: ZOOKEEPER-1621 et ZOOKEEPER-2332 . Consultez les commentaires de ces problèmes si vous êtes intéressé par l'analyse des causes profondes et quelques correctifs proposés.

Malheureusement, il n'y a pas de version Apache ZooKeeper contenant un correctif pour le bogue pour le moment. Vous pouvez essayer quelques solutions de contournement:

  1. Créez votre propre version locale de ZooKeeper avec l'un des correctifs attachés aux problèmes JIRA liés appliqués. Veuillez noter que ces correctifs n'ont pas encore été acceptés par la communauté ZooKeeper, donc utilisez-les à vos propres risques.
  2. Supprimez le fichier journal incriminé. La cause principale du problème est qu'un fichier journal d'une précédente exécution de ZooKeeper a été écrit avec un en-tête incomplet. Étant donné que l'en-tête se trouve au début du fichier et que l'en-tête lui-même est incomplet, nous pouvons supposer qu'il n'y a pas de données de transaction dans le fichier journal après ce point. Par conséquent, il doit être sûr de supprimer sans provoquer de perte de données.
  3. Si c'est plus facile, vous pourriez envisager de simplement reformater ce cluster ZooKeeper. Cela peut être une solution appropriée si toutes les données de votre installation ZooKeeper sont éphémères et ne nécessitent pas de persistance à long terme.
7
Chris Nauroth

La solution pour moi était de trouver le fichier journal de longueur 0 dans/hadoop/zookeeper/version-2 (ou quel que soit l'emplacement de votre dataDir) et de le supprimer. Démarrez ensuite ZooKeeper.

21
Roshan Summun

La solution pour moi était de trouver le fichier journal dernier (qui avait une longueur de 0 octet)

Vous le trouverez dans le version-2 répertoire

ls -l -r --sort=time

-rw-r--r-- 1 chris chris  67108880 Jan 24 10:37 log.23c6a70
-rw-r--r-- 1 chris chris         0 Jan 24 10:37 log.23d3fb4

J'ai d'abord essayé de supprimer l'instantané et les 2 derniers fichiers journaux qui fonctionnent également, mais vous auriez ensuite une version "un peu" plus ancienne.

-rw-r--r-- 1 chris chris  3685904 Jan 24 00:56 snapshot.23c6a6e

Vous devez peut-être supprimer le dernier fichier d'instantané et le dernier fichier journal ensemble et le fichier journal de longueur 0 pour être sûr.

btw. Le fichier journal et l'instantané ont le même modèle HEX qui doit correspondre

log .23c6a 70

instantané .23c6a 6e

Ils doivent correspondre et être cohérents et ce problème devrait être résolu.

14
Chris