Jupyter에서 Scala

이 기사는 Jupyter에서 Scala로 작성한 앱을 실행하는 것을 목표로합니다.

왜, 스칼라?



Jupyter를 사용한다면 파이썬에서 좋지 않습니까? 라고 생각되는 분도 많을까 생각합니다.
그러나 이미 Scala로 작성된 자산 (코드)이 있으며,
해당 앱에 추가한다고 가정한 코드를 작성하고 싶습니다.
Scala를 좋아해! 라든지,
Scala를 시작하고 싶다거나,
인생 여러가지, 회사 이유도 여러가지 있다고 생각합니다.
(뭐, 단순히 필자가 Scala를 좋아하고, Spark-Shell 힘들지만, 일부러, pyspark의 API를 기억하는 것이 귀찮기 때문이라는 이유이기도 합니다.)

환경



다음의 환경이 사전에 정돈되어 있는 전제입니다.

필수



파이썬



3계

sbt



1.0.3
(시험하지 않지만 0.13 계에서도 괜찮지 않을까)

Scala



2.12.2
(어째서 2.12계로 한 거라든지・・・2.11계로 움직일 것입니다)

Jupyter Scala



0.4.2 (2017/11/14 현재 최신)

Jupyter kernel



0.4.1 (2017/11/14 현재 최신)

자바



OpenJDK 8
(Java 8이라면 Oracle JDK8에서도 좋을 것입니다. 이번에는 Amazon EMR에 접근하고 싶기 때문에 EMR 기본 Open JDK를 yum install하고 있습니다)

선택



오 S



Amazon Linux 2017.03의 Docker 이미지
(따라서 Python과 JVMM이 작동한다면 괜찮습니다. Windows의 경우 경로와 명령을 Windows로 바꿉니다.)

스파크



2.2.0
※ Jupyter에서 Scala를 움직이는 것만으로는 불필요합니다. Spark 앱을 실행하기 위해 빌드하는 단계를 위해 Spark를 실행하기 위한 설정을 구성합니다.

Docker 주위



Jupyter에서 Scala를 움직이면 필요하지 않습니다.
이번에는 Amazon EMR에 가까운 환경으로 만들고 싶었기 때문에 docker-compose를 사용하여
Spark 클러스터를 구축하고 master 노드에 Jupyter를 구축하여 호스트에서 액세스하도록 합니다.
  • Docker CE 17.09.0 (어쩌면 docker-ce라면 어떤 버전이라도 괜찮을까요)
  • docker-compose

  • 구축 절차



    Jupyter 설치



    JupyterLab을 좋아한다고 말했습니까?
    Spark를 사용하지 않으면 jupyter, notebook (or jupyterlab), py4j 당이 있으면 좋을지 모릅니다 (py4j도 필수인지는 수상할지도)
    pip install jupyter
    pip install notebook
    pip install jupyterlab
    pip --no-cache-dir install pandas pyspark
    pip install py4j jupyter-spark lxml
    pip install --upgrade beautifulsoup4 html5lib
    jupyter nbextension install --py jupyter_spark
    jupyter serverextension enable --py jupyter_spark
    jupyter nbextension enable --py jupyter_spark
    jupyter nbextension enable --py widgetsnbextension
    jupyter serverextension enable --py jupyterlab --sys-prefix
    
    pip install scipy scikit-learn pygments && \
    pip3 install scipy scikit-learn pygments pandas pyspark ipykernel ipython
    

    sbt 설치



    이번은, Dockerfile 로 Docker Image 를 구축하고 있기 때문에, sudo 나름 doas 를 실시하고 있지 않습니다만, 필요에 따라서 적절히, sudo 나름 doas
    ##
    # Dockerfile では
    # ENV SBT_HOME /usr/local/sbt
    # ENV PATH ${PATH}:${SBT_HOME}/bin
    # と記述
    ##
    
    echo "export SBT_HOME=/usr/local/sbt" >> .bashrc
    echo "export PATH=${PATH}:${SBT_HOME}/bin" >> .bashrc
    
    
    export SBT_VERSION=1.0.3
    curl -sL "https://github.com/sbt/sbt/releases/download/v${SBT_VERSION}/sbt-${SBT_VERSION}.tgz" | tar -xz -C /usr/local
    

    Jupyter kernel/Jupyter Scala 설치


    # Jupyter Scala のインストール
    curl -sL "https://github.com/jupyter-scala/jupyter-scala/archive/v0.4.2.tar.gz" | tar -xz -C /usr/local && \
    cd /usr/local/ && \
    ln -s jupyter-scala-0.4.2 jupyter-scala && \
    cd jupyter-scala && \
    sbt publishLocal
    
    # Jupyter Kernel のインストール
    curl -sL "https://github.com/jupyter-scala/jupyter-kernel/archive/v0.4.1.tar.gz" | tar -xz -C /usr/local &&\
    cd /usr/local/ && \
    ln -s jupyter-kernel-0.4.1 jupyter-kernel && \
    cd jupyter-kernel && \
    sbt publishLocal
    
    # 仕上げ
    # Windows の場合は https://github.com/jupyter-scala/jupyter-scala/blob/master/jupyter-scala.ps1 を使えば良さそう
    
    # /root 配下じゃ無くても良さそう
    curl -sL "https://raw.githubusercontent.com/alexarchambault/jupyter-scala/master/jupyter-scala" -o /root/jupyter-scala.sh && \
    chmod 744 /root/jupyter-scala.sh && \
    sed -e "s/2.11.11/2.12.4/gi" /root/jupyter-scala.sh && \
    /root/jupyter-scala.sh && \
    rm -f /root/jupyter-scala.sh
    

    이제 Jupyter를 시작하면 다음과 같이 Jupyter에서 Scala를 사용할 수 있습니다.
    ※ JupyterLab 시작 화면


    움직여 보자



    각 셀에 다음과 같은 코드를 작성해 보았습니다.
    import $ivy.`org.apache.spark::spark-sql:2.2.0`
    import $ivy.`org.apache.hadoop:hadoop-aws:2.7.3`
    import $ivy.`org.jupyter-scala::spark:0.4.2`
    
    import org.apache.spark.sql.SparkSession
    import org.apache.spark.{SparkConf, SparkContext}
    
    //Configuration
    import jupyter.spark.session._
    
    val spark = JupyterSparkSession
      .builder() // important - call this rather than SparkSession.builder()
      .jupyter()
      .master("local[*]")
      .config("spark.driver.memory","2g")
      .config("spark.memory.useLegacyMode", "true")
      .appName("notebook")
      .getOrCreate()
    
    spark
      .sparkContext
      .parallelize(Array("Hello", "World", "!"))
      .foreach(System.err.println)
    
    spark.stop()
    



    종속 라이브러리 참조



    다음과 같이 기술한다.
    $ivy.`group::artifact:version`
    

    참고 : htps : // 기주 b. 코 m / 쥬 py rs? / 쥬 py rs? # s 파

    요약



    sbt와 Jupyter kernel/Jupyter Scala를 설치하면 된다.

    여담



    직장 등에서 프록시를 통과하는 경우
    htps : // 기주 b. 코 m / 쥬 py rs 또는 / 쥬 py rs / / 이스에 s / 21
    대로 실시하면 동작하지 않고.

    다음과 같이 argv 섹션에 추가하면 작동했습니다.
    {
      "language" : "scala",
      "display_name" : "Scala",
      "argv" : [
        "java",
        "-noverify",
        "-Dhttp.proxyHost=...",
        "-Dhttp.proxyPort=...",
        "-Dhttps.proxyHost=...",
        "-Dhttps.proxyPort=...",
        "-jar",
        "/root/.local/share/jupyter/kernels/scala/launcher.jar",
        "launch",
        "-r",
        "sonatype:releases",
        "-r",
        "sonatype:snapshots",
        "-i",
        "ammonite",
        "-I",
        "ammonite:org.jupyter-scala:ammonite-runtime_2.11.11:0.8.3-1",
        "-I",
        "ammonite:org.jupyter-scala:scala-api_2.11.11:0.4.2",
        "org.jupyter-scala:scala-cli_2.11.11:0.4.2",
        "--",
        "--id",
        "scala",
        "--name",
        "Scala",
        "--quiet",
        "--connection-file",
        "{connection_file}"
      ]
    }
    
    

    좋은 웹페이지 즐겨찾기