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)

Reply via email to