alan.zhao created HBASE-27670: --------------------------------- Summary: The FSDataOutputStream is obtained without reflection mode Key: HBASE-27670 URL: https://issues.apache.org/jira/browse/HBASE-27670 Project: HBase Issue Type: Improvement Environment: HBase version: 2.2.3 Reporter: alan.zhao
hbase interacts with hdfs and obtains FSDataOutputStream to generate HFiles. In order to support favoredNodes, reflection is used. The DistributedFileSystem has a more direct way to get the FSDataOutputStream,for example:dfs.createFile(path).permission(perm).create()...; this API allows you to set various parameters, including favoredNodes. I think avoiding reflection can improve performance, and if you agree with me, I can optimize this part of the code; Model:hbase-server class:FSUtils {code:java} public static FSDataOutputStream create(Configuration conf, FileSystem fs, Path path, FsPermission perm, InetSocketAddress[] favoredNodes) throws IOException { 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));{code} -- This message was sent by Atlassian Jira (v8.20.10#820010)