From f1e970d3d4dbb25babdb6080de3a485269e51056 Mon Sep 17 00:00:00 2001 From: "alan.zhao" <30570711+haohao0103@users.noreply.github.com> Date: Sat, 4 Mar 2023 21:46:45 +0800 Subject: [PATCH] HBASE-27670 Improve FSUtils to directly obtain FSDataOutputStream (#5064) Co-authored-by: alanzhao Signed-off-by: Duo Zhang (cherry picked from commit 59fdaa28f726dcd65fbfb58f9ea6aa499f2a903c) --- .../org/apache/hadoop/hbase/util/FSUtils.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java index 6e4fb8a91f3..728a46b51a4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/FSUtils.java @@ -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.hadoop.util.StringUtils; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; @@ -199,27 +198,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); }