List of usage examples for org.apache.hadoop.fs Path getParent
public Path getParent()
From source file:com.streamsets.pipeline.stage.destination.hdfs.metadataexecutor.HdfsMetadataExecutor.java
License:Apache License
@Override public void write(Batch batch) throws StageException { final ELVars variables = getContext().createELVars(); final FileSystem fs = hdfsConnection.getFs(); Iterator<Record> it = batch.getRecords(); while (it.hasNext()) { Record record = it.next();/* w w w.j a v a 2 s.c o m*/ RecordEL.setRecordInContext(variables, record); // Execute all configured HDFS metadata operations as target user try { hdfsConnection.getUGI().doAs((PrivilegedExceptionAction<Void>) () -> { Path workingFile = new Path(evaluate(variables, "filePath", actions.filePath)); LOG.info("Working on file: " + workingFile); // Create empty file if configured if (actions.taskType == TaskType.CREATE_EMPTY_FILE) { ensureDirectoryExists(fs, workingFile.getParent()); if (!fs.createNewFile(workingFile)) { throw new IOException("Can't create file (probably already exists): " + workingFile); } } if (actions.taskType == TaskType.CHANGE_EXISTING_FILE && (actions.shouldMoveFile || actions.shouldRename)) { Path newPath = workingFile.getParent(); String newName = workingFile.getName(); if (actions.shouldMoveFile) { newPath = new Path(evaluate(variables, "newLocation", actions.newLocation)); } if (actions.shouldRename) { newName = evaluate(variables, "newName", actions.newName); } Path destinationFile = new Path(newPath, newName); ensureDirectoryExists(fs, newPath); LOG.debug("Renaming to: {}", destinationFile); if (!fs.rename(workingFile, destinationFile)) { throw new IOException( Utils.format("Can't rename '{}' to '{}''", workingFile, destinationFile)); } workingFile = destinationFile; } if (actions.taskType.isOneOf(TaskType.CHANGE_EXISTING_FILE, TaskType.CREATE_EMPTY_FILE)) { if (actions.shouldChangeOwnership) { String newOwner = evaluate(variables, "newOwner", actions.newOwner); String newGroup = evaluate(variables, "newGroup", actions.newGroup); LOG.debug("Applying ownership: user={} and group={}", newOwner, newGroup); fs.setOwner(workingFile, newOwner, newGroup); } if (actions.shouldSetPermissions) { String stringPerms = evaluate(variables, "newPermissions", actions.newPermissions); FsPermission fsPerms = HdfsUtils.parseFsPermission(stringPerms); LOG.debug("Applying permissions: {} loaded from value '{}'", fsPerms, stringPerms); fs.setPermission(workingFile, fsPerms); } if (actions.shouldSetAcls) { String stringAcls = evaluate(variables, "newAcls", actions.newAcls); List<AclEntry> acls = AclEntry.parseAclSpec(stringAcls, true); LOG.debug("Applying ACLs: {}", stringAcls); fs.setAcl(workingFile, acls); } } if (actions.taskType == TaskType.REMOVE_FILE) { fs.delete(workingFile, true); } // Issue event with the final file name (e.g. the renamed one if applicable) actions.taskType.getEventCreator().create(getContext()).with("filepath", workingFile.toString()) .with("filename", workingFile.getName()).createAndSend(); LOG.debug("Done changing metadata on file: {}", workingFile); return null; }); } catch (Throwable e) { // Hadoop libraries will wrap any non InterruptedException, RuntimeException, Error or IOException to UndeclaredThrowableException, // so we manually unwrap it here and properly propagate it to user. if (e instanceof UndeclaredThrowableException) { e = e.getCause(); } LOG.error("Failure when applying metadata changes to HDFS", e); errorRecordHandler.onError( new OnRecordErrorException(record, HdfsMetadataErrors.HDFS_METADATA_000, e.getMessage())); } } }
From source file:com.streamsets.pipeline.stage.destination.hdfs.metadataxecutor.HdfsMetadataExecutor.java
License:Apache License
@Override public void write(Batch batch) throws StageException { final ELVars variables = getContext().createELVars(); final FileSystem fs = hdfsConnection.getFs(); Iterator<Record> it = batch.getRecords(); while (it.hasNext()) { Record record = it.next();/*ww w . j a va 2 s.c o m*/ RecordEL.setRecordInContext(variables, record); // Execute all configured HDFS metadata operations as target user try { hdfsConnection.getUGI().doAs(new PrivilegedExceptionAction<Void>() { @Override public Void run() throws Exception { Path workingFile = new Path(evaluate(variables, "filePath", actions.filePath)); LOG.info("Working on file: " + workingFile); if (actions.shouldMoveFile) { Path destinationFile = new Path( evaluate(variables, "newLocation", actions.newLocation)); Path destinationParent = destinationFile.getParent(); if (!fs.exists(destinationParent)) { LOG.debug("Creating parent directory for destination file: {}", destinationParent); if (!fs.mkdirs(destinationParent)) { throw new IOException("Can't create directory: " + destinationParent); } } LOG.debug("Renaming to: {}", destinationFile); if (!fs.rename(workingFile, destinationFile)) { throw new IOException("Can't rename file to: " + destinationFile); } workingFile = destinationFile; } if (actions.shouldChangeOwnership) { String newOwner = evaluate(variables, "newOwner", actions.newOwner); String newGroup = evaluate(variables, "newGroup", actions.newGroup); LOG.debug("Applying ownership: user={} and group={}", newOwner, newGroup); fs.setOwner(workingFile, newOwner, newGroup); } if (actions.shouldSetPermissions) { String stringPerms = evaluate(variables, "newPermissions", actions.newPermissions); FsPermission fsPerms = new FsPermission(stringPerms); LOG.debug("Applying permissions: {} loaded from value '{}'", fsPerms, stringPerms); fs.setPermission(workingFile, fsPerms); } if (actions.shouldSetAcls) { String stringAcls = evaluate(variables, "newAcls", actions.newAcls); List<AclEntry> acls = AclEntry.parseAclSpec(stringAcls, true); LOG.debug("Applying ACLs: {}", stringAcls); fs.setAcl(workingFile, acls); } // Issue event with the final file name (e.g. the renamed one if applicable) EventRecord event = getContext().createEventRecord("file-changed", 1); event.set(Field.create(Field.Type.MAP, new ImmutableMap.Builder<String, Field>() .put("filepath", Field.create(Field.Type.STRING, workingFile.toString())).build())); getContext().toEvent(event); LOG.debug("Done changing metadata on file: {}", workingFile); return null; } }); } catch (Exception e) { LOG.error("Failure when applying metadata changes to HDFS", e); errorRecordHandler.onError( new OnRecordErrorException(record, HdfsMetadataErrors.HDFS_METADATA_000, e.getMessage())); } } }
From source file:com.streamsets.pipeline.stage.destination.hdfs.writer.DefaultFsHelper.java
License:Apache License
@Override public Path renameAndGetPath(FileSystem fs, Path tempPath) throws IOException, StageException { Path finalPath = new Path(tempPath.getParent(), (StringUtils.isEmpty(uniquePrefix) ? "" : (uniquePrefix + "_")) + UUID.randomUUID().toString() + recordWriterManager.getExtension()); if (!fs.rename(tempPath, finalPath)) { throw new IOException(Utils.format("Could not rename '{}' to '{}'", tempPath, finalPath)); }//from www . j a v a 2 s.c o m // Store closed path so that we can generate event for it later closedPaths.add(finalPath); return finalPath; }
From source file:com.streamsets.pipeline.stage.destination.hdfs.writer.RecordWriterManager.java
License:Apache License
Path renameToFinalName(FileSystem fs, Path tempPath) throws IOException { Path parent = tempPath.getParent(); Path finalPath = new Path(parent, uniquePrefix + "_" + UUID.randomUUID().toString() + getExtension()); if (!fs.rename(tempPath, finalPath)) { throw new IOException(Utils.format("Could not rename '{}' to '{}'", tempPath, finalPath)); }/*from w ww .ja v a 2 s . co m*/ return finalPath; }
From source file:com.streamsets.pipeline.stage.destination.hdfs.writer.TestRecordWriterManager.java
License:Apache License
@Test public void testGetWriter() throws Exception { URI uri = new URI("file:///"); Configuration conf = new HdfsConfiguration(); final String prefix = "prefix"; String template = getTestDir().toString() + "/${YYYY()}/${MM()}/${DD()}/${hh()}/${mm()}/${ss()}/${record:value('/')}"; TimeZone timeZone = TimeZone.getTimeZone("UTC"); long cutOffSecs = 10; long cutOffSize = 5; long cutOffRecords = 2; HdfsFileType fileType = HdfsFileType.TEXT; DefaultCodec compressionCodec = new DefaultCodec(); compressionCodec.setConf(conf);//from ww w.j a v a 2s .co m SequenceFile.CompressionType compressionType = null; String keyEL = null; DataGeneratorFactory generatorFactory = new DummyDataGeneratorFactory(null); RecordWriterManager mgr = new RecordWriterManager(uri, conf, prefix, template, timeZone, cutOffSecs, cutOffSize, cutOffRecords, fileType, compressionCodec, compressionType, keyEL, generatorFactory, targetContext, "dirPathTemplate"); Assert.assertTrue(mgr.validateDirTemplate("g", "dirPathTemplate", new ArrayList<Stage.ConfigIssue>())); FileSystem fs = FileSystem.get(uri, conf); Date now = getFixedDate(); // record older than cut off Date recordDate = new Date(now.getTime() - 10 * 1000 - 1); Record record = RecordCreator.create(); record.set(Field.create("a")); Assert.assertNull(mgr.getWriter(now, recordDate, record)); // record qualifies, first file recordDate = new Date(now.getTime() - 10 * 1000 + 1); RecordWriter writer = mgr.getWriter(now, recordDate, record); Assert.assertNotNull(writer); Path tempPath = writer.getPath(); Assert.assertEquals(mgr.getPath(recordDate, record), tempPath); Path finalPath = mgr.commitWriter(writer); //committing a closed writer is a NOP Assert.assertNull(mgr.commitWriter(writer)); Assert.assertEquals(1, getFinalFileNameCount(fs, tempPath.getParent(), prefix)); // record qualifies, second file writer = mgr.getWriter(now, recordDate, record); finalPath = mgr.commitWriter(writer); Assert.assertEquals(2, getFinalFileNameCount(fs, tempPath.getParent(), prefix)); // record qualifies, leaving temp file writer = mgr.getWriter(now, recordDate, record); writer.close(); // record qualifies, it should roll temp file and create 4th file writer = mgr.getWriter(now, recordDate, record); finalPath = mgr.commitWriter(writer); Assert.assertFalse(fs.exists(tempPath)); Assert.assertEquals(4, getFinalFileNameCount(fs, tempPath.getParent(), prefix)); // verifying thresholds because of record count writer = mgr.getWriter(now, recordDate, record); Assert.assertFalse(mgr.isOverThresholds(writer)); writer.write(record); writer.flush(); Assert.assertFalse(mgr.isOverThresholds(writer)); writer.write(record); writer.flush(); Assert.assertTrue(mgr.isOverThresholds(writer)); writer.write(record); mgr.commitWriter(writer); // verifying thresholds because of file size writer = mgr.getWriter(now, recordDate, record); Assert.assertFalse(mgr.isOverThresholds(writer)); record.set(Field.create("0123456789012345678901234567890123456789012345678901234567890123456789")); writer.write(record); writer.flush(); Assert.assertTrue(mgr.isOverThresholds(writer)); mgr.commitWriter(writer); }
From source file:com.streamsets.pipeline.stage.destination.hdfs.writer.WholeFileFormatFsHelper.java
License:Apache License
private Path getRenamablePath(FileSystem fs, Path tempPath) throws IOException, OnRecordErrorException { String finalFileName = tempPath.getName().replaceFirst(RecordWriterManager.TMP_FILE_PREFIX, ""); Path finalPath = new Path(tempPath.getParent(), finalFileName); //Checks during rename. checkAndHandleWholeFileExistence(fs, finalPath); return finalPath; }
From source file:com.toy.TOYMaster.java
License:Apache License
void clean() { // TODO : clean HDFS ! Path pathSuffix = new Path(System.getenv().get(Constants.TOMCAT_LIBS)); LOG.info("Clean directory {}", pathSuffix); try {/*from w w w . ja v a2s .com*/ // Sanity check before calling delete(..) if ("toy".equals(pathSuffix.getParent().getName())) fs.delete(pathSuffix, true); } catch (IOException e) { LOG.error("Error while cleaning HDFS directory {}", pathSuffix, e); } }
From source file:com.trace.hadoop.TestDFSRename.java
License:Apache License
public void testRename() throws Exception { FileSystem fs = cluster.getFileSystem(); assertTrue(fs.mkdirs(dir));// w ww . j ava 2s . c o m { //test lease Path a = new Path(dir, "a"); Path aa = new Path(dir, "aa"); Path b = new Path(dir, "b"); createFile(fs, a); //should not have any lease assertEquals(0, countLease(cluster)); createFile(fs, aa); DataOutputStream aa_out = fs.create(aa); aa_out.writeBytes("something"); //should have 1 lease assertEquals(1, countLease(cluster)); list(fs, "rename0"); fs.rename(a, b); list(fs, "rename1"); aa_out.writeBytes(" more"); aa_out.close(); list(fs, "rename2"); //should not have any lease assertEquals(0, countLease(cluster)); } { // test non-existent destination Path dstPath = new Path("/c/d"); assertFalse(fs.exists(dstPath)); assertFalse(fs.rename(dir, dstPath)); } { // dst cannot be a file or directory under src // test rename /a/b/foo to /a/b/c Path src = new Path("/a/b"); Path dst = new Path("/a/b/c"); createFile(fs, new Path(src, "foo")); // dst cannot be a file under src assertFalse(fs.rename(src, dst)); // dst cannot be a directory under src assertFalse(fs.rename(src.getParent(), dst.getParent())); } { // dst can start with src, if it is not a directory or file under src // test rename /test /testfile Path src = new Path("/testPrefix"); Path dst = new Path("/testPrefixfile"); createFile(fs, src); assertTrue(fs.rename(src, dst)); } { // dst should not be same as src test rename /a/b/c to /a/b/c Path src = new Path("/a/b/c"); createFile(fs, src); assertTrue(fs.rename(src, src)); assertFalse(fs.rename(new Path("/a/b"), new Path("/a/b/"))); assertTrue(fs.rename(src, new Path("/a/b/c/"))); } fs.delete(dir, true); }
From source file:com.trace.hadoop.TestDFSRename.java
License:Apache License
public void testRenameWithQuota() throws Exception { DistributedFileSystem fs = (DistributedFileSystem) cluster.getFileSystem(); Path src1 = new Path(dir, "testRenameWithQuota/srcdir/src1"); Path src2 = new Path(dir, "testRenameWithQuota/srcdir/src2"); Path dst1 = new Path(dir, "testRenameWithQuota/dstdir/dst1"); Path dst2 = new Path(dir, "testRenameWithQuota/dstdir/dst2"); createFile(fs, src1);// w w w. ja v a2s . c o m createFile(fs, src2); fs.setQuota(src1.getParent(), FSConstants.QUOTA_DONT_SET, FSConstants.QUOTA_DONT_SET); fs.mkdirs(dst1.getParent()); fs.setQuota(dst1.getParent(), FSConstants.QUOTA_DONT_SET, FSConstants.QUOTA_DONT_SET); // Test1: src does not exceed quota and dst has quota to accommodate rename rename(src1, dst1, true, false); // Test2: src does not exceed quota and dst has *no* quota to accommodate // rename fs.setQuota(dst1.getParent(), 1, FSConstants.QUOTA_DONT_SET); rename(src2, dst2, false, true); // Test3: src exceeds quota and dst has *no* quota to accommodate rename fs.setQuota(src1.getParent(), 1, FSConstants.QUOTA_DONT_SET); rename(dst1, src1, false, true); }
From source file:com.trace.hadoop.TestDFSRename.java
License:Apache License
/** * Perform operations such as setting quota, deletion of files, rename and * ensure system can apply edits log during startup. *//* w w w . j a v a 2 s .co m*/ public void testEditsLog() throws Exception { DistributedFileSystem fs = (DistributedFileSystem) cluster.getFileSystem(); Path src1 = new Path(dir, "testEditsLog/srcdir/src1"); Path dst1 = new Path(dir, "testEditsLog/dstdir/dst1"); createFile(fs, src1); fs.mkdirs(dst1.getParent()); createFile(fs, dst1); // Set quota so that dst1 parent cannot allow under it new files/directories fs.setQuota(dst1.getParent(), 2, FSConstants.QUOTA_DONT_SET); // Free up quota for a subsequent rename fs.delete(dst1, true); rename(src1, dst1, true, false); // Restart the cluster and ensure the above operations can be // loaded from the edits log restartCluster(); fs = (DistributedFileSystem) cluster.getFileSystem(); assertFalse(fs.exists(src1)); // ensure src1 is already renamed assertTrue(fs.exists(dst1)); // ensure rename dst exists }