Example usage for org.apache.hadoop.fs FileContext rename

List of usage examples for org.apache.hadoop.fs FileContext rename

Introduction

In this page you can find the example usage for org.apache.hadoop.fs FileContext rename.

Prototype

public void rename(final Path src, final Path dst, final Options.Rename... options)
        throws AccessControlException, FileAlreadyExistsException, FileNotFoundException,
        ParentNotDirectoryException, UnsupportedFileSystemException, IOException 

Source Link

Document

Renames Path src to Path dst
  • Fails if src is a file and dst is a directory.

    Usage

    From source file:com.datatorrent.contrib.hdht.HDHTFileAccessFSImpl.java

    License:Open Source License

    @Override
    public void rename(long bucketKey, String fromName, String toName) throws IOException {
        FileContext fc = FileContext.getFileContext(fs.getUri());
        Path bucketPath = getBucketPath(bucketKey);
        // file context requires absolute path
        if (!bucketPath.isAbsolute()) {
            bucketPath = new Path(fs.getWorkingDirectory(), bucketPath);
        }/* w w  w .j  av  a 2  s  .c  o  m*/
        fc.rename(new Path(bucketPath, fromName), new Path(bucketPath, toName), Rename.OVERWRITE);
    }
    

    From source file:com.datatorrent.lib.io.fs.AbstractFileOutputOperator.java

    License:Open Source License

    @Override
    public void setup(Context.OperatorContext context) {
        LOG.debug("setup initiated");
        rollingFile = maxLength < Long.MAX_VALUE;
    
        //Getting required file system instance.
        try {/*from   w  ww.j  a  va 2s .c  o m*/
            fs = getFSInstance();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    
        if (replication <= 0) {
            replication = fs.getDefaultReplication(new Path(filePath));
        }
    
        LOG.debug("FS class {}", fs.getClass());
    
        //When an entry is removed from the cache, removal listener is notified and it closes the output stream.
        RemovalListener<String, FSDataOutputStream> removalListener = new RemovalListener<String, FSDataOutputStream>() {
            @Override
            public void onRemoval(RemovalNotification<String, FSDataOutputStream> notification) {
                FSDataOutputStream value = notification.getValue();
                if (value != null) {
                    try {
                        LOG.debug("closing {}", notification.getKey());
                        value.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
    
        //Define cache
        CacheLoader<String, FSDataOutputStream> loader = new CacheLoader<String, FSDataOutputStream>() {
            @Override
            public FSDataOutputStream load(String filename) {
                String partFileName = getPartFileNamePri(filename);
                Path lfilepath = new Path(filePath + Path.SEPARATOR + partFileName);
    
                FSDataOutputStream fsOutput;
    
                boolean sawThisFileBefore = endOffsets.containsKey(filename);
    
                try {
                    if (fs.exists(lfilepath)) {
                        if (sawThisFileBefore) {
                            FileStatus fileStatus = fs.getFileStatus(lfilepath);
                            MutableLong endOffset = endOffsets.get(filename);
    
                            if (endOffset != null) {
                                endOffset.setValue(fileStatus.getLen());
                            } else {
                                endOffsets.put(filename, new MutableLong(fileStatus.getLen()));
                            }
    
                            fsOutput = fs.append(lfilepath);
                            LOG.debug("appending to {}", lfilepath);
                        }
                        //We never saw this file before and we don't want to append
                        else {
                            //If the file is rolling we need to delete all its parts.
                            if (rollingFile) {
                                int part = 0;
    
                                while (true) {
                                    Path seenPartFilePath = new Path(
                                            filePath + Path.SEPARATOR + getPartFileName(filename, part));
                                    if (!fs.exists(seenPartFilePath)) {
                                        break;
                                    }
    
                                    fs.delete(seenPartFilePath, true);
                                    part = part + 1;
                                }
    
                                fsOutput = fs.create(lfilepath, (short) replication);
                            }
                            //Not rolling is easy, just delete the file and create it again.
                            else {
                                fs.delete(lfilepath, true);
                                fsOutput = fs.create(lfilepath, (short) replication);
                            }
                        }
                    } else {
                        fsOutput = fs.create(lfilepath, (short) replication);
                    }
    
                    //Get the end offset of the file.
    
                    LOG.info("opened: {}", fs.getFileStatus(lfilepath).getPath());
                    return fsOutput;
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        };
    
        streamsCache = CacheBuilder.newBuilder().maximumSize(maxOpenFiles).removalListener(removalListener)
                .build(loader);
    
        try {
            LOG.debug("File system class: {}", fs.getClass());
            LOG.debug("end-offsets {}", endOffsets);
    
            //Restore the files in case they were corrupted and the operator
            Path writerPath = new Path(filePath);
            if (fs.exists(writerPath)) {
                for (String seenFileName : endOffsets.keySet()) {
                    String seenFileNamePart = getPartFileNamePri(seenFileName);
                    LOG.debug("seenFileNamePart: {}", seenFileNamePart);
                    Path seenPartFilePath = new Path(filePath + Path.SEPARATOR + seenFileNamePart);
                    if (fs.exists(seenPartFilePath)) {
                        LOG.debug("file exists {}", seenFileNamePart);
                        long offset = endOffsets.get(seenFileName).longValue();
                        FSDataInputStream inputStream = fs.open(seenPartFilePath);
                        FileStatus status = fs.getFileStatus(seenPartFilePath);
    
                        if (status.getLen() != offset) {
                            LOG.info("file corrupted {} {} {}", seenFileNamePart, offset, status.getLen());
                            byte[] buffer = new byte[COPY_BUFFER_SIZE];
    
                            Path tmpFilePath = new Path(
                                    filePath + Path.SEPARATOR + seenFileNamePart + TMP_EXTENSION);
                            FSDataOutputStream fsOutput = fs.create(tmpFilePath, (short) replication);
                            while (inputStream.getPos() < offset) {
                                long remainingBytes = offset - inputStream.getPos();
                                int bytesToWrite = remainingBytes < COPY_BUFFER_SIZE ? (int) remainingBytes
                                        : COPY_BUFFER_SIZE;
                                inputStream.read(buffer);
                                fsOutput.write(buffer, 0, bytesToWrite);
                            }
    
                            flush(fsOutput);
                            fsOutput.close();
                            inputStream.close();
    
                            FileContext fileContext = FileContext.getFileContext(fs.getUri());
                            LOG.debug("temp file path {}, rolling file path {}", tmpFilePath.toString(),
                                    status.getPath().toString());
                            fileContext.rename(tmpFilePath, status.getPath(), Options.Rename.OVERWRITE);
                        } else {
                            inputStream.close();
                        }
                    }
                }
            }
    
            //delete the left over future rolling files produced from the previous crashed instance
            //of this operator.
            if (rollingFile) {
                for (String seenFileName : endOffsets.keySet()) {
                    try {
                        Integer part = openPart.get(seenFileName).getValue() + 1;
    
                        while (true) {
                            Path seenPartFilePath = new Path(
                                    filePath + Path.SEPARATOR + getPartFileName(seenFileName, part));
                            if (!fs.exists(seenPartFilePath)) {
                                break;
                            }
    
                            fs.delete(seenPartFilePath, true);
                            part = part + 1;
                        }
    
                        Path seenPartFilePath = new Path(filePath + Path.SEPARATOR
                                + getPartFileName(seenFileName, openPart.get(seenFileName).intValue()));
    
                        //Handle the case when restoring to a checkpoint where the current rolling file
                        //already has a length greater than max length.
                        if (fs.getFileStatus(seenPartFilePath).getLen() > maxLength) {
                            LOG.debug("rotating file at setup.");
                            rotate(seenFileName);
                        }
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    } catch (ExecutionException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
    
            LOG.debug("setup completed");
            LOG.debug("end-offsets {}", endOffsets);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    
        this.context = context;
        lastTimeStamp = System.currentTimeMillis();
    
        fileCounters.setCounter(Counters.TOTAL_BYTES_WRITTEN, new MutableLong());
        fileCounters.setCounter(Counters.TOTAL_TIME_ELAPSED, new MutableLong());
    }
    

    From source file:com.datatorrent.lib.io.fs.AbstractFSWriter.java

    License:Open Source License

    @Override
    public void setup(Context.OperatorContext context) {
        rollingFile = maxLength < Long.MAX_VALUE;
    
        //Getting required file system instance.
        try {//  www  .  j a  va  2 s .  c om
            fs = getFSInstance();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    
        LOG.debug("FS class {}", fs.getClass());
    
        //Setting listener for debugging
        LOG.debug("setup initiated");
        RemovalListener<String, FSDataOutputStream> removalListener = new RemovalListener<String, FSDataOutputStream>() {
            @Override
            public void onRemoval(RemovalNotification<String, FSDataOutputStream> notification) {
                FSDataOutputStream value = notification.getValue();
                if (value != null) {
                    try {
                        LOG.debug("closing {}", notification.getKey());
                        value.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
    
        //Define cache
        CacheLoader<String, FSDataOutputStream> loader = new CacheLoader<String, FSDataOutputStream>() {
            @Override
            public FSDataOutputStream load(String filename) {
                String partFileName = getPartFileNamePri(filename);
                Path lfilepath = new Path(filePath + File.separator + partFileName);
    
                FSDataOutputStream fsOutput;
                if (replication <= 0) {
                    replication = fs.getDefaultReplication(lfilepath);
                }
    
                boolean sawThisFileBefore = endOffsets.containsKey(filename);
    
                try {
                    if (fs.exists(lfilepath)) {
                        if (sawThisFileBefore || append) {
                            FileStatus fileStatus = fs.getFileStatus(lfilepath);
                            MutableLong endOffset = endOffsets.get(filename);
    
                            if (endOffset != null) {
                                endOffset.setValue(fileStatus.getLen());
                            } else {
                                endOffsets.put(filename, new MutableLong(fileStatus.getLen()));
                            }
    
                            fsOutput = fs.append(lfilepath);
                            LOG.debug("appending to {}", lfilepath);
                        }
                        //We never saw this file before and we don't want to append
                        else {
                            //If the file is rolling we need to delete all its parts.
                            if (rollingFile) {
                                int part = 0;
    
                                while (true) {
                                    Path seenPartFilePath = new Path(
                                            filePath + "/" + getPartFileName(filename, part));
                                    if (!fs.exists(seenPartFilePath)) {
                                        break;
                                    }
    
                                    fs.delete(seenPartFilePath, true);
                                    part = part + 1;
                                }
    
                                fsOutput = fs.create(lfilepath, (short) replication);
                            }
                            //Not rolling is easy, just delete the file and create it again.
                            else {
                                fs.delete(lfilepath, true);
                                fsOutput = fs.create(lfilepath, (short) replication);
                            }
                        }
                    } else {
                        fsOutput = fs.create(lfilepath, (short) replication);
                    }
    
                    //Get the end offset of the file.
    
                    LOG.debug("full path: {}", fs.getFileStatus(lfilepath).getPath());
                    return fsOutput;
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        };
    
        streamsCache = CacheBuilder.newBuilder().maximumSize(maxOpenFiles).removalListener(removalListener)
                .build(loader);
    
        try {
            LOG.debug("File system class: {}", fs.getClass());
            LOG.debug("end-offsets {}", endOffsets);
    
            //Restore the files in case they were corrupted and the operator
            Path writerPath = new Path(filePath);
            if (fs.exists(writerPath)) {
                for (String seenFileName : endOffsets.keySet()) {
                    String seenFileNamePart = getPartFileNamePri(seenFileName);
                    LOG.debug("seenFileNamePart: {}", seenFileNamePart);
                    Path seenPartFilePath = new Path(filePath + "/" + seenFileNamePart);
                    if (fs.exists(seenPartFilePath)) {
                        LOG.debug("file exists {}", seenFileNamePart);
                        long offset = endOffsets.get(seenFileName).longValue();
                        FSDataInputStream inputStream = fs.open(seenPartFilePath);
                        FileStatus status = fs.getFileStatus(seenPartFilePath);
    
                        if (status.getLen() != offset) {
                            LOG.info("file corrupted {} {} {}", seenFileNamePart, offset, status.getLen());
                            byte[] buffer = new byte[COPY_BUFFER_SIZE];
    
                            String tmpFileName = seenFileNamePart + TMP_EXTENSION;
                            FSDataOutputStream fsOutput = streamsCache.get(tmpFileName);
                            while (inputStream.getPos() < offset) {
                                long remainingBytes = offset - inputStream.getPos();
                                int bytesToWrite = remainingBytes < COPY_BUFFER_SIZE ? (int) remainingBytes
                                        : COPY_BUFFER_SIZE;
                                inputStream.read(buffer);
                                fsOutput.write(buffer, 0, bytesToWrite);
                            }
    
                            flush(fsOutput);
                            FileContext fileContext = FileContext.getFileContext(fs.getUri());
                            String tempTmpFilePath = getPartFileNamePri(filePath + File.separator + tmpFileName);
    
                            Path tmpFilePath = new Path(tempTmpFilePath);
                            tmpFilePath = fs.getFileStatus(tmpFilePath).getPath();
                            LOG.debug("temp file path {}, rolling file path {}", tmpFilePath.toString(),
                                    status.getPath().toString());
                            fileContext.rename(tmpFilePath, status.getPath(), Options.Rename.OVERWRITE);
                        }
                    }
                }
            }
    
            //delete the left over future rolling files produced from the previous crashed instance
            //of this operator.
            if (rollingFile) {
                for (String seenFileName : endOffsets.keySet()) {
                    try {
                        Integer part = openPart.get(seenFileName).getValue() + 1;
    
                        while (true) {
                            Path seenPartFilePath = new Path(filePath + "/" + getPartFileName(seenFileName, part));
                            if (!fs.exists(seenPartFilePath)) {
                                break;
                            }
    
                            fs.delete(seenPartFilePath, true);
                            part = part + 1;
                        }
    
                        Path seenPartFilePath = new Path(filePath + "/"
                                + getPartFileName(seenFileName, openPart.get(seenFileName).intValue()));
    
                        //Handle the case when restoring to a checkpoint where the current rolling file
                        //already has a length greater than max length.
                        if (fs.getFileStatus(seenPartFilePath).getLen() > maxLength) {
                            LOG.debug("rotating file at setup.");
                            rotate(seenFileName);
                        }
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    } catch (ExecutionException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
    
            LOG.debug("setup completed");
            LOG.debug("end-offsets {}", endOffsets);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }
    
        this.context = context;
        lastTimeStamp = System.currentTimeMillis();
    
        fileCounters.setCounter(Counters.TOTAL_BYTES_WRITTEN, new MutableLong());
        fileCounters.setCounter(Counters.TOTAL_TIME_ELAPSED, new MutableLong());
    }
    

    From source file:com.datatorrent.stram.FSRecoveryHandler.java

    License:Apache License

    @Override
    public Object restore() throws IOException {
        FileContext fc = FileContext.getFileContext(fs.getUri());
    
        // recover from wherever it was left
        if (fc.util().exists(snapshotBackupPath)) {
            LOG.warn("Incomplete checkpoint, reverting to {}", snapshotBackupPath);
            fc.rename(snapshotBackupPath, snapshotPath, Rename.OVERWRITE);
    
            // combine logs (w/o append, create new file)
            Path tmpLogPath = new Path(basedir, "log.combined");
            FSDataOutputStream fsOut = fc.create(tmpLogPath, EnumSet.of(CreateFlag.CREATE, CreateFlag.OVERWRITE));
            try {/*from   w w w.  j  a v a  2  s  . c o  m*/
                FSDataInputStream fsIn = fc.open(logBackupPath);
                try {
                    IOUtils.copy(fsIn, fsOut);
                } finally {
                    fsIn.close();
                }
    
                fsIn = fc.open(logPath);
                try {
                    IOUtils.copy(fsIn, fsOut);
                } finally {
                    fsIn.close();
                }
            } finally {
                fsOut.close();
            }
    
            fc.rename(tmpLogPath, logPath, Rename.OVERWRITE);
            fc.delete(logBackupPath, false);
        } else {
            // we have log backup, but no checkpoint backup
            // failure between log rotation and writing checkpoint
            if (fc.util().exists(logBackupPath)) {
                LOG.warn("Found {}, did checkpointing fail?", logBackupPath);
                fc.rename(logBackupPath, logPath, Rename.OVERWRITE);
            }
        }
    
        if (!fc.util().exists(snapshotPath)) {
            LOG.debug("No existing checkpoint.");
            return null;
        }
    
        LOG.debug("Reading checkpoint {}", snapshotPath);
        InputStream is = fc.open(snapshotPath);
        // indeterministic class loading behavior
        // http://stackoverflow.com/questions/9110677/readresolve-not-working-an-instance-of-guavas-serializedform-appears
        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
        ObjectInputStream ois = new ObjectInputStream(is) {
            @Override
            protected Class<?> resolveClass(ObjectStreamClass objectStreamClass)
                    throws IOException, ClassNotFoundException {
                return Class.forName(objectStreamClass.getName(), true, loader);
            }
        };
        //ObjectInputStream ois = new ObjectInputStream(is);
        try {
            return ois.readObject();
        } catch (ClassNotFoundException cnfe) {
            throw new IOException("Failed to read checkpointed state", cnfe);
        } finally {
            ois.close();
        }
    }
    

    From source file:org.apache.gobblin.util.HadoopUtils.java

    License:Apache License

    /**
     * A wrapper around {@link FileContext#rename(Path, Path, Options.Rename...)}}.
     *//*  w  w  w.ja v a 2s  .  co m*/
    public static void renamePath(FileContext fc, Path oldName, Path newName, boolean overwrite)
            throws IOException {
        Options.Rename renameOptions = (overwrite) ? Options.Rename.OVERWRITE : Options.Rename.NONE;
        fc.rename(oldName, newName, renameOptions);
    }