in tez-api/src/main/java/org/apache/tez/client/TezClientUtils.java [202:304]
private static boolean addLocalResources(Configuration conf,
String[] configUris, Map<String, LocalResource> tezJarResources,
Credentials credentials) throws IOException {
boolean usingTezArchive = false;
if (configUris == null || configUris.length == 0) {
return usingTezArchive;
}
List<Path> configuredPaths = Lists.newArrayListWithCapacity(configUris.length);
for (String configUri : configUris) {
URI u = null;
try {
u = new URI(configUri);
} catch (URISyntaxException e) {
throw new IOException("Unable to convert " + configUri + "to URI", e);
}
Path p = new Path(u);
FileSystem remoteFS = p.getFileSystem(conf);
p = remoteFS.resolvePath(p.makeQualified(remoteFS.getUri(),
remoteFS.getWorkingDirectory()));
LocalResourceType type = null;
//Check if path is an archive
if(p.getName().endsWith(".tar.gz") ||
p.getName().endsWith(".tgz") ||
p.getName().endsWith(".zip") ||
p.getName().endsWith(".tar")) {
type = LocalResourceType.ARCHIVE;
} else {
type = LocalResourceType.FILE;
}
RemoteIterator<LocatedFileStatus> fileStatuses = getListFilesFileStatus(configUri, conf);
while (fileStatuses.hasNext()) {
LocatedFileStatus fStatus = fileStatuses.next();
String linkName;
// If the resource is an archive, we've already done this work
if(type != LocalResourceType.ARCHIVE) {
u = fStatus.getPath().toUri();
p = new Path(u);
remoteFS = p.getFileSystem(conf);
p = remoteFS.resolvePath(p.makeQualified(remoteFS.getUri(),
remoteFS.getWorkingDirectory()));
if(null != u.getFragment()) {
LOG.warn("Fragment set for link being interpreted as a file, URI: {}", u);
}
}
// Add URI fragment or just the filename
Path name = new Path((null == u.getFragment())
? p.getName()
: u.getFragment());
if (name.isAbsolute()) {
throw new IllegalArgumentException("Resource name must be "
+ "relative, not absolute: " + name
+ " in URI: " + u.toString());
}
URL url = ConverterUtils.getYarnUrlFromURI(p.toUri());
linkName = name.toUri().getPath();
// For legacy reasons, set archive to tezlib if there is
// only a single archive and no fragment
if(type == LocalResourceType.ARCHIVE &&
configUris.length == 1 && null == u.getFragment()) {
linkName = TezConstants.TEZ_TAR_LR_NAME;
usingTezArchive = true;
}
LocalResourceVisibility lrVisibility;
if (checkAncestorPermissionsForAllUsers(conf, p,
FsAction.EXECUTE) &&
fStatus.getPermission().getOtherAction().implies(FsAction.READ)) {
lrVisibility = LocalResourceVisibility.PUBLIC;
} else {
lrVisibility = LocalResourceVisibility.PRIVATE;
}
if (tezJarResources.containsKey(linkName)) {
String message = "Duplicate resource found"
+ ", resourceName=" + linkName
+ ", existingPath=" +
tezJarResources.get(linkName).getResource().toString()
+ ", newPath=" + fStatus.getPath();
LOG.warn(message);
}
tezJarResources.put(linkName,
LocalResource.newInstance(
url,
type,
lrVisibility,
fStatus.getLen(),
fStatus.getModificationTime()));
configuredPaths.add(fStatus.getPath());
}
}
// Obtain credentials.
if (!configuredPaths.isEmpty()) {
TokenCache.obtainTokensForFileSystems(credentials,
configuredPaths.toArray(new Path[configuredPaths.size()]), conf);
}
return usingTezArchive;
}