Cloud Hadoop의 Apache Livy 사용하여 Spark Job 제출하기

Daehyun Park
NAVER CLOUD PLATFORM
6 min readOct 27, 2021

--

본 포스팅에서는 CloudHadoop(Spark)에서 제공하는 Apache Livy를 사용하여 Spark Job을 제출하는 방법을 설명합니다. Cloud Hadoop(Spark) 클러스터를 이미 생성하였다고 가정하고 진행하도록 하겠습니다.

Apache Livy란?

Apache Livy는 REST 인터페이스를 이용하여 Spark 클러스터와 쉽게 상호 작용할 수 있는 서비스 입니다. 간단한 REST 인터페이스 또는 RPC 클라이언트 라이브러리를 통해 Spark Job 또는 Spark 코드 스니펫, 동기/비동기 결과 검색, Spark Context 관리를 쉽게 제출할 수 있습니다.

또한, Apache Livy는 Spark와 애플리케이션 서버 간의 상호작용을 단순화하여 대화형 웹/모바일 어플리케이션에 Spark를 사용할 수 있도록 도와줍니다.

  • 멀티 클라이언트에서 여러 개의 Spark Job을 사용할 수 있도록 Spark Context를 가지고 있습니다.
  • 멀티 Job 및 클라이언트에서 캐시된 RDD 또는 데이터 프레임을 공유합니다.
  • 멀티 Spark Context를 동시에 관리할 수 있으며, 우수한 내결함성과 동시성을 위해 Spark Context가 Livy Server 대신 클러스터(Yarn/Mesos)에서 실행됩니다.
  • Job은 미리 컴파일된 jar, 코드 스니펫 또는 java/scala 클라이언트 API를 통해 제출할 수 있습니다.
  • 보안 인증 통신을 이용하여 보안을 확보합니다.
이미지 출처: https://livy.incubator.apache.org/assets/images/livy-architecture.png

Python 모듈 설치하기

Spark 예제 코드 수행을 위해서는 requests 라는 Python 모듈이 필요합니다.

requests 모듈 설치 방법은 아래와 같습니다.

$ sudo yum install -y epel-release
$ sudo yum install -y python-pip
$ sudo pip install requests

Apache Livy 서버 정보 확인

Apache Livy 서버의 포트 정보는 Ambari UI의 Spark2 > CONFIGS 에서 livy.server.port 정보를 확인하실 수 있습니다.

livy.server.port 정보 조회하기

Spark 예제 코드 수행하기

Apache Livy 테스트를 위한 예제 코드를 작성합니다.

예제 코드는 https://livy.incubator.apache.org/examples/ 를 참고하여 작성하였습니다.

아래 소스 코드 내용을 livy-test.py 로 저장합니다.

예제 코드인 livy-test.py 수행시에는 Livy 서버 접속 정보(http://ip:port)를 인자값으로 입력해 주셔야 합니다.

사용 방법은 아래와 같습니다.

$ python livy-test.py http://172.16.3.22:8999
Created /sessions/47
Sessioin State is Ready!!!!!!!!!!!!!!...........................
================================================================================
http://172.16.3.22:8999/sessions/47/statements/0
Request: 1 + 1
--------------------------------------------------------------------------------
res0: Int = 2================================================================================
http://172.16.3.22:8999/sessions/47/statements/1
Request:
val NUM_SAMPLES = 100000;
val count = sc.parallelize(1 to NUM_SAMPLES).map { i =>
val x = Math.random();
val y = Math.random();
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _);
println("Pi is roughly " + 4.0 * count / NUM_SAMPLES)--------------------------------------------------------------------------------
NUM_SAMPLES: Int = 100000
count: Int = 78503
Pi is roughly 3.14012================================================================================
deleted http://172.16.3.22:8999/sessions/47

마치며

이번 페이지에서는 Apache Livy 를 이용하여 Spark Job을 제출해 보았습니다.

Apache Livy를 사용하시는데 도움이 되었으면 좋겠습니다.

# Written by NAVER Cloud, Data Platform 박대현

--

--