4

私はZooKeeperをいくつかの同時実行管理のためのプロジェクトに引き込んでいます、そして私が最初に試したのは、私にとって非常に明白なものでした(zkpythonバインディングを使用して):

zh = zookeeper.init('localhost:2181')
zookeeper.create(zh, '/path/to/a/node', '', [ZOO_OPEN_ACL_UNSAFE])

そして、私はNoNodeException私のトラブルのために戻ってきました。

これを熟考し、ドキュメント(そのようなもの)を確認した後mkdir -p、ZooKeeperが欠落している親ノードを作成するのと同等の方法を見つけることができませんでした。

私は何かが足りないのですか、それとも私が好きかどうかにかかわらず、パスの各部分に対して別々のcreate()を発行するのに行き詰まっていますか?

4

3 に答える 3

9

パスの要素ごとに個別のcreate()を発行することに固執しています。Zookeeperには、アトミック操作のみが組み込まれています。パスを再帰的に作成することは、アトミック操作ではなくなりました。パス要素の半分を作成した後に操作がハングした場合、Zookeeperは何をしたいかを知ることができませんでした。PythonにZookeeperヘルパーライブラリがすでにあるかどうかはわかりません。java(zkClient)には、create()を複数回呼び出すことで再帰パスを作成できるものがあります。

于 2010-07-27T07:21:32.327 に答える
2

個別のcreate()を発行すると、途中で中断または失敗する可能性があります。呼び出しをアトミックにするために、新しいmulti()APIを使用できます。この回答を参照してください。

パスまたはその一部がすでに存在する可能性がある場合、次のパスを発行する前に各create()が終了するのを待つと、不必要に遅くなります。この場合、非同期APIを使用してプロセスを高速化できます。この回答を参照してください。

余分な呼び出しを避けたいだけの場合は、メソッドを備えたNetflixのキュレーターライブラリを使用できますがcreatingParentsIfNeeded、時間がかかる可能性があることに注意してください。この回答を参照してください。

于 2012-05-22T16:27:20.367 に答える
0

カズーには、ensure_path(path)アトミックとは見なされていませんが、操作があります。これを使用すると、少なくとも再帰的な作成のために独自のコードを作成する必要がなくなります。

于 2014-02-25T17:18:52.527 に答える