HBASE-27670 Improve FSUtils to directly obtain FSDataOutputStream (#5064)
Co-authored-by: alanzhao <alanzhao@126.com> Signed-off-by: Duo Zhang <zhangduo@apache.org>
This commit is contained in:
parent
d2b0074f7a
commit
59fdaa28f7
|
@ -85,7 +85,6 @@ import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
|
|||
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
|
||||
import org.apache.hadoop.io.IOUtils;
|
||||
import org.apache.hadoop.ipc.RemoteException;
|
||||
import org.apache.hadoop.util.Progressable;
|
||||
import org.apache.yetus.audience.InterfaceAudience;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -198,27 +197,20 @@ public final class FSUtils {
|
|||
if (fs instanceof HFileSystem) {
|
||||
FileSystem backingFs = ((HFileSystem) fs).getBackingFs();
|
||||
if (backingFs instanceof DistributedFileSystem) {
|
||||
// Try to use the favoredNodes version via reflection to allow backwards-
|
||||
// compatibility.
|
||||
short replication = Short.parseShort(conf.get(ColumnFamilyDescriptorBuilder.DFS_REPLICATION,
|
||||
String.valueOf(ColumnFamilyDescriptorBuilder.DEFAULT_DFS_REPLICATION)));
|
||||
try {
|
||||
return (FSDataOutputStream) (DistributedFileSystem.class
|
||||
.getDeclaredMethod("create", Path.class, FsPermission.class, boolean.class, int.class,
|
||||
short.class, long.class, Progressable.class, InetSocketAddress[].class)
|
||||
.invoke(backingFs, path, perm, true, CommonFSUtils.getDefaultBufferSize(backingFs),
|
||||
replication > 0 ? replication : CommonFSUtils.getDefaultReplication(backingFs, path),
|
||||
CommonFSUtils.getDefaultBlockSize(backingFs, path), null, favoredNodes));
|
||||
} catch (InvocationTargetException ite) {
|
||||
// Function was properly called, but threw it's own exception.
|
||||
throw new IOException(ite.getCause());
|
||||
} catch (NoSuchMethodException e) {
|
||||
LOG.debug("DFS Client does not support most favored nodes create; using default create");
|
||||
LOG.trace("Ignoring; use default create", e);
|
||||
} catch (IllegalArgumentException | SecurityException | IllegalAccessException e) {
|
||||
LOG.debug("Ignoring (most likely Reflection related exception) " + e);
|
||||
DistributedFileSystem.HdfsDataOutputStreamBuilder builder =
|
||||
((DistributedFileSystem) backingFs).createFile(path).recursive().permission(perm)
|
||||
.create();
|
||||
if (favoredNodes != null) {
|
||||
builder.favoredNodes(favoredNodes);
|
||||
}
|
||||
if (replication > 0) {
|
||||
builder.replication(replication);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
}
|
||||
return CommonFSUtils.create(fs, path, perm, true);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue