AWS Glue 테스트 환경을 로컬로 구축

11060 단어 centos7CentOSglueAWS

Glue를 로컬 환경에서 테스트하고 싶습니다.



AWS의 Lambda가 로컬 환경에서 개발할 수 있기 때문에, Glue도 할 수 없을까라고 생각해 보았는데, AWS로부터 라이브러리가 제공되고 있었습니다.
처음에는 개별적으로 인스톨하고의 이용을 시도했습니다만, 잘 되지 않고…
구구한 곳, Docker로 단번에 작성하는 순서를 발견. 로컬 개발 환경의 구축에 성공했습니다.

전제 조건


  • CentOs 7.6
  • Docker 19.03.2

  • 거친 절차


  • Docker 파일 만들기
  • 1.에 따라 컨테이너 빌드
  • 컨테이너 시작
  • 컨테이너에 로그인하고 gluepyskark를 시작

  • 절차 상세



    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 #イメージ削除
    

    참고


  • AWS Glue 개발자 문서 : AWS Glue ETL 라이브러리를 사용한 ETL 스크립트의 로컬 개발 및 테스트
  • 퓨처 개발자 블로그 : AWS Glue 개발 엔드포인트가 매우 높기 때문에 로컬 개발 환경을 준비했습니다.
  • 코드 로그 : Maven에게 SSL 오류를 무시하고 (그리고 모든 인증서를 신뢰하도록) 지시하는 방법?
  • Stack Over Flow : how-to-tell-maven-to-disregard-ssl-errors-and-trusting-all-certs
  • 좋은 웹페이지 즐겨찾기