docs: public void init(){
      try {
        zk = new ZooKeeper(parent.getProperties().get(TeknekDaemon.ZK_SERVER_LIST).toString(), 30000, this);
      } catch (IOException e1) {
        throw new RuntimeException(e1);
      }
      Feed feed = DriverFactory.buildFeed(plan.getFeedDesc());
      List<WorkerStatus> workerStatus;
      try {
        workerStatus = parent.getWorkerDao().findAllWorkerStatusForPlan(plan, otherWorkers);
      } catch (WorkerDaoException e1) {
        throw new RuntimeException(e1);
      }
      if (workerStatus.size() >= feed.getFeedPartitions().size()){
        throw new RuntimeException("Number of running workers " + workerStatus.size()+" >= feed partitions " + feed.getFeedPartitions().size() +" plan should be fixed " +plan.getName());
      }
      FeedPartition toProcess = findPartitionToProcess(workerStatus, feed.getFeedPartitions());
      if (toProcess != null){
        driver = DriverFactory.createDriver(toProcess, plan, parent.getMetricRegistry());
        driver.initialize(); 
        WorkerStatus iGotThis = new WorkerStatus(myId.toString(), toProcess.getPartitionId() , parent.getMyId());
        try {
          parent.getWorkerDao().registerWorkerStatus(zk, plan, iGotThis);
        } catch (WorkerDaoException e) {
          throw new RuntimeException(e);
        }
      } else {
        throw new RuntimeException("Could not start plan "+plan.getName());
      }
    }