AWS Glue 테스트 환경을 로컬로 구축
Glue를 로컬 환경에서 테스트하고 싶습니다.
AWS의 Lambda가 로컬 환경에서 개발할 수 있기 때문에, Glue도 할 수 없을까라고 생각해 보았는데, AWS로부터 라이브러리가 제공되고 있었습니다.
처음에는 개별적으로 인스톨하고의 이용을 시도했습니다만, 잘 되지 않고…
구구한 곳, Docker로 단번에 작성하는 순서를 발견. 로컬 개발 환경의 구축에 성공했습니다.
전제 조건
거친 절차
절차 상세
1. Docker 파일 만들기
적절한 디렉토리에 Dockerfile이라는 텍스트 파일을 만들고 거기에 설정 내용을 설명합니다.
※Emacs파이므로, vi가 아닌 emacs로 열려 있습니다.
$ mkdir aws-glue-local
$ cd aws-glue-local/
$ emacs Dockerfile
아래 Dockerfile은 퓨처 개발자 블로그의 이 기사을 인용했습니다.
※CA 증명서의 부분을 추가했습니다.
Dockerfile
FROM centos:7
######### CA証明書のインストール(セキュリティソフト等の関係でCAインストール必要な場合はコメントを外して実行)########
######### CA証明書(ここではmyca.crt)は、aws-glue-local内部に配置しておくこと。
#COPY myca.crt /usr/share/pki/ca-trust-source/anchors/
#RUN update-ca-trust extract
############################################################################################################
# https://omohikane.com/centos7_docker_python36/ を参考にpythonとjavaをインストール
RUN yum install -y bzip2 bzip2-devel gcc gcc-c++ make openssl-devel readline-devel zlib-devel wget curl unzip vim epel-release git && yum install -y tig jq vim-enhanced bash-completion net-tools bind-utils \
&& yum install -y https://repo.ius.io/ius-release-el7.rpm \
&& yum install -y python36u python36u-libs python36u-devel python36u-pip \
&& yum install -y java java-1.8.0-openjdk-devel \
&& rm -rf /var/cache/yum/*
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_CTYPE "ja_JP.UTF-8"
ENV LC_NUMERIC "ja_JP.UTF-8"
ENV LC_TIME "ja_JP.UTF-8"
ENV LC_COLLATE "ja_JP.UTF-8"
ENV LC_MONETARY "ja_JP.UTF-8"
ENV LC_MESSAGES "ja_JP.UTF-8"
ENV LC_PAPER "ja_JP.UTF-8"
ENV LC_NAME "ja_JP.UTF-8"
ENV LC_ADDRESS "ja_JP.UTF-8"
ENV LC_TELEPHONE "ja_JP.UTF-8"
ENV LC_MEASUREMENT "ja_JP.UTF-8"
ENV LC_IDENTIFICATION "ja_JP.UTF-8"
ENV LC_ALL ja_JP.UTF-8
# Glueライブラリ取得
RUN git clone -b glue-1.0 --depth 1 https://github.com/awslabs/aws-glue-libs
# Maven取得
RUN curl -OL https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz
RUN tar -xzvf apache-maven-3.6.2-bin.tar.gz
RUN mv apache-maven-3.6.2 /opt/
RUN ln -s /opt/apache-maven-3.6.2 /opt/apache-maven
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/jre/
ENV PATH $PATH:/opt/apache-maven/bin
RUN mvn -version
####################################################################################################
#### SSL証明書をインポートしてもmavenでSSL通信エラーが発生する場合は、コメントを外して実行。
#### MAVENオプションの記述内容の意味するところは
#### -Dmaven.wagon.http.ssl.insecure = true – ユーザー生成したCA証明書に対する安全でないSSLの使用を有効化
#### -Dmaven.wagon.http.ssl.allowall = true – サーバーのX.509証明書とホスト名の一致を有効化。
#### 無効にすると検証済みのブラウザが使用される
#### -Dmaven.wagon.http.ssl.ignore.validity.dates = true – 証明書生成日付の問題を無視
#####################################################################################################
#RUN echo "MAVEN_OPTS=\"-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true\"" >> ~/.mavenrc
# Glueアーティファクト取得
RUN curl -OL https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz
RUN tar -xzvf spark-2.4.3-bin-hadoop2.8.tgz
RUN mv spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8 /opt/
RUN ln -s /opt/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8 /opt/spark
ENV SPARK_HOME /opt/spark
# Python3.6を利用する設定
RUN unlink /bin/python
RUN ln -s /bin/python3 /bin/python
RUN ln -s /bin/pip3.6 /bin/pip
# 異なるバージョンのjarがsparkとglueに混在するので適切なバージョンのみを見るよう設定
RUN ln -s ${SPARK_HOME}/jars /aws-glue-libs/jarsv1
RUN ./aws-glue-libs/bin/gluepyspark
# 無限ループを実行させ、コンテナを終了させない
ENTRYPOINT ["/bin/sh", "-c", "while :; do sleep 10; done"]
2. Dockerfile을 기반으로 컨테이너 빌드
docker 명령을 사용하여 컨테이너를 만듭니다.
Dockerfile이 있는지 확인하고 빌드 명령 실행
$ ls #Dockerfileがあるか確認
Dockerfile
$ docker build . -t aws-glue-local-image #イメージ名はaws-glue-local-imageで作製
성공의 경우: 완료까지 20분 정도
실패의 경우: 몇 초 만에 처리 종료
【빌드 성공】BUILD SUCCESS 라고 표시된다
이 경우 다음 단계 (컨테이너 시작)로.
【빌드 실패】BUILD FAILURE 라고 표시된다
이 경우 오류 메시지에 의존하여 원인을 확인합시다.
우리 환경에서는 yum과 같은 SSL 통신 중에 CA 인증서가 필요했기 때문에 빌드가 실패했습니다.
그 때문에 Dockerfile에 CA 증명서의 인스톨을 기술, 대응시켰습니다.
3. 컨테이너 시작
빌드가 완료되면 컨테이너를 시작합니다.
docker run 때, &를 붙이는 것은 영구 루프에서의 Terminal 응답 정지를 막기 위해서입니다.
$ docker images # dockerイメージの確認
REPOSITORY TAG IMAGE ID CREATED SIZE
aws-glue-local-image latest 4daf5c8dd6ec 4 hours ago 2.07GB
centos 7 5e35e350aded 9 days ago 203MB
$ docker run --name aws-glue-local aws-glue-local-image & # 作成したイメージから、コンテナ名aws-glue-localで起動させる
4. 컨테이너에 로그인하여 gluepyskark를 시작합니다.
컨테이너 시작을 확인하고 로그인합니다.
gluepyspark 시작시 오류가 발생하지 않고 Glue 모듈을 사용할 수 있으면 성공!
$ docker ps # 起動中のコンテナを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b9886411b08 aws-glue-local-image "/bin/sh -c 'while :…" 4 hours ago Up 4 hours aws-glue-local
$ docker exec -it aws-glue-local bash # aws-glue-localコンテナに、bashでログイン
# ./aws-glue-libs/bin/gluepyspark # ログインするとrootになるので、gluepysparkを実行
~~~~中略~~~~
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.3
/_/
Using Python version 3.6.8 (default, Aug 7 2019 17:28:10)
SparkSession available as 'spark'.
>>> from awsglue.context import GlueContext # GlueContextを試しにインポート
>>> GlueContext # 中身確認
<class 'awsglue.context.GlueContext'>
>>> quit() # gluepyspark終了
# exit #コンテナから出る
$ docker stop aws-glue-local #コンテナを停止
aws-glue-local
$ docker ps #コンテナを確認(何もない)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a #停止コンテナ含めて確認(ちゃんといる)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b9886411b08 aws-glue-local-image "/bin/sh -c 'while :…" 4 hours ago Exited (137) 4 minutes ago aws-glue-local
docker 명령 메모
$ docker build Dockerfileの場所 -t イメージ名 #Dockerイメージの作成
$ docker images #Dockerimage一覧
$ docker run --name コンテナにつける名前 稼働元のイメージ名/ID #Dockerコンテナの起動
$ docker exec -it コンテナ名/ID コマンド #稼働中のコンテナにコマンドを送信※bashを指定するとTerminalログインできる
$ docker ps #コンテナ一覧(稼働中)
$ docker ps -a #コンテナ一覧(停止中含む)
$ docker stop コンテナ名 #コンテナの停止
$ docker rm コンテナ名 #コンテナ削除
$ docker rmi イメージID #イメージ削除
참고
$ mkdir aws-glue-local
$ cd aws-glue-local/
$ emacs Dockerfile
FROM centos:7
######### CA証明書のインストール(セキュリティソフト等の関係でCAインストール必要な場合はコメントを外して実行)########
######### CA証明書(ここではmyca.crt)は、aws-glue-local内部に配置しておくこと。
#COPY myca.crt /usr/share/pki/ca-trust-source/anchors/
#RUN update-ca-trust extract
############################################################################################################
# https://omohikane.com/centos7_docker_python36/ を参考にpythonとjavaをインストール
RUN yum install -y bzip2 bzip2-devel gcc gcc-c++ make openssl-devel readline-devel zlib-devel wget curl unzip vim epel-release git && yum install -y tig jq vim-enhanced bash-completion net-tools bind-utils \
&& yum install -y https://repo.ius.io/ius-release-el7.rpm \
&& yum install -y python36u python36u-libs python36u-devel python36u-pip \
&& yum install -y java java-1.8.0-openjdk-devel \
&& rm -rf /var/cache/yum/*
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_CTYPE "ja_JP.UTF-8"
ENV LC_NUMERIC "ja_JP.UTF-8"
ENV LC_TIME "ja_JP.UTF-8"
ENV LC_COLLATE "ja_JP.UTF-8"
ENV LC_MONETARY "ja_JP.UTF-8"
ENV LC_MESSAGES "ja_JP.UTF-8"
ENV LC_PAPER "ja_JP.UTF-8"
ENV LC_NAME "ja_JP.UTF-8"
ENV LC_ADDRESS "ja_JP.UTF-8"
ENV LC_TELEPHONE "ja_JP.UTF-8"
ENV LC_MEASUREMENT "ja_JP.UTF-8"
ENV LC_IDENTIFICATION "ja_JP.UTF-8"
ENV LC_ALL ja_JP.UTF-8
# Glueライブラリ取得
RUN git clone -b glue-1.0 --depth 1 https://github.com/awslabs/aws-glue-libs
# Maven取得
RUN curl -OL https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz
RUN tar -xzvf apache-maven-3.6.2-bin.tar.gz
RUN mv apache-maven-3.6.2 /opt/
RUN ln -s /opt/apache-maven-3.6.2 /opt/apache-maven
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/jre/
ENV PATH $PATH:/opt/apache-maven/bin
RUN mvn -version
####################################################################################################
#### SSL証明書をインポートしてもmavenでSSL通信エラーが発生する場合は、コメントを外して実行。
#### MAVENオプションの記述内容の意味するところは
#### -Dmaven.wagon.http.ssl.insecure = true – ユーザー生成したCA証明書に対する安全でないSSLの使用を有効化
#### -Dmaven.wagon.http.ssl.allowall = true – サーバーのX.509証明書とホスト名の一致を有効化。
#### 無効にすると検証済みのブラウザが使用される
#### -Dmaven.wagon.http.ssl.ignore.validity.dates = true – 証明書生成日付の問題を無視
#####################################################################################################
#RUN echo "MAVEN_OPTS=\"-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true\"" >> ~/.mavenrc
# Glueアーティファクト取得
RUN curl -OL https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz
RUN tar -xzvf spark-2.4.3-bin-hadoop2.8.tgz
RUN mv spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8 /opt/
RUN ln -s /opt/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8 /opt/spark
ENV SPARK_HOME /opt/spark
# Python3.6を利用する設定
RUN unlink /bin/python
RUN ln -s /bin/python3 /bin/python
RUN ln -s /bin/pip3.6 /bin/pip
# 異なるバージョンのjarがsparkとglueに混在するので適切なバージョンのみを見るよう設定
RUN ln -s ${SPARK_HOME}/jars /aws-glue-libs/jarsv1
RUN ./aws-glue-libs/bin/gluepyspark
# 無限ループを実行させ、コンテナを終了させない
ENTRYPOINT ["/bin/sh", "-c", "while :; do sleep 10; done"]
$ ls #Dockerfileがあるか確認
Dockerfile
$ docker build . -t aws-glue-local-image #イメージ名はaws-glue-local-imageで作製
$ docker images # dockerイメージの確認
REPOSITORY TAG IMAGE ID CREATED SIZE
aws-glue-local-image latest 4daf5c8dd6ec 4 hours ago 2.07GB
centos 7 5e35e350aded 9 days ago 203MB
$ docker run --name aws-glue-local aws-glue-local-image & # 作成したイメージから、コンテナ名aws-glue-localで起動させる
$ docker ps # 起動中のコンテナを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b9886411b08 aws-glue-local-image "/bin/sh -c 'while :…" 4 hours ago Up 4 hours aws-glue-local
$ docker exec -it aws-glue-local bash # aws-glue-localコンテナに、bashでログイン
# ./aws-glue-libs/bin/gluepyspark # ログインするとrootになるので、gluepysparkを実行
~~~~中略~~~~
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.3
/_/
Using Python version 3.6.8 (default, Aug 7 2019 17:28:10)
SparkSession available as 'spark'.
>>> from awsglue.context import GlueContext # GlueContextを試しにインポート
>>> GlueContext # 中身確認
<class 'awsglue.context.GlueContext'>
>>> quit() # gluepyspark終了
# exit #コンテナから出る
$ docker stop aws-glue-local #コンテナを停止
aws-glue-local
$ docker ps #コンテナを確認(何もない)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a #停止コンテナ含めて確認(ちゃんといる)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b9886411b08 aws-glue-local-image "/bin/sh -c 'while :…" 4 hours ago Exited (137) 4 minutes ago aws-glue-local
$ docker build Dockerfileの場所 -t イメージ名 #Dockerイメージの作成
$ docker images #Dockerimage一覧
$ docker run --name コンテナにつける名前 稼働元のイメージ名/ID #Dockerコンテナの起動
$ docker exec -it コンテナ名/ID コマンド #稼働中のコンテナにコマンドを送信※bashを指定するとTerminalログインできる
$ docker ps #コンテナ一覧(稼働中)
$ docker ps -a #コンテナ一覧(停止中含む)
$ docker stop コンテナ名 #コンテナの停止
$ docker rm コンテナ名 #コンテナ削除
$ docker rmi イメージID #イメージ削除
Reference
이 문제에 관하여(AWS Glue 테스트 환경을 로컬로 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kusanoiskuzuno/items/4175e62763526789b34e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)