我已使用 hadoop-credential api在 jceks 文件中配置了 s3键(访问密钥和密钥)。用于相同的命令如下:
hadoop凭证创建fs.s3a.access.key -provider jceks://hdfs@nn_hostname/tmp/s3creds_test.jceks
hadoop凭证创建fs.s3a.secret.key -provider jceks://hdfs@nn_hostname/tmp/s3creds_test.jceks
然后,我使用beeline打开与 Spark Thrift Server 的连接,并在连接字符串中传递jceks文件路径,如下所示:
beeline -u“jdbc:hive2:// hostname:10001 /; principal = hive / _HOST @?hadoop.security.credential.provider.path = jceks:// hdfs @nn_hostname / tmp / s3creds_test。 JCEKS;
现在,当我尝试使用s3中的位置创建外部表时,它失败并出现以下异常:
CREATE EXTERNAL TABLE IF NOT NOT EXISTS test_table_on_s3(col1 String,col2 String)行格式分隔的字段以','LOCATION's3a:// bucket_name / kalmesh /';
终止例外:错误:org.apache.spark.sql.execution.QueryExecutionException:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。 MetaException(消息:异常:java.nio.file.AccessDeniedException s3a:// bucket_name / kalmesh:s3a上的getFileStatus:// bucket_name / kalmesh:com.amazonaws.services.s3.model.AmazonS3Exception:Forbidden(Service:Amazon S3) ;状态代码:403;错误代码:403禁止;请求ID:request_id),S3扩展请求ID:extended_request_id =)(state =,code = 0)
答案 0 :(得分:0)
我认为jceks不支持fs.s3a。秘密一直持续到Hadoop 2.8。我不想;从消息来源很难说。如果是这种情况,并且您正在使用Hadoop 2.7,那么秘密就不会被接受。害怕你必须把它放在配置中。
答案 1 :(得分:0)
我有类似的情况,只是使用Drill而不是Hive。但就像你的情况一样:
...并且 AmazonS3Exception:拒绝访问。
在我的情况下(也许在你的情况下),异常描述有点含糊不清。报告的 AmazonS3Exception:拒绝访问并非来自 S3 ,而是来自 KMS !我用于加密的密钥被拒绝访问。用户进行API调用不在密钥的用户列表中 - 一旦我将该用户添加到密钥的列表编写开始工作,我就可以在s3a上创建加密表:// ...