자습서: 로컬 Apache Zeppelin 노트북을 설정하여 ETL 스크립트 테스트 및 디버깅 - AWS Glue

자습서: 로컬 Apache Zeppelin 노트북을 설정하여 ETL 스크립트 테스트 및 디버깅

이 자습서를 통해 로컬 시스템의 Apache Zeppelin Notebook을 개발 엔드포인트로 연결하여 AWS Glue ETL(추출, 변환 및 로드) 스크립트를 배치하기 전에 상호적으로 실행, 디버깅, 및 테스트할 수 있습니다. 이 자습서에서는 SSH 포트 전송을 사용하여 로컬 시스템을 AWS Glue 개발 엔드포인트에 연결합니다. 자세한 내용은 Wikipedia의 포트 전송을 참조하십시오.

이 자습서에서는 자습서 사전 요구 사항의 단계를 이미 완료했다고 가정합니다.

Apache Zeppelin 노트북 설치

  1. Java Development Kit 1.7이 로컬 컴퓨터에 설치되어 있는지 확인하십시오(Java 홈 페이지 참조).

    Microsoft Windows에서 실행하고 있다면 JAVA_HOME 환경 변수가 올바른 Java 디렉터리를 가리키는지 확인하십시오. 이 변수를 업데이트하지 않고서 자바를 업데이트할 수 있습니다. 그리고 존재하지 않는 폴더를 가리키면 Zeppeliln은 시작하지 못합니다.

  2. Zeppelin 다운로드 페이지에서 로컬 시스템으로 모든 인터프리터가 있는 Apache Zeppelin 버전을 다운로드하십시오. 다음 호환성 테이블에 따라 다운로드할 파일을 선택하고 다운로드 지침을 따릅니다.

    AWS Glue 버전 Zeppelin 릴리스 다운로드할 파일
    0.9 0.7.3 zeppelin-0.7.3-bin-all.tgz
    1.0 이상 0.8.1 zeppelin-0.8.1-bin-all.tgz

    운영 체제에 적합한 방식으로 Zeppelin을 시작합니다. Zeppelin을 사용하는 동안 노트북을 시작하는 터미널 창을 열어둡니다. 서버가 성공적으로 시작되면 "Done, zeppelin server started"로 끝나는 문구가 콘솔에 나타납니다.

  3. http://localhost:8080를 탐색하여 브라우저에서 Zeppelin을 엽니다.

  4. Zeppelin 브라우저의 페이지 오른쪽 위에서 [anonymous(익명)] 드롭 다운 메뉴를 열고 [Interpreter(인터프리터)]를 선택합니다. 인터프리터 페이지에서 spark를 찾아서 오른쪽의 [edit(편집)]을 선택합니다. 다음과 같이 변경합니다.

    • 기존 프로세스에 연결(Connect to existing process) 확인란을 선택한 다음 호스트(Host)localhost로 설정하고 포트(Port)9007 또는 포트 전송에 사용하는 다른 포트로 설정합니다.

    • [Properties(속성)]에서 [master(마스터)]를 yarn-client로 설정합니다.

    • 만약 spark.executor.memory 속성이 있다면 [x]를 [action(작업)] 열에서 선택하여 속성을 삭제합니다.

    • 만약 spark.driver.memory 속성이 있다면 [x]를 [action(작업)] 열에서 선택하여 속성을 삭제합니다.

    페이지 하단의 [Save(저장)]을 선택한 다음 [OK]를 선택하여 인터프리터를 업데이트하고 재시작합니다. 브라우저 백 버튼을 사용하여 Zeppelin 시작 페이지로 돌아갑니다.

SSH 포트 전송을 시작하여 DevEndpoint로 연결

그런 다음 SSH 로컬 포트 전송을 사용하여 로컬 포트(여기서는 9007)를 AWS Glue(169.254.76.1:9007)에서 정의되는 원격 목적지로 전송합니다.

터미널 창을 열어 SSH 보안-셀 프로토콜에 연결할 수 있습니다. Microsoft Windows에서는 Git for Windows(Windows용 Git)가 제공한 BASH 셀을 사용하거나 Cygwin을 설치할 수 있습니다.

다음과 같이 수정된 다음 SSH 명령을 실행합니다.

  • private-key-file-path 대신 개발 엔드포인트를 생성하는 데 쓴 퍼블릭 키에 상응하는 프라이빗 키를 포함한 .pem 파일에 대한 경로를 사용합니다.

  • 9007가 아닌 다른 포트를 전송한다면 9007를 지역 내에서 실제로 사용하는 포트 수로 바꿉니다. 169.254.76.1:9007 주소는 원격 포트이며 사용자가 변경한 것이 아닙니다.

  • dev-endpoint-public-dns를 개발 엔드포인트의 퍼블릭 DNS 주소로 바꿉니다. 이 주소를 찾으려면 AWS Glue 콘솔에서 개발 엔드포인트로 이동하여 이름을 선택하고 [엔드포인트 세부 정보(Endpoint details)] 페이지에 목록으로 기재된 [퍼블릭 주소(Public address)]를 복사합니다.

ssh -i private-key-file-path -NTL 9007:169.254.76.1:9007 glue@dev-endpoint-public-dns

다음과 같은 경고 메세지가 표시됩니다.

The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)' can't be established. ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts. Are you sure you want to continue connecting (yes/no)?

yes를 입력하고 Zeppelin 노트북을 사용하는 동안 터미널 창을 열어둡니다.

Notebook Paragraph의 Simple Script Fragment 실행

Zepplin 시작 페이지에서 [Create new note(새로운 노트 생성하기)]를 선택합니다. 새로운 노트 Legislators에 이름을 붙여주고 spark를 인터프리터로써 승인합니다.

다음 스크립트 단편을 노트북에 입력하고 실행합니다. AWS Glue Data Catalog의 개인 메타데이터를 사용하여 예제 데이터로부터 DynamicFrame을 생성합니다. 그런 다음 항목 수와 이 데이터 스키마를 출력합니다.

%pyspark import sys from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.transforms import * # Create a Glue context glueContext = GlueContext(SparkContext.getOrCreate()) # Create a DynamicFrame using the 'persons_json' table persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json") # Print out information about this data print "Count: ", persons_DyF.count() persons_DyF.printSchema()

스크립트의 출력값은 다음과 같습니다.

Count: 1961 root |-- family_name: string |-- name: string |-- links: array | |-- element: struct | | |-- note: string | | |-- url: string |-- gender: string |-- image: string |-- identifiers: array | |-- element: struct | | |-- scheme: string | | |-- identifier: string |-- other_names: array | |-- element: struct | | |-- note: string | | |-- name: string | | |-- lang: string |-- sort_name: string |-- images: array | |-- element: struct | | |-- url: string |-- given_name: string |-- birth_date: string |-- id: string |-- contact_details: array | |-- element: struct | | |-- type: string | | |-- value: string |-- death_date: string

로컬 노트북 연결 문제 해결

  • 연결 취소 오류가 뜨면 기한이 지난 개발 엔트포인트를 사용했기 때문일 수 있습니다. 새로운 개발 엔드포인트를 생성해보고 다시 연결하십시오.

  • 네트워크 연결이 시간 초과되거나 어떤 이유로든 작동이 중지되는 경우, 다음과 같은 단계를 따라 복원해야 할 수 있습니다.

    1. Zeppelin의 페이지 오른쪽 위 모서리에 있는 드롭다운 메뉴에서 인터프리터를 선택합니다. 인터프리터 페이지에서 spark를 찾습니다. [Edit(편집)]를 선택한 다음, [Connect to existing process(기존 진행에 연결하기)] 확인란 선택 취소합니다. 페이지 하단에서 [Save(저장하기)]를 선택합니다.

    2. 앞서 설명한 대로 SSH 포트 전송을 시작합니다.

    3. Zeppelin에서 spark 인터프리터의 [기존 프로세스에 연결(Connect to existing process)]을 다시 설정하고 저장합니다.

    이렇게 인터프리터를 재설정하면 네트워크 연결이 복원됩니다. 이렇게 하는 또 다른 방법으로 [인터프리터(Interpreters)] 페이지의 Spark 인터프리터를 [재시작(restart)]하기로 선택하는 방법도 있습니다. 30초 동안 기다려보고 원격 인터프리터가 재시작되었는지 확인합니다.

  • 개발 엔드포인트에 원격 Zeppelin 인터프리터 액세스 권한이 있는지 확인하십시오. 적절한 네트워킹 권한이 없으면 open failed: connect failed: Connection refused(열기 실패: 연결 실패: 연결 거부됨) 등의 오류가 발생할 수 있습니다.