1

문제 : 라이브러리를 인증하거나 사용하지 않고 Amazon의 자체 클러스터에서 AWS S3 버킷으로 저장하려고합니다. 기본적으로 Amazon 클러스터에서 실행되는 프로그램의 데이터를 S3 버킷에 저장하려고합니다.Amazon Web Service s3에 파일 저장

아마존 웹 서비스 (AWS) EMR 클러스터에서 일부 Python3 프로그램을 실행 중이고 AWS S3 버킷의 폴더에 파일을 저장하려고하는데 해당 폴더가 없으면 만들고 싶습니다.

현재 파일을 저장하는 방법은 다음과 같습니다. 나는 with 메서드를 시도했으나 작동하지 않습니다.

rdd.saveAsTextFile("s3://mybucket/") 

가 인증없이 saveAsTextFile() 일을 하는가 또는 어떻게 든 인증 않습니다 제공하는 인증없이 점화 RDDs의 방법을 사용하여 작동하는 S3 버킷에 part-xxxxx 파일로 RDD를 저장하는 몇 가지 이유를 들어

output = open("s3://mybucket/myfile.txt", "w+") 
output.write("hello world\n") 

, 백그라운드에서?

아마존의 클러스터에서 S3 버킷에 파일을 저장하는 인증이 필요하지 않은 경우 saveAsTextFile() RDD 방법과 같은 인증을 요구하지 않고 Python의 open 메서드를 사용하여이 작업을 수행 할 수 있습니까?

답변

1

당신은 아마 인증을 제공 할 수있는 명시 적 조치를 취할 필요가 없습니다 만든 기계. EMR 클러스터에 읽고 S3에 쓸 수있는 권한을 포함해야하는 (첫 번째 EMR 클러스터로 만든) IAM 역할이 할당 된 모든 기본에게 있습니다.

IAM 역할에 다양한 AWS API를 사용할 수있는 권한을 제공하여 일 특정 AWS 사용자 계정과는 대조적으로 특정 시스템에 액세스 할 수 있습니다. 해당 상자에서 보내면 사용자 인증 키를 제공 할 필요가 없습니다. RDDs 및 DataFrames (RDD.saveAsTextFileDataFrame.write)에 대한

1)를 사용하여 불꽃의 자신의 글 API를 :

는 S3에 데이터를 저장하여 스파크 코드 내에서 두 가지 옵션이 있습니다. 모든 올바른 라이브러리가 설치되었다고 가정하면 S3, HDFS 또는 로컬 파일 시스템 경로에 대해 작동합니다. 그들은 EMR에있을 것입니다. 이 방법을 사용하면 보통 _SUCCESS 및 part - ##### 파일이 작성되지만 Spark의 coalesce (1) 메소드를 사용하여 파티션 파일을 1 개로 제한 할 수 있습니다.

2) AWS SDK 라이브러리을 사용하여 S3에 파일을 직접 씁니다.

필자는 코드 변경없이 다른 대상 파일 시스템을 쉽게 지원할 수 있으므로 옵션 # 1을 사용하는 경향이 있습니다. 또한 추가 라이브러리에 대해 신경 쓸 필요가 없습니다.

EMR을 사용하는 경우 "s3 : //"은 s3n 또는 s3a가 아닌 모든 S3 끝점에 대한 올바른 접두사입니다.

0

확실치 않은 점은 s3 정책을 수정 한 경우에도 .part 파일을 인증없이 s3에 업로드하는 방법을 알 수 없었습니다. 시스템 환경에서 aws 키를 속성 또는 conf 파일로 추가했을 수도 있습니다. aws 리소스에 액세스하려면 atleast가 액세스 키와 비밀 키를 제공해야합니다. 또한 s3 스키마는 현재 사용되지 않습니다. 다음 코드는 hadoop-aws-2.8.0.jar 및 spark 2.1에서 작동합니다. (참고 :. 당신은 EMR을 사용하는 경우 나)의 선호 S3N 이상 (기본 구조로 사용 S3A 방식을 가져야한다

val spark = SparkSession 
       .builder 
       .appName("SparkS3Integration") 
       .master("local[*]") 
       .getOrCreate() 
      spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", awsAccessKey) 
      spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", awsSecretKey) 

val rdd = spark.sparkContext.parallelize(Seq(1,2,3,4)) 
rdd.saveAsTextFile("s3n://<bucket_name>/<path>") 
+0

s3n (원시 s3 파일 시스템)은 현재 s3a가 사용되는 위치에서 사용되지 않습니다. Spark 2.0에서 s3a 1을 사용하려면 다음 등록 정보를 구성해야합니다. fs.s3a.access.key 2. fs.s3a.secret.key 3. org.apache.hadoop.fs.s3a.S3AFileSystem –