开发者社区 问答 正文

在e-mapreduce跑hadoop mr报错,com.aliyun.oss.OSSException: AccessDenied

Error: java.io.IOException: java.lang.reflect.InvocationTargetException
    at com.aliyun.fs.oss.utils.OSSClientAgent.handleException(OSSClientAgent.java:397)
    at com.aliyun.fs.oss.utils.OSSClientAgent.deleteObject(OSSClientAgent.java:217)
    at com.aliyun.fs.oss.nat.JetOssNativeFileSystemStore.delete(JetOssNativeFileSystemStore.java:391)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy14.delete(Unknown Source)
    at com.aliyun.fs.oss.nat.NativeOssFileSystem.rename(NativeOssFileSystem.java:522)
    at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitTask(FileOutputCommitter.java:445)
    at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitTask(FileOutputCommitter.java:425)
    at org.apache.hadoop.mapred.Task.commit(Task.java:1163)
    at org.apache.hadoop.mapred.Task.done(Task.java:1025)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:397)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.aliyun.fs.oss.utils.OSSClientAgent.deleteObject(OSSClientAgent.java:215)
    ... 19 more
Caused by: com.aliyun.oss.OSSException: AccessDenied
[ErrorCode]: AccessDenied
[RequestId]: 57109923941E5EA00A8CC20A
[HostId]: emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com
[ResponseError]:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>AccessDenied</Message>
  <RequestId>57109923941E5EA00A8CC20A</RequestId>
  <HostId>emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com</HostId>
</Error>
    at com.aliyun.oss.common.utils.ExceptionFactory.createOSSException(ExceptionFactory.java:99)
    at com.aliyun.oss.internal.OSSErrorResponseHandler.handle(OSSErrorResponseHandler.java:72)
    at com.aliyun.oss.common.comm.ServiceClient.handleResponse(ServiceClient.java:242)
    at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:124)
    at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67)
    at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92)
    at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140)
    at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111)
    at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:106)
    at com.aliyun.oss.internal.OSSObjectOperation.deleteObject(OSSObjectOperation.java:386)
    at com.aliyun.oss.OSSClient.deleteObject(OSSClient.java:644)
    at com.aliyun.oss.OSSClient.deleteObject(OSSClient.java:638)
    ... 24 more

展开
收起
封神 2016-04-15 15:42:11 5522 分享 版权
阿里云 AI 助理回答

问题分析

根据提供的错误堆栈信息,java.io.IOException: java.lang.reflect.InvocationTargetException 是由反射调用方法时抛出的异常。具体来说,InvocationTargetException 是由于被调用的方法内部抛出了未捕获的异常。在本例中,deleteObject 方法调用失败,根本原因是 com.aliyun.oss.OSSException: AccessDenied,即 OSS 服务拒绝了访问请求。


根本原因

  1. OSS 权限问题
    错误信息中明确指出:

    com.aliyun.oss.OSSException: AccessDenied
    [ErrorCode]: AccessDenied
    [RequestId]: 57109923941E5EA00A8CC20A
    [HostId]: emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com
    

    这表明当前用户或服务没有足够的权限执行 deleteObject 操作。可能的原因包括: - OSS Bucket 的访问控制策略(ACL)未正确配置。 - 使用的 AccessKey 或 STS Token 缺乏删除对象的权限。 - 请求的资源路径不正确,导致权限验证失败。

  2. 反射调用异常封装
    InvocationTargetException 是 Java 反射机制中的常见异常,它封装了被调用方法内部抛出的实际异常。在本例中,实际异常是 AccessDenied,需要重点解决权限问题。


解决方案

1. 检查 OSS 权限配置

  • 确认 AccessKey 权限
    确保使用的 AccessKey 或 STS Token 具有删除 OSS 对象的权限。可以通过以下步骤检查:

    1. 登录阿里云 RAM 控制台。
    2. 检查当前用户的权限策略,确保包含类似以下的权限:
      {
      "Effect": "Allow",
      "Action": [
       "oss:DeleteObject"
      ],
      "Resource": [
       "acs:oss::123456789012:emr-logs2/*"
      ]
      }
      
    3. 如果使用的是临时 STS Token,确保其权限范围覆盖目标 Bucket 和操作。
  • 检查 Bucket ACL 配置
    确认目标 Bucket 的访问控制策略允许当前用户执行删除操作。可以通过 OSS 控制台或 API 检查 Bucket 的 ACL 设置。

2. 验证请求参数

  • 检查对象路径
    确保 deleteObject 方法中传入的对象路径(Key)正确无误。如果路径错误,OSS 会返回 AccessDenied 错误。

  • 确认 Endpoint 配置
    确保使用的 OSS Endpoint 正确。例如,emr-logs2.oss-cn-hangzhou-internal.aliyuncs.com 是内网 Endpoint,适用于 VPC 环境。如果客户端不在 VPC 内,请使用公网 Endpoint。

3. 捕获并处理异常

在代码中捕获 InvocationTargetException 并提取其根本原因,便于快速定位问题。示例如下:

try {
    ossClient.deleteObject(bucketName, objectKey);
} catch (InvocationTargetException e) {
    Throwable cause = e.getCause();
    if (cause instanceof com.aliyun.oss.OSSException) {
        com.aliyun.oss.OSSException ossException = (com.aliyun.oss.OSSException) cause;
        System.err.println("OSS Error Code: " + ossException.getErrorCode());
        System.err.println("OSS Request ID: " + ossException.getRequestId());
    } else {
        e.printStackTrace();
    }
}

注意事项

  • 权限最小化原则
    在配置权限时,遵循最小化原则,仅授予必要的操作权限,避免过度授权。

  • 日志排查
    如果问题仍未解决,建议启用 OSS 的访问日志功能,记录所有请求的详细信息,便于进一步排查。

  • 网络环境检查
    如果使用内网 Endpoint,请确保客户端与 OSS 服务在同一 VPC 内。否则,切换为公网 Endpoint。


总结

通过上述分析和解决方案,可以有效解决 java.io.IOException: java.lang.reflect.InvocationTargetException 异常的根本原因。重点在于检查 OSS 权限配置、验证请求参数,并在代码中妥善处理异常。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答