在JupyterLab中使用Scala和Spark

Timothy Zhang
7 min readFeb 15, 2021

Jupyter是目前非常流行的基于网页(web-based)的交互式计算(interactive computing)。其能够为编程语言的教学和项目开发的原型设计提供非常大的帮助。正如Jupyter这个名字的由来,最初只是针对Julia,Python,和R的支持,而如今能支持多达几十种的编程语言和环境。

Jupyter广泛地用于Python语言的学习和项目开发,特别是Python的计算和机器学习等等。于是,有好些项目开发了Jupyter支持Scala语言,进而支持Spark计算的核(kernel)。目前,最为流行使用和开发活跃的Scala核项目则是Almond。Brunk在这个文章中有对Almond比较细致的介绍:“Interactive Computing in Scala with Jupyter and almond” — 他认为支持Scala的Jupyter结合了REPLs和Worksheets的优点,而且更重要的还有其基于网页的富文本特性。

JupyterLab则是继承Jupyter Notebook之后的下一代Jupyter用户接口。本文就介绍自己在JupyterLab上安装、配置和使用Scala及Spark的步骤。我的使用环境是MacOS,以下则是需要安装的主要组件,以及它们之间的依赖关系:

安装组件及其依赖关系

安装编程语言python和scala环境

jupyter需要python的运行环境,而我们又需要支持scala,所以首先需要在MacOS上安装对两种编程语言python和scala的支持。因为我使用的MacOS软件包管理系统是MacPorts,所以就用其来安装这两种语言了。MacPorts可以安装多个版本的python和scala语言。

  • 参考conda的安装下载网站,目前需要的python版本是3.8,所以就用MacPorts安装python38。
  • 参考almond安装的scala版本组合,我选择了最新的scala版本2.13.x,所以用MacPorts安装scala2.13。
sudo port install python38 python3_select
sudo port install scala2.13 scala_select

如果你已经安装了多个版本的python或scala,则可以用port select来设置正确的版本:

sudo port select --list python
sudo port select --set python python38
sudo port select --list scala
sudo port select --set scala scala2.13

安装conda和jupyter

按照conda的安装指导,我选择了安装Miniconda。下载了Miniconda3-latest-MacOSX-x86_64.sh,然后直接运行:

bash Miniconda3-latest-MacOSX-x86_64.sh

安装在了我自己的用户目录下:~/miniconda3,而且在文件~/.zshrc中添加了一段初始化代码:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/timothyzhang/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/timothyzhang/miniconda3/etc/profile.d/conda.sh" ]; then
. "/Users/timothyzhang/miniconda3/etc/profile.d/conda.sh"
else
export PATH="/Users/timothyzhang/miniconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<

因为我使用了管理Zsh配置的Oh My Zsh框架,而且配置了Spaceship ZSH的提示符,所以会在我的iTerm终端界面显示一个蓝色底色的C字符:

Spaceship ZSH配置下的Conda环境提示符

可以验证,当前的conda环境取代了之前系统的python和pip等等:

(base)
~ via 🅒 base
➜ which pip
/Users/timothyzhang/miniconda3/bin/pip
(base)
~ via 🅒 base
➜ which python
/Users/timothyzhang/miniconda3/bin/python

接下来安装jupyter,参考其安装文档,选择conda环境的安装方式:

conda install -c conda-forge jupyterlab

直接运行:

jupyter lab

就能看到JupyterLab的界面了:

JupyterLab的初始Launcher界面

安装Almond的Scala核,并配置使用Spark

参考Almond的安装文档,其需要coursier依赖解析器。所以我先安装coursier,参考其文档,我选择了最开始的这个安装方式:

curl -fLo cs https://git.io/coursier-cli-"$(uname | tr LD ld)" chmod +x cs ./cs

然后直接按照Almond的文档安装,这里我选择了Almond和Scala的最新组合版本:

./cs launch --fork almond:0.10.9 --scala 2.13 -- --install

重启JupyterLab,在Notebook和Console中都能看到Scala的新图标:

安装了Almond的Scala核的初始Jupyter Launcher界面

至此,我们就可以开始学习使用Almond的Scala核,来尝试各种scala的应用了。以下是一些进一步学习的材料:

接下来,我尝试在notebook中使用最新版本的Spark,但报错找不到org.apache.spark:spark-sql_2.13:3.0.1。

实际上,当前spark 3.0.1只支持scala版本2.12,所以:

  • 终止当前的JupyterLab进程
  • 删除当前的Almond
  • 重新用MacPorts选择/安装Scala 2.12的包
  • 并重新安装指定Scala 2.12的Almond
  • 重新启动JupyterLab,并尝试Spark
jupyter kernelspec remove scalasudo port select --set scala scala2.12./cs launch --fork almond:0.10.9 --scala 2.12 -- --installjupyter lab

这样,就能正常使用Spark了。

以上例子中,我添加了压制产生Log的代码。而且,如果你使用新的Spark的包,则需要import相应的repository,例如这个例子中的mllib包。

--

--