使用SPARK-EMR-AWS拒绝S3文件访问

Den*_*nis 5 amazon-s3 amazon-web-services amazon-emr apache-spark

当尝试使用S3上的文件通过AWS-EMR集群上的pyspark运行Spark-MLLIB示例时遇到了一些困难。很明显,这是一个权限问题(403错误),但是在这一点上,我可以用一只手找出要看的地方。

  1. 设置IAM-我在IAM用户下创建了一个用户“ dmoccia”
  2. 我在IAM下创建了一个“ machineLearning”组,并在其中添加了“ dmoccia”
  3. 我将以下托管策略:AmazonEC2FullAccess,AmazonS3FullAccess,AmazonElasticMapReduceFullAccess,AmazonElasticMapReduceRole,AmazonElasticMapReduceForEC2Role添加到“ machineLearning”组
  4. 然后,我创建了一个存储区“ SparkTestingXYZ”,从存储区中的Spark Mllib中删除了一个示例文件(我计划使用文档中的此简单线性回归模型进行测试)
  5. 我从AWSCLI创建了EMR的默认角色

    $ aws emr create-default-roles 
    
    Run Code Online (Sandbox Code Playgroud)

    接下来,我向创建的两个角色(EMR_DefaultRole和EMR_EC2_DefaultRole)添加了以下策略:AmazonEC2FullAccess,AmazonS3FullAccess,AmazonElasticMapReduceFullAccess,AmazonElasticMapReduceRole,AmazonElasticMapReduceForEC2Role

  6. 然后,我继续并通过AWSCLI启动了一个集群

    $ aws emr create-cluster --name "Spark cluster" --release-label emr-5.0.0 --applications Name=Spark --ec2-attributes KeyName=AWS_Spark_Test --instance-type m3.xlarge --instance-count 3 --use-default-roles
    
    Run Code Online (Sandbox Code Playgroud)
  7. 然后,我通过SSH进入主服务器,启动pyspark并尝试以下代码:

     from pyspark.sql import SparkSession
     spark = SparkSession\
        .builder\
        .appName("PythonSQL")\
        .config("spark.some.config.option", "some-value")\
        .getOrCreate()
     training = spark.read.format("libsvm").load("s3://s3.amazonaws.com/SparkTestingXYZ/sample_linear_regression_data.txt")
    
    Run Code Online (Sandbox Code Playgroud)

依次输出附加的堆栈跟踪,但这是标头:

 16/08/12 17:44:19 WARN DataSource: Error while looking for metadata directory.
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib/spark/python/pyspark/sql/readwriter.py", line 147, in load
 return self._df(self._jreader.load(path))
 File "/usr/lib/spark/python/lib/py4j-0.10.1-src.zip/py4j/java_gateway.py",   line 933, in __call__
 File "/usr/lib/spark/python/pyspark/sql/utils.py", line 63, in deco
return f(*a, **kw)
 File "/usr/lib/spark/python/lib/py4j-0.10.1-src.zip/py4j/protocol.py", line 312, in get_return_value py4j.protocol.Py4JJavaError: 
 An error occurred while calling o49.load.: java.io.IOException:  com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Excepti on: 
 Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXXXXX), S3 Extended Request ID: OnI4tyk8Uun6JbD0iVnEi+kvjDfSK2U=
Run Code Online (Sandbox Code Playgroud)

从这里,我甚至在启动集群时尝试了以下方法

 $ aws emr create-cluster --name "Spark cluster" --release-label emr-5.0.0 --applications Name=Spark --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=AWS_Spark_Test --instance-type m3.xlarge --instance-count 3 
Run Code Online (Sandbox Code Playgroud)

在这一点上,我不确定需要设置哪个权限,或者我错过了一个策略。如果有人能指出正确的方向,我将不胜感激。我认为如果可以解决这个问题,我可以拨回一些完全访问策略,但是现在我希望能够读取该文件。最后一件事,我确实在同一区域(美国标准/ us-east-1)启动了两个S3 / Cluster。谢谢,如果你到目前为止做到了!