2017-02-20 10 views
3

RunJobFlowコマンドを使用してSpark EMRクラスタをスピンアップしています。このコマンドは、AmazonElasticMapReduceforEC2RoleAmazonRedshiftReadOnlyAccessのポリシーを持つIAMロールにJobFlowRoleを設定します。最初のポリシーには、すべてのs3権限を許可するアクションが含まれています。EMR SparkがS3にデータフレームを保存できない

EC2インスタンスがスピンアップすると、このIAMロールが想定され、STS経由で一時的な資格情報が生成されます。

私が最初にすることはcom.databricks.spark.redshift形式を使用して、スパークDATAFRAMEに私の赤方偏移クラスタから表を読んで、私はEMR JobFlowRoleのために行ったように赤方偏移からデータをアンロードするために同じIAMロールを使用しています。

私が理解する限り、これはRedshiftでUNLOADコマンドを実行し、指定したS3バケットにダンプします。その後、Sparkは新しくアンロードされたデータをDataframeにロードします。 tempdirオプションには、推奨のs3n://プロトコルを使用しています。

このコマンドはうまく動作し、常にデータフレームにデータを正常にロードします。

次に、いくつかの変換を実行し、csv形式のデータフレームを同じS3バケットRedshift Unloadedに保存しようとします。私はこれを行うにしようとすると

はしかし、それは次のようなエラーに

java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3n URL, or by setting the fs.s3n.awsAccessKeyId or fs.s3n.awsSecretAccessKey properties (respectively)

オーケーをスローします。だから私はなぜこれが起こるのか分からないが、私は推奨されたhadoop設定パラメータを設定することでそれをハックしようとした。

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;

わかりました:私は、私は再びそれを実行すると、それは次のようなエラーがスローされます

spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", <CREDENTIALS_ACCESS_KEY>) spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", <CREDENTIALS_SECRET_ACCESS_KEY>)

経由AWSAccessKeyIDAWSSecretKeyをロードするためにDefaultAWSCredentialsProviderChainを使用して設定します。それはうまくいきませんでした。だから、バケットを作成しようとしました

java.lang.IllegalArgumentException: Bucket name should be between 3 and 63 characters long

:私は、私はこれを実行したとき、それは次のようなエラーを吐くのHadoop構成の設定を取り出し、s3n://ACCESS_KEY:[email protected]/KEY

を経由して、S3のURLでIAMユーザーの資格情報をハードコード..それは間違いなく私たちがしたいことではありません。

私は本当にこれに固執していて、本当にここに助けに感謝します!私はそれをローカルで実行するとうまく動作しますが、EMRでは完全に失敗します。

答えて

0

amazon EMRでは、S3のオブジェクトを参照するために、接頭辞s3://を使用してみてください。

です。a long storyです。

1

問題が従っていました:私は赤方偏移を照会すると

  • EC2インスタンスEMRブートストラップフェーズ
  • 上の一時的な資格情報を生成し、私はtheDatabricksドライバにaws_iam_roleを可決しました。その後、ドライバは同じIAMロールの一時資格情報を再生成しました。これにより、EC2インスタンスが生成したクレデンシャルが無効化されました。
  • は、私はそれが期限切れの資格情報を使用しようとしていたので、それが失敗した古い資格証明書(およびインスタンスのメタデータに保存された資格情報)

を使用してS3にアップロードしようとしました。

val credentials = EC2MetadataUtils.getIAMSecurityCredentials ... .option("temporary_aws_access_key_id", credentials.get(IAM_ROLE).accessKeyId) .option("temporary_aws_secret_access_key", credentials.get(IAM_ROLE).secretAccessKey) .option("temporary_aws_session_token", credentials.get(IAM_ROLE).token)

ソリューションは、aws_iam_roleを経由して赤方偏移の権限を削除し、次のように置き換えることでした

関連する問題