hadoop-aws
, aws-java-sdk-bundle
과 같은 Jar 파일들을 추가해주어야 하며 버전 호환성까지도 생각해주어야 합니다.1) Apache Spark archive 접속
2) 구성하고자 하는 Spark 버전 선택 (spark version -> 3.3.0)
3) pyspark 기준 spark-[버전]-bin-hadoop[버전].tgz
형식으로 된 압축파일에서 hadoop 버전 확인 (hadoop version -> 3)
4) spark-[버전]-bin-hadoop[버전].tgz.sha512
형식으로 된 압축파일 접속 후 해당 버전에 대한 암호값 확인 (암호값 -> 1e8234d0c1d2ab4462d6b0dfe5b54f2851dcd883378e0ed756140e10adfb5be4123961b521140f580e364c239872ea5a9f813a20b73c69cb6d4e95da2575c29c)
1) Apache Spark 공식 Github 링크로 접속
2) 좌측 상단에서 구성하고자 하는 Spark 버전 선택
3) pom.xml
파일내에서 hadoop.version
를 검색
4) 아래와 같이 해당 spark 버전에 대한 hadoop 버전 확인 가능 (spark hadoop version -> 3.3.2)
1) hadoop-aws maven 저장소 링크로 접속
2) 위에서 확인한 hadoop 버전 클릭
3) Compile Dependencies (1)
탭에서 아래 사진과 같이 aws-java-sdk-bundle
에 대한 버전 확인 가능 (aws-java-sdk-bundle version -> 1.11.1026)
1) 포트 개방 개방, 유저 정의
2) spark, hadoop-aws, aws-java-sdk-bundle 등 Spark 환경 구성에 필요한 버전을 변수에 할당
3) Python 및 필요 라이브러리 설치
4) Spark 설치
5) hadoop-aws 및 aws-sdk 관련 내용 설치
6) Jupyter Lab 관련 Initial 설정
7) Docker Image 기본 명령 입력
Dockerfile
# 1-----base image
FROM ubuntu:20.04
WORKDIR /workspace
# Expose port
EXPOSE 8888 4040
# User setting
USER root
# 2-----Spark 환경 구성에 필요한 버전을 변수에 할당
ARG spark_version="3.3.0"
ARG hadoop_version="3"
ARG spark_checksum="1e8234d0c1d2ab4462d6b0dfe5b54f2851dcd883378e0ed756140e10adfb5be4123961b521140f580e364c239872ea5a9f813a20b73c69cb6d4e95da2575c29c"
ARG openjdk_version="11"
ARG aws_hadoop_version="3.3.2"
ARG aws_sdk_version="1.11.1026"
ENV APACHE_SPARK_VERSION="${spark_version}" \
HADOOP_VERSION="${hadoop_version}" \
AWS_SDK_VERSION="${aws_sdk_version}" \
AWS_HADOOP_VERSION="${aws_hadoop_version}"
ENV SPARK_HOME="/spark"
# 3-----Python 및 필요 라이브러리 설치
RUN apt-get update && \
apt-get install -y python3 python3-pip && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install wget -y
RUN apt-get update && apt-get install openjdk-11-jdk -y
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# requirements.txt 내 라이브러리들 설치
COPY requirements.txt ./
RUN pip3 install --upgrade pip && pip3 install --no-cache-dir -r requirements.txt
RUN apt-get clean && rm requirements.txt
# 4-----Spark 설치
RUN wget -q "https://archive.apache.org/dist/spark/spark-${APACHE_SPARK_VERSION}/spark-${APACHE_SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz" && \
echo "${spark_checksum} *spark-${APACHE_SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz" | sha512sum -c - && \
tar xzf "spark-${APACHE_SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz" -C /workspace --owner root --group root --no-same-owner && \
rm "spark-${APACHE_SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz"
RUN mv "spark-${APACHE_SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}" spark
RUN mv spark /
RUN cp -p "${SPARK_HOME}/conf/spark-defaults.conf.template" "${SPARK_HOME}/conf/spark-defaults.conf" && \
echo 'spark.driver.extraJavaOptions -Dio.netty.tryReflectionSetAccessible=true' >> "${SPARK_HOME}/conf/spark-defaults.conf" && \
echo 'spark.executor.extraJavaOptions -Dio.netty.tryReflectionSetAccessible=true' >> "${SPARK_HOME}/conf/spark-defaults.conf"
# 5-----hadoop-aws 및 aws-sdk 관련 내용 설치
RUN wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/${AWS_HADOOP_VERSION}/hadoop-aws-${AWS_HADOOP_VERSION}.jar -P "${SPARK_HOME}/jars/" && \
wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/${AWS_SDK_VERSION}/aws-java-sdk-bundle-${AWS_SDK_VERSION}.jar -P "${SPARK_HOME}/jars/"
# Adding JetS3t libary
RUN wget https://repo1.maven.org/maven2/net/java/dev/jets3t/jets3t/0.9.4/jets3t-0.9.4.jar -P "${SPARK_HOME}/jars/"
# 6-----Jupyter Lab 관련 Initial 설정
RUN ipython profile create
RUN echo "c.IPKernelApp.capture_fd_output = False" >> "/root/.ipython/profile_default/ipython_kernel_config.py"
# Jupyter workspace 설정
WORKDIR /workspace/spark
# 7-----Docker Image 기본 명령 입력
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
requirements.txt
jupyterlab
pyarrow
s3fs
pandas
boto3
findspark
pyspark==3.3.0
localhost:8888
URL을 통해 Jupyter Lab에 접속할 수 있다.s3://
형식이 아닌 s3a://
형식으로 넘겨주어야 정상적으로 연동이 된다.from pyspark.sql import SparkSession
spark = (
SparkSession
.builder
.appName("pyspark_s3")
.master("local[*]")
.getOrCreate()
)
sc = spark.sparkContext
access_key = "AWS ACCESS KEY ID"
secret_key = "AWS SECRET ACCESS KEY"
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", access_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", secret_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
sc._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider")
sc._jsc.hadoopConfiguration().set("fs.s3a.connection.ssl.enabled", "false")
spark.read.parquet("s3a://directory/for/s3/bucket/")