spark, s3 connection

이상민·2023년 5월 23일
0

spark

목록 보기
14/17

설치

IAM

나의 경우 공부용으로 사용하므로 Administrator 권한을 부여하였으나, 실제 사용시에는 AmazonS3FullAccess 권한을 부여한다.

Hadoop-AWS.jar, AWS-java.jar 다운

분명히 공식문서에서는 "The versions of hadoop-common and hadoop-aws must be identical." hadoop-common과 hadoop-aws의 버전이 동일해야 한다고 그렇지 않다. 나의 하둡 버전은 3.3.3이고 hadoop common 또한 3.3.3이다.

$ hadoop version
Hadoop 3.3.3
Source code repository https://github.com/apache/hadoop.git -r d37586cbda38c338d9fe481addda5a05fb516f71
Compiled by stevel on 2022-05-09T16:36Z
Compiled with protoc 3.7.1
From source with checksum eb96dd4a797b6989ae0cdb9db6efc6
This command was run using /skybluelee/hadoop3/share/hadoop/common/hadoop-common-3.3.3.jar

hadoop-common이 아닌 hadoop-client-api, hadoop-client-runtime과 동일한 버전을 다운받아야 한다. 만일 버전이 다른 경우 java.lang.NoClassDefFoundError: org/apache/hadoop/fs/store/audit/AuditSpanSource 오류가 발생한다.
위의 버전은 spark/jars에서 확인 가능하다.

$ ls spark3/jars

...
hadoop-client-api-3.3.1.jar                            
hadoop-client-runtime-3.3.1.jar 
...

hadoop-aws

해당하는 버전의 hadoop-aws.jar를 다운받는다. 형광펜으로 칠한 부분이 다운 링크이다.
$ wget <링크 주소 복사>

aws-jdk의 경우

해당 hadoop-aws.jar과 dependency가 존재하는 버전을 다운받는다.

jar 위치 변경

$ mv aws-java-sdk-bundle-1.11.901.jar spark3/jars/aws-java-sdk-bundle-1.11.901.jar
$ mv hadoop-aws-3.3.1.jar spark3/jars/hadoop-aws-3.3.1.jar

spark/jar 폴더 내로 이동. 나의 경우 어떤 파일을 다운받았는지 확인하기 위해 복사했다.

실행

환경

zeppelin에서 사용

코드

%pyspark
from pyspark.sql import SparkSession

conf = SparkConf()
# AWS ACCESS KEY 
conf.set("spark.hadoop.fs.s3a.access.key", "access_key")
conf.set("spark.hadoop.fs.s3a.secret.key", "secret_key")
conf.setAll([('spark.driver.extraClassPath', '/skybluelee/spark3/jars/hadoop-aws-3.3.1.jar:/skybluelee/spark3/jars/aws-java-sdk-bundle-1.11.901.jar')])
# hadoop-aws, aws-jdk-bundle 파일의 위치를 입력
conf.set("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
conf.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.profile.ProfileCredentialsProvider")
conf.set('spark.hadoop.fs.s3a.aws.credentials.provider', 'org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider')
# S3 REGION 설정 ( V4 때문에 필요 )
conf.set("spark.hadoop.fs.s3a.endpoint", "s3.ap-northeast-1.amazonaws.com")
spark = SparkSession.builder \
    .config(conf=conf) \
    .appName("Spark") \
    .getOrCreate()

# Signature V4 설정
spark.sparkContext.setSystemProperty("com.amazonaws.services.s3.enableV4", "true")

# s3a:// 사용 예시 
df = spark.read.csv("s3a://news/name_gender.csv")
        
df.printSchema()     

root
 |-- _c0: string (nullable = true)
 |-- _c1: string (nullable = true)

기타 추가 사항

오류 해결을 위해 여러 코드를 변경하다 보면 어떠한 설정이 필수적인지 헷갈리는 경우가 있다. 위의 다운로드까지는 확실하고 그럼에도 진행이 되지 않는다면 추가로 실행해보자.

S3 권한 수정

s3 -> 권한 -> 객체 소유권 편집에서

위와 같이 설정

참조

다운 버전 확인(stackoverflow)
코드 설정 확인(yahang님의 블로그)
코드 설정 확인(jhleeme님의 블로그)

0개의 댓글