Amazon S3 に接続する
この記事では、Azure 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>
Azure Databricks のデータの格納とアクセスに推奨されないパターン
非推奨のストレージ パターンを次に示します。
- Databricks では、外部データの場所を Databricks ファイルシステムにマウントすることは推奨されなくなりました。 「Azure Databricks へのクラウド オブジェクト ストレージのマウント」を参照してください。
重要
- S3A ファイルシステムでは、既定でキャッシュが有効になり、'FileSystem.close()' のリソースが解放されます。 キャッシュされたファイル システムへの参照を誤って使用する他のスレッドを回避するには、'FileSystem.close() を明示的に使用しないでください。
- S3A ファイルシステムは、出力ストリームを閉じるときにディレクトリ マーカーを削除しません。 HADOOP-13230 を含まない Hadoop バージョン ベースのレガシ アプリケーションでは、ファイルが含まれている場合でも、それらを空のディレクトリとして誤って解釈する可能性があります。