Amazon S3に接続
この記事では、DatabricksからAWS S3に接続する方法を説明します。
URIとAWSキーを使用してS3バケットにアクセスする
Sparkプロパティを設定して、S3にアクセスするためのAWSキーを設定することができます。
Databricks 、すべての資格情報を保存するためにシークレットスコープを使用することを推奨しています。ワークスペース内のユーザー、サービスプリンシパル、およびグループに、シークレットスコープを読み取るためのアクセス権を付与できます。これにより、ユーザーがS3にアクセスできるようにしながら、AWSキーが保護されます。シークレットスコープを作成するには、「シークレットスコープ」を参照してください。
資格情報のスコープはクラスターまたはノートブックのいずれかに設定できます。 クラスターアクセス制御とノートブックアクセス制御の両方を併用して、S3 へのアクセスを保護します。 「コンピュート権限」と 「Databricks ノートブックを使用したコラボレーション」を参照してください。
Spark プロパティを設定するには、クラスターの Spark 設定で次のスニペットを使用して、シークレットスコープに保存されている AWS キーを 環境変数として設定します。
AWS_SECRET_ACCESS_KEY={{secrets/scope/aws_secret_access_key}}
AWS_ACCESS_KEY_ID={{secrets/scope/aws_access_key_id}}
その後、次のコマンドを使用してS3から読み込むことができます。
aws_bucket_name = "my-s3-bucket"
df = spark.read.load(f"s3a://{aws_bucket_name}/flowers/delta/")
display(df)
dbutils.fs.ls(f"s3a://{aws_bucket_name}/")
オープンソースのHadoopオプションを使用してS3にアクセスする
Databricks Runtimeは、オープンソースのHadoopオプションを使用したS3Aファイルシステムの設定をサポートしています。グローバルプロパティとバケット単位のプロパティを設定できます。
グローバル構成
# Global S3 configuration
spark.hadoop.fs.s3a.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.endpoint <aws-endpoint>
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS
バケットごとの構成
バケットごとのプロパティを設定するには、構文 spark.hadoop.fs.s3a.bucket.<bucket-name>.<configuration-key>
を使用します。これにより、異なる資格情報やエンドポイントなどを使用してバケットを設定できます。
たとえば、グローバルS3設定に加えて、次のキーを使用して各バケットを個別に構成できます。
# Set up authentication and endpoint for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.bucket.<bucket-name>.endpoint <aws-endpoint>
# Configure a different KMS encryption key for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.server-side-encryption.key <aws-kms-encryption-key>
Databricksからのデータの保存とアクセスのための非推奨のパターン
非推奨のストレージパターンを次に示します。
Databricks では、外部データの場所を Databricks Filesystemにマウントすることは推奨されなくなりました。 「Databricks へのクラウドオブジェクトストレージのマウント」を参照してください。
重要
S3Aファイルシステムはデフォルトでキャッシュを有効にし、「FileSystem.close()」でリソースを解放します。他のスレッドがキャッシュされたファイルシステムへの参照を誤って使用しないようにするには、「FileSystem.close()」を明示的に使用しないでください。
S3Aファイルシステムは、出力ストリームを閉じるときにディレクトリマーカーを削除しません。HADOOP-13230を含まないHadoopバージョンに基づくレガシーアプリケーションは、内部にファイルがあっても、それらを空のディレクトリと誤って解釈する可能性があります。