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 真实执行验证,命令回显均实测通过。
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。
二、前置条件
本节说明安装前必须满足的条件。
- 具有 root 或 sudo 权限的 Ubuntu 22.04 系统。
- 可访问 Ubuntu 软件源(本文换用
mirrors.aliyun.com加速)。 - 可访问 PyPI 镜像源(本文使用清华源
pypi.tuna.tsinghua.edu.cn)、Maven 中央仓库repo1.maven.org(%AddJar/%AddDeps下载依赖时用)。 - 可访问 Apache Spark 发行包镜像(本文使用华为云镜像
mirrors.huaweicloud.com)。 - 至少 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-incubating | 2017-04-17 | 首个 Apache 发布 |
| 0.2.0-incubating | 2018-08-14 | 支持 Spark 2.x |
| 0.3.0-incubating | 2018-11-12 | 移除 PySpark/R 内置解释器 |
| 0.4.0-incubating | 2020-08-01 | 依赖对齐 Spark 2.3.x |
| 0.5.0-incubating | 2022-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 Toree Scala/SQL JVM 原生内核,经 spark-submit 启动 SparkContext/SparkSession 直接暴露为变量,%AddJar/%AddDeps 动态加载,SQL magic 内置 以 Scala 为主的交互式 Spark 开发 sparkmagic Python/PySpark 通过 Livy REST 代理远端 Spark 需部署 Livy 服务;支持 %%spark magic 远程执行 团队共享远端 Spark 集群、Python 技术栈 almond Scala 基于 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 -version | 1.8.0_504 | 仍为 17 → 4.2 节 update-alternatives |
pip3 show apache-toree | Version: 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 + 2 | Kernel 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.
十、参考链接
- Apache Toree 官方站点与 Quick Start:https://toree.apache.org/docs/current/user/quick-start
- 官方 Installation 文档(jupyter toree install 全参数):https://toree.apache.org/docs/current/user/installation
- PyPI apache-toree 包页:https://pypi.org/project/apache-toree/
- Maven Central toree-assembly 坐标:https://repo1.maven.org/maven2/org/apache/toree/toree-assembly/
- Toree 0.5.0-incubating 官方 bin 包(archive):https://archive.apache.org/dist/incubator/toree/0.5.0-incubating/toree/
- Spark 3.0.3 下载与 sha512:https://archive.apache.org/dist/spark/spark-3.0.3/
- Toree 源码仓库(版本标签与官方测试镜像):https://github.com/apache/incubator-toree