[ 
https://issues.apache.org/jira/browse/MAPREDUCE-7059?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16378302#comment-16378302
 ] 

Weiwei Yang commented on MAPREDUCE-7059:
----------------------------------------

Thanks [~yangjiandan] for reporting this,  I have increased the severity to 
critical. We need to maintain downward compatibility as much as possible, lets 
try to get this into 3.1.0 release.

Regarding the fix, I agree with [~jlowe], probably the best thing we can do for 
now is what you did in the patch. A few minor comments

1. Replace  
e.getClassName().equals(RpcNoSuchMethodException.class.getName())
with
RpcNoSuchMethodException.class.getName().equals(e.getClassName())
which is more friendly for NPE check.

2. Remove the argument {{FileSystem fs}} of {{disableErasureCodingForPath}}, I 
know this is not introduced by this patch, but as it is not used, lets fix it 
too.

3. I feel we will always see the warning message as long as using HDFS 3.x 
client to access HDFS 2.x cluster, can we use DEBUG level to print the 
messages? And the message, is it better to say: "Ignore disabling erasure 
coding for path ... because method disableErasureCodingForPath doesn't exist, 
probably talking to a lower version HDFS."

Thanks.

> Compatibility issue: job submission fails with RpcNoSuchMethodException when 
> submitting to 2.x cluster
> ------------------------------------------------------------------------------------------------------
>
>                 Key: MAPREDUCE-7059
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-7059
>             Project: Hadoop Map/Reduce
>          Issue Type: Bug
>          Components: job submission
>    Affects Versions: 3.0.0
>            Reporter: Jiandan Yang 
>            Priority: Critical
>         Attachments: MAPREDUCE-7059.001.patch, MAPREDUCE-7059.002.patch, 
> MAPREDUCE-7059.003.patch, MAPREDUCE-7059.004.patch, MAPREDUCE-7059.005.patch
>
>
> Running teragen failed in the version of hadoop-3.1, and hdfs server is 2.8.
> {code:java}
> bin/hadoop jar 
> share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0-SNAPSHOT.jar  teragen  
> 100000 /teragen
> {code}
> The reason of failing is 2.8 HDFS does not have setErasureCodingPolicy.
> one  solution is parsing RemoteException in 
> JobResourceUploader#disableErasure like this:
> {code:java}
> private void disableErasureCodingForPath(FileSystem fs, Path path)
>       throws IOException {
>     try {
>       if (jtFs instanceof DistributedFileSystem) {
>         LOG.info("Disabling Erasure Coding for path: " + path);
>         DistributedFileSystem dfs = (DistributedFileSystem) jtFs;
>         dfs.setErasureCodingPolicy(path,
>             SystemErasureCodingPolicies.getReplicationPolicy().getName());
>       }
>     } catch (RemoteException e) {
>       if (!e.getClassName().equals(RpcNoSuchMethodException.class.getName())) 
> {
>         throw e;
>       } else {
>         LOG.warn(
>             "hdfs server does not have method disableErasureCodingForPath," 
>                 + " and skip disableErasureCodingForPath", e);
>       }
>     }
>   }
> {code}
> Does anyone have better solution?
> The detailed exception trace is:
> {code:java}
> 2018-02-26 11:22:53,178 INFO mapreduce.JobSubmitter: Cleaning up the staging 
> area /tmp/hadoop-yarn/staging/hadoop/.staging/job_1518615699369_0006
> org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RpcNoSuchMethodException):
>  Unknown method setErasureCodingPolicy called on 
> org.apache.hadoop.hdfs.protocol.ClientProtocol protocol.
>       at 
> org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:436)
>       at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989)
>       at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:846)
>       at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:789)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at javax.security.auth.Subject.doAs(Subject.java:422)
>       at 
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1804)
>       at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2457)
>       at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1491)
>       at org.apache.hadoop.ipc.Client.call(Client.java:1437)
>       at org.apache.hadoop.ipc.Client.call(Client.java:1347)
>       at 
> org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)
>       at 
> org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
>       at com.sun.proxy.$Proxy11.setErasureCodingPolicy(Unknown Source)
>       at 
> org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.setErasureCodingPolicy(ClientNamenodeProtocolTranslatorPB.java:1583)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:498)
>       at 
> org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:422)
>       at 
> org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:165)
>       at 
> org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:157)
>       at 
> org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
>       at 
> org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:359)
>       at com.sun.proxy.$Proxy12.setErasureCodingPolicy(Unknown Source)
>       at 
> org.apache.hadoop.hdfs.DFSClient.setErasureCodingPolicy(DFSClient.java:2678)
>       at 
> org.apache.hadoop.hdfs.DistributedFileSystem$63.doCall(DistributedFileSystem.java:2665)
>       at 
> org.apache.hadoop.hdfs.DistributedFileSystem$63.doCall(DistributedFileSystem.java:2662)
>       at 
> org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
>       at 
> org.apache.hadoop.hdfs.DistributedFileSystem.setErasureCodingPolicy(DistributedFileSystem.java:2680)
>       at 
> org.apache.hadoop.mapreduce.JobResourceUploader.disableErasureCodingForPath(JobResourceUploader.java:882)
>       at 
> org.apache.hadoop.mapreduce.JobResourceUploader.uploadResourcesInternal(JobResourceUploader.java:174)
>       at 
> org.apache.hadoop.mapreduce.JobResourceUploader.uploadResources(JobResourceUploader.java:131)
>       at 
> org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:102)
>       at 
> org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:197)
>       at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1570)
>       at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1567)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at javax.security.auth.Subject.doAs(Subject.java:422)
>       at 
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1965)
>       at org.apache.hadoop.mapreduce.Job.submit(Job.java:1567)
>       at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1588)
>       at org.apache.hadoop.examples.terasort.TeraGen.run(TeraGen.java:304)
>       at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
>       at org.apache.hadoop.examples.terasort.TeraGen.main(TeraGen.java:308)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:498)
>       at 
> org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
>       at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
>       at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:498)
>       at org.apache.hadoop.util.RunJar.run(RunJar.java:304)
>       at org.apache.hadoop.util.RunJar.main(RunJar.java:218)
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to