Neo, To me it looks like this exception is while you are trying to call:
zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); where: path = "/job_id/task_id/" Does the node /job_id already exist when you are making this request? Zookeeper does not recursively create the path you specify, only the leaf node. If a parent in the path does not exist, you can get this exception I believe. As for your concern about the ordering of calling create and exist, have you tried something like this: if(zk.exists(path, watcher)) // start cleaning data in hdfs If the watcher isn't going to get called (because the node already exists), you can take action immediately rather than in the watcher callback... ~Jared On Sat, Nov 6, 2010 at 7:50 AM, Neo Anderson <javadeveloper...@yahoo.co.uk> wrote: > My question is - what is the right way to received notification once a znode > is created? > > My scenario is that I have two threads, one (thread A) is going to save data > to hdfs, another thread (thread B) is going to delete data stored in hdfs > once thread A finishes its procedure. Thread A will create a znode and Thread > B uses zk.exists() to register a watch. > > Thread A will only do > > zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); > > at the end (in the final block) of a clean function. > > > The watcher in therad B > > Watcher watcher = new Watcher(){ > public void process(WatchedEvent e){ > boolean exist = e.getType().equals(EventType.NodeCreated); > boolean path = e.getPath().equals("/"+job_id+"/"+task_id); > if(exist && path){ > // start cleaning data in hdfs > } > } > > and > > pass watcher to zk.exists(path, watcher); > > but I gets `KeeperErrorCode = NoNode for' exception > > org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = > NoNode for /job_id/task_id > at > org.apache.zookeeper.KeeperException.create(KeeperException.java:102) > at org.apache.zookeeper.KeeperException.create(KeeperException.java:42) > at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:637) > > It looks like znode doesn't exists because thread A still not yet create > znode with path '/job_id/task_id'; however, if I switch to make thread A > create znode first then therad B executes zk.exists(path, watcher). Problems > becomes thread B (or its watcher) would never get triggered deleting data in > hdfs. > > How to fix this? > > I appreciate any suggestion. > > Thanks. > > > > > > > >