我已经使用 hadoop-credential api在 jceks 文件中配置了 s3键(访问密钥和 secret 密钥)。用于相同的命令如下:
hadoop凭证创建fs.s3a.access.key -provider jceks://hdfs@nn_hostname/tmp/s3creds_test.jceks
hadoop凭证创建fs.s3a.secret.key-提供者jceks://hdfs@nn_hostname/tmp/s3creds_test.jceks
然后,我使用beeline打开到 Spark Thrift服务器的连接,并在连接字符串中传递jceks文件路径,如下所示:
beeline -u“jdbc:hive2://主机名:10001 /; principal = hive / _HOST @?hadoop.security.credential.provider.path = jceks://hdfs@nn_hostname/tmp/s3creds_test.jceks;
现在,当我尝试使用s3中的位置创建外部表时,它失败,并出现以下异常:
如果不存在,则创建外部表test_table_on_s3(col1字符串,col2字符串)以','LOCATION's3a:// bucket_name / kalmesh /'结尾的行格式分隔字段;
异常:错误:org.apache.spark.sql.execution.QueryExecutionException:失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。 MetaException(消息:异常(exception):java.nio.file.AccessDeniedException s3a:// bucket_name / kalmesh:s3a:// bucket_name / kalmesh上的getFileStatus:com.amazonaws.services.s3.model.AmazonS3Exception:禁止(服务:Amazon S3 ;状态代码:403;错误代码:403禁止;请求ID:request_id),S3扩展请求ID:extended_request_id =)(状态=,代码= 0)
最佳答案
我认为jceks不支持fs.s3a。 secret 直到Hadoop 2.8出现。我不认为从源头上很难分辨。如果真是这样,并且您使用的是Hadoop 2.7,那么 secret 就不会被窃取。否则您将不得不将其放入配置中。