All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.deeplearning4j.hadoop.util.HdfsLock Maven / Gradle / Ivy

The newest version!
package org.deeplearning4j.hadoop.util;


import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.deeplearning4j.scaleout.zookeeper.ZookeeperBuilder;
import org.deeplearning4j.scaleout.zookeeper.ZookeeperPathBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public  class HdfsLock implements Watcher {
	
	
	
	private ZooKeeper zk;
	private String host;
	private int port;
	private static Logger log = LoggerFactory.getLogger(HdfsLock.class);
	public HdfsLock(String host,int port) {
		this.host = host;
		this.port = port;
		zk = new ZookeeperBuilder().setHost(host).setPort(port).build();

	}
	public HdfsLock(String host) {
		this(host,2181);

	}
	public boolean isLocked() throws KeeperException, InterruptedException {

		String lockPath = new ZookeeperPathBuilder().setHost(host).setPort(port).addPath("hdfslock2").build().replaceAll("//","/");
		Stat stat = zk.exists(lockPath, true);
		boolean ret = stat !=null;
		if(ret) {
			try {
				List paths = getPaths();
				Configuration conf = new Configuration();
				HdfsUtils.setHostForConf(conf);
				FileSystem system = FileSystem.get(conf);
				for(Path path : paths) {
					if(!system.exists(path)) {
						log.info("Paths found to be inconsistent. Auto clearing lock");
						ret = false;						
						zk.delete(lockPath, -1);
						break;
					}
				}

			} catch (Exception e) {
				log.error("Error accessing data, returning false",e);
				return false;
			}	
		}



		return ret;

	}
	
	
	public void create(Collection paths) throws Exception {
		String lockPath = new ZookeeperPathBuilder().setHost(host).setPort(port).addPath("hdfslock2").build().replaceAll("//","/");
		StringBuffer sb = new StringBuffer();
		for(Path path : paths) {
			sb.append(path.toUri().toString() + "\n");
		}
		try {
			zk.create(lockPath, sb.toString().getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
		}catch(KeeperException.SessionExpiredException e) {
			log.error("Session expired...trying again");
			if(zk !=null)
				zk.close();
			zk = new ZookeeperBuilder().setHost(host).setPort(port).build();
			create(paths);

		}
		catch(KeeperException.NodeExistsException e) {
			log.warn("Node exists...deleting");
			zk.delete(lockPath, -1);
			zk.create(lockPath, sb.toString().getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

		}
		catch(Exception e) {
			log.error("Unknown error...trying again");
			if(zk !=null)
				zk.close();
			zk = new ZookeeperBuilder().setHost(host).setPort(port).build();
			create(paths);

		}
	}
	public void delete() throws Exception {

		if(isLocked()) {
			String lockPath = new ZookeeperPathBuilder().setHost(host).setPort(port).addPath("hdfslock2").build().replaceAll("//","/");
			try {
				zk.delete(lockPath, -1);
			}catch(KeeperException.SessionExpiredException e) {
				log.error("Session expired...trying again");
				if(zk !=null)
					zk.close();
				zk = new ZookeeperBuilder().setHost(host).setPort(port).build();
				delete();

			}

		}
	}
	public void close() {
		try {
			zk.close();
		} catch (InterruptedException e) {
			log.info("Error closing lock",e);
			Thread.currentThread().interrupt();
		}
	}

	public List getPaths() throws Exception {
		List ret = new ArrayList();
		String lockPath = new ZookeeperPathBuilder().setHost(host).setPort(port).addPath("hdfslock2").build();
		Stat stat = zk.exists(lockPath, false);
		String data = new String( zk.getData(lockPath, false,stat) );
		String[] paths = data.split("\n");
		for(String s : paths) {
			ret.add(new Path(s));
		}
		return ret;
	}
	@Override
	public void process(WatchedEvent event) {
		if(event.getState() == KeeperState.Expired) {
			zk = new ZookeeperBuilder().setHost(host).setPort(port).setWatcher(this).build();

		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy