Spark를 REST API에서 실행하는 Apache Livy

별로 일본어 기사가 없었기 때문에 써 보았습니다.

Livy를 대략 요약하면 Spark의 처리를 REST 서버 경유(API)로 요청할 수 있는 소프트웨어가 됩니다.

본가 사이트에서
Submit Jobs from Anywhere

Livy enables programmatic, fault-tolerant, multi-tenant submission of Spark jobs from web/mobile apps (no Spark client needed). So, multiple users can interact with your Spark cluster concurrently and reliably.

Use Interactive Scala or Python

Livy speaks either Scala or Python, so clients can communicate with your Spark cluster via either language remotely. Also, batch job submissions can be done in Scala, Java, or Python.



이 기사에서는 설치 및 API에서 Spark를 실행하는 방법에 대해 간략하게 설명합니다.
모두 로컬 Mac 컴퓨터에서 실행 중입니다.

덧붙여 본 기사에서는 Spark의 인스톨 방법에 대해서는 생략하고 있기 때문에, Spark의 인스톨 방법에 대해서는, 이하 기사를 참고로 해 주시면 좋겠습니다.

(참고)
Spark / Scala를 Jupyter Notebook에서 실행 - Qiita

Livy 설치 및 시작



다음 사이트에서 zip 파일을 다운로드 해답합니다.
  • Apache Livy Download Mirrors

  • zip 파일 압축을 풀면 디렉토리를 이동하여 Livy 프로세스를 시작합니다.
    # 起動
    ./bin/livy-server start
    
    # 起動状態確認
    ./bin/livy-server status
    

    기본적으로 localhost:8998로 시작합니다.

    Livy API를 사용해보십시오


  • (참고) Livy Docs - REST API

  • 대화형으로 처리 수행



    Spark 컨텍스트를 생성하고 대화식으로 처리를 실행해 봅니다.
    Spark 컨텍스트는 세션을 내보내고 세션에서 공유되기 때문에 먼저 세션을 만듭니다.

    세션 만들기


    # リクエスト
    curl -XPOST -H 'Content-Type: application/json' localhost:8998/sessions -d \
    '{
      "driverMemory": "2G",
      "driverCores": 1,
      "executorMemory": "2G",
      "executorCores": 1,
      "numExecutors": 1
    }'
    
    # レスポンス
    {"id":0,"appId":null,"owner":null,"proxyUser":null,"state":"starting","kind":"shared","appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log":["stdout: ","\nstderr: "]}
    
    "id":00 가 세션 ID이므로 이 세션 ID를 사용하여 다음 절에서 코드를 실행해 봅니다.

    코드 실행



    내보낸 세션 ID 0를 사용하여 코드를 여러 번 실행해보십시오.
    curl localhost:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d \
    '{
      "code":"val x = 1 + 2", 
      "kind": "scala"
    }'
    
    curl localhost:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d \
    '{
      "code":"val y = 1 + x", 
      "kind": "scala"
    }'
    

    UI(이번에는 http://localhost:8998 )에 액세스하면 실행 결과를 볼 수 있습니다.



    세션 삭제



    작업이 끝나면 세션을 삭제합니다.
    curl -XDELETE localhost:8998/sessions/0
    

    일괄 처리 실행



    그런 다음 jar 파일을 사용하여 일괄 처리를 시작합니다.

    아래 Livy 서버에 /work 디렉터리를 만든 다음 jar 파일을 배치하여 배치 앱을 실행해 봅니다.

    사전 설정



    우선 준비가 필요합니다.
    # 実行したいjarファイルを今回はSparkに同梱されているexampleのものを利用する
    # /workディレクトリは、このあとのconfファイルでホワイトリストに追加する必要がある
    mkdir -p /work
    cp $SPARK_HOME/examples/jars/spark-examples_2.11-2.4.0.jar /work
    

    로컬로 실행하려면 다음 설정이 필요합니다.
    cp conf/livy.conf.template conf/livy.conf
    vi conf/livy.conf
    

    다음 두 줄을 설정합니다.

    conf/livy.conf
    livy.spark.master = local
    livy.file.local-dir-whitelist = /work
    
    conf/livy.conf 파일을 구성한 후 설정을 반영하기 위해 Livy 프로세스를 다시 시작합니다.
    # プロセスの再起動
    bin/livy-server stop
    bin/livy-server start
    

    일괄 처리 실행



    준비가 되었으므로 실행합니다.
    # バッチ処理のリクエスト
    curl localhost:8998/batches -XPOST -H 'Content-Type: application/json' -d \
    '{
      "file": "/work/spark-examples_2.11-2.4.0.jar",
      "className": "org.apache.spark.examples.SparkPi",
      "conf": {
        "spark.master": "local[1]"
      },
      "name": "example-app"
    }'
    
    # レスポンス
    {"id":1,"state":"running","appId":null,"appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log":["stdout: ","\nstderr: "]}%
    

    실행하면 일괄 처리 ID가 지불됩니다.
    배치 ID를 지정하여 실행 로그를 검색할 수 있습니다.
    # リクエスト
    # ログを見やすくするためにPythonのjson.toolで整形しています
    curl localhost:8998/batches/1/log | python -m json.tool
    
    # レスポンス
    {
        "id": 1,
        "from": 3,
        "total": 103,
        "log": [
            "2019-03-21 23:45:48 INFO  SparkContext:54 - Submitted application: Spark Pi",
            "2019-03-21 23:45:48 INFO  SecurityManager:54 - Changing view acls to: chocomint",
            "2019-03-21 23:45:48 INFO  SecurityManager:54 - Changing modify acls to: chocomint",
            "2019-03-21 23:45:48 INFO  SecurityManager:54 - Changing view acls groups to: ",
            ...
    

    로그는 Livy UI에서도 볼 수 있습니다.



    요약



    배치 처리를 API로 기동할 수 있게 되기 때문에, 편리할까라고 생각했습니다. 실업무로 사용할 수 있으면 사용해 가고 싶습니다.

    좋은 웹페이지 즐겨찾기