나의 경우 공부용으로 사용하므로 Administrator 권한을 부여하였으나, 실제 사용시에는 AmazonS3FullAccess 권한을 부여한다.
분명히 공식문서에서는 "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가 존재하는 버전을 다운받는다.
$ 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 -> 권한 -> 객체 소유권 편집에서
위와 같이 설정
다운 버전 확인(stackoverflow)
코드 설정 확인(yahang님의 블로그)
코드 설정 확인(jhleeme님의 블로그)