RunJobFlow
コマンドを使用してSpark EMRクラスタをスピンアップしています。このコマンドは、AmazonElasticMapReduceforEC2Role
とAmazonRedshiftReadOnlyAccess
のポリシーを持つ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>)
経由AWSAccessKeyID
とAWSSecretKey
をロードするために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では完全に失敗します。