Ubuntu 22.04 安装 Apache Toree 指南

在 Ubuntu 22.04 上从零安装 Apache Toree 0.5.0-incubating,覆盖 JDK 兼容性实测(JDK 17 两种失败模式与 JDK 8 可用路径)、Spark 3.0.3 配对、pip 与官方 bin 包两种安装方案、内核注册与 notebook 真实执行验证,命令回显均实测通过。

Apache ToreeApache Toree2026/10/15

Ubuntu 22.04 安装 Apache Toree 指南

目标:在 Ubuntu 22.04 上从零搭建 Apache Toree 0.5.0-incubating 的 Jupyter 内核环境(JDK 8 + Spark 3.0.3 + Jupyter),完成内核注册并在 notebook 中真实执行 Scala 与 Spark 代码;同时给出 JDK 17 的兼容性实测结论与两种安装方案的选择建议。本文全部命令与回显均已在 Ubuntu 22.04 实测通过。

Apache Toree 是 Apache 软件基金会的 Jupyter 内核,让 notebook 通过 Scala/SQL 与 Apache Spark 交互。它的安装本质是「装好 JDK 与 Spark → pip 安装 toree(或用官方 bin 包)→ jupyter toree install 注册内核 → 执行 notebook 验证」。与普通库不同,Toree 内核运行时通过 spark-submit 启动,对 Spark 版本、Scala 版本与 JDK 版本的配对非常敏感,本文的版本选型一节给出实测结论。

一、环境信息

本节先固定可复现的基线环境,后续所有命令均在此环境执行。

  • 操作系统:Ubuntu 22.04.5 LTS(PRETTY_NAME="Ubuntu 22.04.5 LTS")
  • 架构:x86_64
  • Python:3.10.12(系统自带 python3,另装 python3-pip)
  • JDK:OpenJDK 1.8.0_504(apt 包 openjdk-8-jdk;另装 openjdk-17-jdk 用于兼容性实测)
  • Spark:spark-3.0.3-bin-hadoop2.7(安装到 /usr/local/spark)
  • Jupyter:jupyter_core 5.9.1、notebook 7.6.3、jupyterlab 4.6.4(pip 安装)
  • 组件版本:apache-toree 0.5.0(PyPI 包名,内核 jar 为 toree-assembly-0.5.0-incubating.jar)
  • 验证用工作目录:/root/toree-test

系统与组件确认(实时回显):

cat /etc/os-release | head -2 && uname -m && python3 --version
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
x86_64
Python 3.10.12

💡 说明:Apache Toree 官方 pip 包名是 apache-toree(官方 Quick Start 文档所用),PyPI 上的 toree 是同一发布的别名包,两者 0.5.0 均于 2022-04-21 上传。本文统一使用官方文档的 apache-toree。

二、前置条件

本节说明安装前必须满足的条件。

  1. 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
  2. 可访问 Ubuntu 软件源(本文换用 mirrors.aliyun.com 加速)。
  3. 可访问 PyPI 镜像源(本文使用清华源 pypi.tuna.tsinghua.edu.cn)、Maven 中央仓库 repo1.maven.org(%AddJar/%AddDeps 下载依赖时用)。
  4. 可访问 Apache Spark 发行包镜像(本文使用华为云镜像 mirrors.huaweicloud.com)。
  5. 至少 4 GB 可用磁盘空间(Spark 发行包约 220 MB,解压后约 700 MB)。

软件源连通性确认(实时回显):

curl -sI --max-time 15 https://pypi.tuna.tsinghua.edu.cn/simple/ | head -1
curl -sI --max-time 15 https://mirrors.huaweicloud.com/apache/spark/spark-3.0.3/spark-3.0.3-bin-hadoop2.7.tgz | head -1
HTTP/2 200
HTTP/1.1 200 OK

⚠️ 注意:Toree 官方归档站 archive.apache.org 实测下载速度极慢(数 MB 的 bin 包需数分钟),Spark 发行包请优先使用国内镜像,下载后用官方 sha512 校验(见 4.3 节)。

三、版本选型说明

本节给出 Toree 的版本谱系与配套要求。Toree 是低频维护项目:PyPI 上 0.5.0 于 2022-04-21 发布后至今无新版本,Maven Central 上 org.apache.toree:toree-assembly 的最新坐标同样是 0.5.0-incubating;仓库中存在 v0.6.0-incubating-rc6 候选标签但从未正式发布。0.5.0 仍是官方当前唯一可用主线,代码仓库未被归档。

各版本发布时间线(PyPI 实测查询):

版本发布日期(PyPI 上传时间)备注
0.1.0-incubating2017-04-17首个 Apache 发布
0.2.0-incubating2018-08-14支持 Spark 2.x
0.3.0-incubating2018-11-12移除 PySpark/R 内置解释器
0.4.0-incubating2020-08-01依赖对齐 Spark 2.3.x
0.5.0-incubating2022-04-21当前最新,官方测试基线为 Spark 3.0.3

Spark 配对是 Toree 安装的第一决策项。Toree 0.5.0 官方集成测试基线(仓库 v0.5.0 标签的测试环境定义文件 toree-dev)使用的是 Spark 3.0.3 + OpenJDK 8。本文按此基线实测,并额外实测了 JDK 17 的两种失败模式:

组合实测结果关键报错
Toree 0.5.0 + Spark 2.4.8(Scala 2.11 构建)+ JDK 8不可用java.lang.NoSuchMethodError: 'void scala.App.$init$(scala.App)'(内核按 Scala 2.12 编译,需 Spark 3.0.x 的 Scala 2.12 运行时)
Toree 0.5.0 + Spark 3.0.3 + JDK 17.0.20.1不可用java.lang.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int) accessible: module java.base does not "opens java.nio"(Spark 3.0 不支持 JDK 16+)
Toree 0.5.0 + Spark 3.0.3 + JDK 8(1.8.0_504)可用无

结论:Ubuntu 22.04 上安装 Toree 0.5.0 请使用 JDK 8 + Spark 3.0.3(bin-hadoop2.7,Scala 2.12 构建)。本文实际采用 0.5.0-incubating,JDK 选 8。

💡 技术拓展:Jupyter 生态中「连接 Spark 的内核」不止 Apache Toree 一家,常见方案对比如下——

方案语言原理特点适用场景
Apache ToreeScala/SQLJVM 原生内核,经 spark-submit 启动SparkContext/SparkSession 直接暴露为变量,%AddJar/%AddDeps 动态加载,SQL magic 内置以 Scala 为主的交互式 Spark 开发
sparkmagicPython/PySpark通过 Livy REST 代理远端 Spark需部署 Livy 服务;支持 %%spark magic 远程执行团队共享远端 Spark 集群、Python 技术栈
almondScala基于 Scala.js/ coursier 的纯 Scala 内核不绑定 Spark,可作为普通 Scala 内核;接 Spark 需自行引依赖并装配 launcher纯 Scala 数据探索、轻量 notebook
pyspark 内核Python直接用 ipykernel 包装 pyspark 启动器无 magic 体系,靠 spark-submit 预配置只用 PySpark 的简单场景

本文采用 Apache Toree,理由是它对 Scala + Spark 的交互式开发提供了开箱即用的变量绑定(sc、spark)、SQL magic 与依赖加载能力,且官方测试基线明确(Spark 3.0.3 + JDK 8),配对路径可复现。

四、方案 A:pip 安装(官方 Quick Start 路径,推荐)

本节按官方 Quick Start 的路径完成安装:apt 装 JDK 8 → pip 装 Jupyter 与 apache-toree → 下载解压 Spark 3.0.3 → jupyter toree install 注册内核 → 执行 notebook 验证。

4.1 方案说明

方案 A 的链路是:apt 安装 openjdk-8-jdk → pip3 install jupyter apache-toree → 下载 Spark 3.0.3 到 /usr/local/spark → jupyter toree install --spark_home=/usr/local/spark(内核注册到 /usr/local/share/jupyter/kernels/apache_toree_scala)→ jupyter nbconvert --execute 跑通首个 notebook。pip 包内已捆绑内核 jar(toree/lib/toree-assembly-0.5.0-incubating.jar),无需单独下载。

4.2 安装 JDK 8 并切换默认 java

apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y python3-pip openjdk-8-jdk curl
# 输出节选(实测末尾)
Setting up openjdk-8-jdk:amd64 (8u504-ga-1ubuntu1~22.04.3) ...

若系统同时装有 JDK 17(或先装了 17),用 update-alternatives 把默认 java 切回 8:

update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
java -version
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode
openjdk version "1.8.0_504"
OpenJDK Runtime Environment (build 1.8.0_504-8u504-ga-1ubuntu1~22.04.3-b01)
OpenJDK 64-Bit Server VM (build 25.504-ga-1ubuntu1~22.04.3-b01, mixed mode)

验证点:java -version 输出 1.8.0_504。Toree 0.5.0 配 Spark 3.0.3 时必须以 JDK 8 运行(JDK 17 失败结论见第三章表格与第九章 FAQ)。

4.3 安装 Jupyter 与 apache-toree

pip3 install jupyter apache-toree -i https://pypi.tuna.tsinghua.edu.cn/simple
# 输出节选(实测末尾)
Successfully installed apache-toree-0.5.0 ... jupyter-1.1.1 jupyter_core-5.9.1 notebook-7.6.3 ...

确认安装结果:

pip3 show apache-toree | grep -E '^(Name|Version|Location)'
Name: apache-toree
Version: 0.5.0
Location: /usr/local/lib/python3.10/dist-packages

确认 pip 包内已捆绑内核 jar(这就是无需单独下载 assembly jar 的原因):

ls /usr/local/lib/python3.10/dist-packages/toree/lib/
toree-assembly-0.5.0-incubating.jar

4.4 安装 Spark 3.0.3

从华为云镜像下载并用官方 sha512 值校验(官方值来自 archive.apache.org/dist/spark/spark-3.0.3/spark-3.0.3-bin-hadoop2.7.tgz.sha512):

cd /root && curl -sO --max-time 300 https://mirrors.huaweicloud.com/apache/spark/spark-3.0.3/spark-3.0.3-bin-hadoop2.7.tgz
echo "27082142c256feef390686e3bbd9a132b63e2b46681d2e2a7038c0b30c9c482ae46224c4a2c029ce0019e6c9b4ce1917018d2ff17b6723a9144595e73cef23df  spark-3.0.3-bin-hadoop2.7.tgz" | sha512sum -c -
spark-3.0.3-bin-hadoop2.7.tgz: OK

解压到 /usr/local/spark(--strip-components=1 去掉顶层目录):

mkdir -p /usr/local/spark
tar xzf spark-3.0.3-bin-hadoop2.7.tgz -C /usr/local/spark --strip-components=1
ls /usr/local/spark/jars/ | grep -E 'spark-core|scala-library'
scala-library-2.12.10.jar
spark-core_2.12-3.0.3.jar

验证点:jars 目录下出现 spark-core_2.12-3.0.3.jar,确认是 Scala 2.12 构建的 Spark 3.0.3(与第三章选型一致)。ls /usr/local/spark/jars/ | grep spark-core 若出现 spark-core_2.11-2.4.8.jar 之类,说明解压混入了旧版本,先 rm -rf /usr/local/spark 再重新解压。

4.5 注册 Toree 内核

jupyter toree install --spark_home=/usr/local/spark
[ToreeInstall] Creating kernel Scala
[ToreeInstall] Installed kernelspec apache_toree_scala in /usr/local/share/jupyter/kernels/apache_toree_scala

列出内核确认注册:

jupyter kernelspec list
Available kernels:
  apache_toree_scala    /usr/local/share/jupyter/kernels/apache_toree_scala
  python3               /usr/local/share/jupyter/kernels/python3

查看自动生成的 kernel.json(内核启动参数与环境的全部事实来源):

cat /usr/local/share/jupyter/kernels/apache_toree_scala/kernel.json
{
  "argv": [
    "/usr/local/share/jupyter/kernels/apache_toree_scala/bin/run.sh",
    "--profile",
    "{connection_file}"
  ],
  "env": {
    "DEFAULT_INTERPRETER": "Scala",
    "__TOREE_SPARK_OPTS__": "",
    "__TOREE_OPTS__": "",
    "SPARK_HOME": "/usr/local/spark"
  },
  "display_name": "Apache Toree - Scala",
  "language": "scala",
  "interrupt_mode": "signal",
  "metadata": {},
  "kernel_protocol_version": ""
}

逐项说明:

  • argv:Jupyter 通过执行 bin/run.sh --profile {connection_file} 启动内核({connection_file} 由 Jupyter 运行时替换为实际连接文件路径);run.sh 内部实际执行 ${SPARK_HOME}/bin/spark-submit --name 'Apache Toree' --class org.apache.toree.Main /usr/local/share/jupyter/kernels/apache_toree_scala/lib/toree-assembly-0.5.0-incubating.jar。
  • env.SPARK_HOME:内核目录下的 run.sh 读取它定位 Spark 发行包,必须指向 4.4 节解压的目录。
  • env.DEFAULT_INTERPRETER:默认解释器为 Scala。
  • env.__TOREE_SPARK_OPTS__ / env.__TOREE_OPTS__:安装时通过 --spark_opts/--toree_opts 传入的参数会写入这两个占位环境变量,运行时可被同名外部变量覆盖。

4.6 首个 notebook 执行验证

生成测试 notebook(一个 Scala 单元格:定义变量、打印、求值):

mkdir -p /root/toree-test && cd /root/toree-test && python3 - <<'EOF'
import json
nb = {
 'cells': [
  {'cell_type':'code','execution_count':None,'id':'c1','metadata':{},'outputs':[],
   'source':['val msg = "Hello Apache Toree"\n','println(msg)\n','1 + 1']},
 ],
 'metadata': {'kernelspec': {'display_name': 'Apache Toree - Scala', 'language': 'scala', 'name': 'apache_toree_scala'},
              'language_info': {'name': 'scala'}},
 'nbformat': 4, 'nbformat_minor': 5
}
open('jdk8-test.ipynb','w').write(json.dumps(nb, indent=1))
print('notebook written')
EOF
notebook written

用 jupyter nbconvert --execute 真实启动内核执行:

cd /root/toree-test && timeout 300 jupyter nbconvert --to notebook --execute --ExecutePreprocessor.timeout=240 jdk8-test.ipynb --output jdk8-test-out.ipynb
[NbConvertApp] Writing 1302 bytes to jdk8-test-out.ipynb

提取执行结果:

python3 -c "
import json
nb=json.load(open('/root/toree-test/jdk8-test-out.ipynb'))
for c in nb['cells']:
    for o in c.get('outputs',[]):
        t=o.get('output_type')
        if 'text' in o: print('['+t+']', ''.join(o['text']).rstrip())
        elif 'data' in o: print('['+t+']', {k: ''.join(v).rstrip() for k,v in o['data'].items()})
"
[stream] Hello Apache Toree
[display_data] {'text/plain': 'msg = Hello Apache Toree'}
[execute_result] {'text/plain': '2'}

结果解读:stream 输出 Hello Apache Toree 来自 println(msg);display_data 是 Scala 解释器对 val msg = "Hello Apache Toree" 的变量回显;execute_result 的 2 是单元格最后一行表达式 1 + 1 的求值结果。三类输出齐全说明内核的 shell/iopub 通道全部正常,Spark 3.0.3 + JDK 8 下内核启动成功。

4.7 验证清单

以下全部通过即安装成功:

检查项预期(实测值)不符时排查
java -version1.8.0_504仍为 17 → 4.2 节 update-alternatives
pip3 show apache-toreeVersion: 0.5.0装成旧版 → 检查镜像源与 pip 版本
`ls /usr/local/spark/jars/grep spark-core`spark-core_2.12-3.0.3.jar
jupyter kernelspec list出现 apache_toree_scala缺失 → 重跑 4.5 节,加 --debug 看日志
nbconvert 执行Hello Apache Toree + 2Kernel died before replying to kernel_info → 检查 JDK 与 Spark 配对(第三章表)

五、方案 B:官方 bin 包 + 手工注册 kernelspec(不依赖 pip toree)

本节面向不能使用 pip 安装 apache-toree 的环境:直接使用 Apache 官方归档的 toree-0.5.0-incubating-bin.tar.gz(内含 bin/run.sh 与 lib/toree-assembly-0.5.0-incubating.jar),手工构造 kernelspec 目录完成注册。Jupyter/nbconvert 本身仍需可用(仅依赖 jupyter_core/jupyter_client,不依赖 apache-toree 包)。

5.1 方案说明

链路是:下载官方 bin 包并校验 sha512 → 解压到 /opt/toree-bin → 复制 bin/、lib/ 到内核目录 /usr/local/share/jupyter/kernels/apache_toree_manual → 手写 kernel.json(与 pip 方案生成的结构完全一致)→ jupyter kernelspec list 确认 → nbconvert 执行验证。适用于离线机器先在有网环境取包、再拷贝安装的场景。

5.2 下载与完整性校验

cd /root && curl -sO --max-time 300 https://archive.apache.org/dist/incubator/toree/0.5.0-incubating/toree/toree-0.5.0-incubating-bin.tar.gz
curl -sO --max-time 60 https://archive.apache.org/dist/incubator/toree/0.5.0-incubating/toree/toree-0.5.0-incubating-bin.tar.gz.sha512
sha512sum -c toree-0.5.0-incubating-bin.tar.gz.sha512
toree-0.5.0-incubating-bin.tar.gz: OK

解压并确认内容:

mkdir -p /opt/toree-bin && tar xzf toree-0.5.0-incubating-bin.tar.gz -C /opt/toree-bin --strip-components=1
cat /opt/toree-bin/VERSION
ls /opt/toree-bin/bin /opt/toree-bin/lib
VERSION: 0.5.0-incubating
COMMIT: a803d295d90b
bin:
run.sh

lib:
toree-assembly-0.5.0-incubating.jar

5.3 手工注册 kernelspec

K=/usr/local/share/jupyter/kernels/apache_toree_manual
mkdir -p $K
cp -r /opt/toree-bin/bin /opt/toree-bin/lib $K/
cat > $K/kernel.json <<'EOF'
{
  "argv": [
    "/usr/local/share/jupyter/kernels/apache_toree_manual/bin/run.sh",
    "--profile",
    "{connection_file}"
  ],
  "env": {
    "DEFAULT_INTERPRETER": "Scala",
    "__TOREE_SPARK_OPTS__": "",
    "__TOREE_OPTS__": "",
    "SPARK_HOME": "/usr/local/spark"
  },
  "display_name": "Apache Toree - Scala (manual)",
  "language": "scala",
  "interrupt_mode": "signal",
  "metadata": {}
}
EOF

逐项说明:argv 第一项是 bin 包内自带的 run.sh 绝对路径;env 四个键与 pip 方案生成的 kernel.json 完全一致(run.sh 按同样的键名读取);display_name 可自定义。cp -r 保留了 run.sh 的可执行权限(-rwxr-xr-x),若权限丢失用 chmod +x $K/bin/run.sh 补上。

jupyter kernelspec list
Available kernels:
  apache_toree_manual    /usr/local/share/jupyter/kernels/apache_toree_manual
  python3                /usr/local/share/jupyter/kernels/python3

5.4 执行验证

生成 notebook(内核名填 apache_toree_manual)并执行:

cd /root/toree-test && python3 - <<'EOF'
import json
def code(src): return {'cell_type':'code','execution_count':None,'metadata':{},'outputs':[],'source':src.splitlines(True)}
nb={'cells':[code('val name = "manual-kernelspec"\nprintln(s"Hello from $name")\n2 * 21'),
             code('val rdd = sc.parallelize(1 to 50)\nprintln("spark sum=" + rdd.sum())')],
   'metadata':{'kernelspec':{'display_name':'Apache Toree - Scala (manual)','language':'scala','name':'apache_toree_manual'},'language_info':{'name':'scala'}},'nbformat':4,'nbformat_minor':5}
open('manual-test.ipynb','w').write(json.dumps(nb, indent=1))
print('written')
EOF
timeout 300 jupyter nbconvert --to notebook --execute --ExecutePreprocessor.timeout=240 manual-test.ipynb --output manual-test-out.ipynb
written
[NbConvertApp] Writing 2352 bytes to manual-test-out.ipynb

提取结果:

[stream] Hello from manual-kernelspec
[display_data] {'text/plain': 'name = manual-kernelspec'}
[execute_result] {'text/plain': '42'}
[stream] spark sum=1275.0

验证点:spark sum=1275.0(1 到 50 求和)说明第二个单元格真实创建了 SparkContext 并执行了 RDD 计算,手工注册的内核与 pip 注册的内核行为一致。补充一个交叉验证的事实:Maven Central 的 toree-assembly-0.5.0-incubating.jar 与 pip 包内捆绑的 jar 的 sha512 完全一致(均为 3fb8a363e9ef86553c39c2dd43f0e3c79d1599309fd14e711af94841331cadd99caef32332438b261ea9f3c195ebf53802ba8b01aad22abd6cf4cc7db1b5f6c0),因此用 Maven Central 下载的 jar 替换 lib/ 下的 jar 是等价操作。

六、方案对比与选择建议

两种方案产出同一份内核代码(同一 jar、同一 run.sh),差别只在装配方式:

维度方案 A:pip 安装方案 B:bin 包 + 手工注册
是否需要 pip需要(jupyter + apache-toree)仅需 jupyter_core/jupyter_client
内核 jar 来源pip 包内捆绑官方 bin 包(或 Maven Central jar)
注册方式jupyter toree install 自动生成 kernel.json手工编写 kernel.json
多解释器(Scala/SQL)--interpreters=Scala,SQL 一次注册多个每个解释器手工建一个内核目录
升级方式pip install -U + --replace 重装替换 lib 下 jar + 核对 run.sh
适用场景常规联网服务器(推荐)离线机器、受限环境

选型建议:能联网用 pip 就选方案 A,注册、升级、多解释器全部自动化;离线或 pip 受限时选方案 B,kernel.json 内容照抄本文 5.3 节即可,唯一要改的是 SPARK_HOME 与 argv 中的绝对路径。

七、基础配置

本节说明安装后最常调整的三处配置。

SPARK_HOME:注册内核时通过 --spark_home 写入 kernel.json 的 env,决定内核用哪个 Spark。改配对 Spark 版本时用 --replace 重新注册:

jupyter toree install --spark_home=/usr/local/spark --replace
[ToreeInstall] Creating kernel Scala
[ToreeInstall] Installed kernelspec apache_toree_scala in /usr/local/share/jupyter/kernels/apache_toree_scala

Spark 参数:--spark_opts 写入 __TOREE_SPARK_OPTS__,例如固定 master:

jupyter toree install --spark_home=/usr/local/spark --spark_opts='--master=local[2]' --kernel_name='Toree Local2' --replace
[ToreeInstall] Creating kernel Scala
[ToreeInstall] Installed kernelspec toree_local2_scala in /usr/local/share/jupyter/kernels/toree_local2_scala

用该内核执行 println("master=" + sc.master) 的实测输出:

master=local[2]
appName=Apache Toree

Toree 参数:--toree_opts 写入 __TOREE_OPTS__,常用 --spark-context-initialization-mode(详见第 5 篇《Apache Toree 0.5.0-incubating Spark 集成进阶实战详解》)。安装到虚拟环境/conda 时加 --sys-prefix,只装给当前用户加 --user。环境变量 JAVA_HOME 无需显式设置(/usr/bin/java 已由 update-alternatives 指向 8);若通过 systemd 等方式启动 Jupyter 且 PATH 不含 java,再显式 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64。

八、常见问题(FAQ)

Q1:执行单元格报 RuntimeError: Kernel died before replying to kernel_info? 内核进程启动即崩溃,绝大多数是版本配对问题。实测两种根因:JDK 17 下报 java.lang.InaccessibleObjectException: ... does not "opens java.nio"(Spark 3.0 不支持 JDK 16+),或 Spark 2.4.x(Scala 2.11 构建)下报 java.lang.NoSuchMethodError: 'void scala.App.$init$(scala.App)'(Toree 0.5.0 按 Scala 2.12 编译)。排查顺序:java -version 确认 8 → ls $SPARK_HOME/jars | grep spark-core 确认 _2.12-3.0.3。也可手动复现定位:$SPARK_HOME/bin/spark-submit --class org.apache.toree.Main <内核目录>/lib/toree-assembly-0.5.0-incubating.jar --spark-context-initialization-mode none,报错直接可见。

Q2:jupyter toree install 报 Unknown interpreter xxx. Skipping installation? --interpreters 的合法值只有 Scala 与 SQL(区分大小写),逗号分隔。PySpark 与 Spark R 内置解释器在 0.3.0 起已移除(官方 RELEASE_NOTES 明示),传 PySpark 会得到上面的报错。

Q3:Spark 下载很慢或超时? 官方归档站 archive.apache.org 实测速度只有几十 KB/s。改用 mirrors.huaweicloud.com/apache/spark/ 等国内镜像(本文 4.4 节实测约 1 分钟内完成 220 MB),下载后务必用官方 sha512 校验。

Q4:单元格执行后输出里有 WARN StandardComponentInitialization$$anon$1: Unable to control initialization of REPL class server!? 这是 Toree 0.5.0 在部分环境下对 REPL 类加载器控制的告警,实测不影响任何功能(所有单元格正常执行与求值),可忽略。另有 WARN KernelOutputStream: Suppressing empty output: '' 属正常抑制空输出行为。

Q5:notebook 里用不了 sqlContext 变量? 实测 Toree 0.5.0 + Spark 3.0.3 未预定义 sqlContext,直接使用报 error: not found: value sqlContext。SparkSession 变量 spark 可用(spark.sql("SELECT 1+1 AS two").show() 正常),SQL 单元格用 %%SQL magic(实测返回结果表)。SQL 专属内核(--interpreters=SQL)在 0.5.0 实测存在执行挂起问题,见第 5 篇。

Q6:%AddJar 第二次执行为什么输出 Using cached version of xxx.jar? %AddJar 会把下载的 jar 缓存,第二次引用同一 URL 时直接用缓存不再下载,属正常行为。若要强制重新下载需清理内核的缓存目录(默认在内核进程的临时目录下,重启内核即重建)。

九、卸载与清理

移除已注册的内核:

jupyter kernelspec remove apache_toree_scala -y
Kernel specs to remove:
  apache_toree_scala    /usr/local/share/jupyter/kernels/apache_toree_scala
Removed 1 kernelspecs

卸载 pip 包(jupyter 与 apache-toree 可分别卸载):

pip3 uninstall -y apache-toree
Successfully uninstalled apache-toree-0.5.0

清理 Spark 与验证目录(确认不再需要后再执行):

rm -rf /usr/local/spark /root/spark-3.0.3-bin-hadoop2.7.tgz /root/toree-test /opt/toree-bin /root/toree-0.5.0-incubating-bin.tar.gz*
ls /root/spark-3.0.3-bin-hadoop2.7.tgz 2>&1
ls: cannot access '/root/spark-3.0.3-bin-hadoop2.7.tgz': No such file or directory

卸载 JDK(仅当不再需要;先 -s 预演确认再真删):

apt-get -s purge -y openjdk-8-jdk | tail -3
# 输出节选(实测)
The following packages will be REMOVED:
  openjdk-8-jdk*
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

十、参考链接

  1. Apache Toree 官方站点与 Quick Start:https://toree.apache.org/docs/current/user/quick-start
  2. 官方 Installation 文档(jupyter toree install 全参数):https://toree.apache.org/docs/current/user/installation
  3. PyPI apache-toree 包页:https://pypi.org/project/apache-toree/
  4. Maven Central toree-assembly 坐标:https://repo1.maven.org/maven2/org/apache/toree/toree-assembly/
  5. Toree 0.5.0-incubating 官方 bin 包(archive):https://archive.apache.org/dist/incubator/toree/0.5.0-incubating/toree/
  6. Spark 3.0.3 下载与 sha512:https://archive.apache.org/dist/spark/spark-3.0.3/
  7. Toree 源码仓库(版本标签与官方测试镜像):https://github.com/apache/incubator-toree