Uploaded image for project: 'Hadoop Map/Reduce'
  1. Hadoop Map/Reduce
  2. MAPREDUCE-7059

Downward Compatibility issue: MR job fails because of unknown setErasureCodingPolicy method from 3.x client to HDFS 2.x cluster

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 3.0.0
    • Fix Version/s: 3.1.0, 3.0.3
    • Component/s: job submission
    • Labels:
      None
    • Target Version/s:
    • Hadoop Flags:
      Reviewed

      Description

      Running teragen failed in the version of hadoop-3.1, and hdfs server is 2.8.

      bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0-SNAPSHOT.jar  teragen  100000 /teragen
      

      The reason of failing is 2.8 HDFS does not have setErasureCodingPolicy.

      one solution is parsing RemoteException in JobResourceUploader#disableErasure like this:

      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);
            }
          }
        }
      

      Does anyone have better solution?

      The detailed exception trace is:

      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)
      

        Attachments

        1. MAPREDUCE-7059.006.patch
          3 kB
          Jiandan Yang
        2. MAPREDUCE-7059.005.patch
          2 kB
          Jiandan Yang
        3. MAPREDUCE-7059.004.patch
          2 kB
          Jiandan Yang
        4. MAPREDUCE-7059.003.patch
          2 kB
          Jiandan Yang
        5. MAPREDUCE-7059.002.patch
          2 kB
          Jiandan Yang
        6. MAPREDUCE-7059.001.patch
          2 kB
          Jiandan Yang

          Issue Links

            Activity

              People

              • Assignee:
                yangjiandan Jiandan Yang
                Reporter:
                yangjiandan Jiandan Yang
              • Votes:
                0 Vote for this issue
                Watchers:
                7 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: