為了支持Spark REPL功能,阿里云數據湖分析團隊推出了本地安裝Jupyter Lab和DLA Proxy、使用Docker快速啟動環境兩種方案,幫助用戶將本地Jupyter Lab和阿里云DLA Spark連接在一起,從而可以利用DLA的彈性資源進行交互測試和計算。
云原生數據湖分析(DLA)產品已退市,云原生數據倉庫 AnalyticDB MySQL 版湖倉版支持DLA已有功能,并提供更多的功能和更好的性能。AnalyticDB for MySQL相關使用文檔,請參見Jupyter交互式作業開發。
注意事項
DLA Spark當前支持python3,Scala 2.11的Jupyter可交互作業。
新版Jupyter Lab對Python的最低版本要求是Python 3.6。
推薦使用Docker快速啟動環境方式來使用本功能。
交互式作業會在空閑一段時間后自動釋放,默認釋放時間為最后一個代碼塊執行完畢后1200秒。用戶可以通過
spark.dla.session.ttl
來配置空閑多長時間后自動釋放交互式作業。
本地安裝Jupyter Lab和DLA Proxy
安裝DLA Livy Proxy。
- 說明
Aliyun OpenAPI SDK的最低版本要求是
2.0.4
。 使用以下命令安裝Aliyun DLA Livy Proxy。
pip install aliyun-dla-livy-proxy-0.0.5.zip
說明您需要使用root用戶安裝Aliyun DLA Livy Proxy,非root用戶進行安裝可能無法注冊命令到可執行目錄中。Aliyun DLA Livy Proxy安裝完成后,您可以在命令行中找到
dlaproxy
命令。啟動DLA Livy Proxy。
DLA Livy Proxy用于將阿里云DLA的接口翻譯為
SparkMagic
需要的Apache Livy
語義接口,從而在本地建立HTTP PROXY監聽與轉發,端口默認是5000
。# 查看dlaproxy命令使用方式。 $dlaproxy -h usage: dlaproxy [-h] --vcname VCNAME -i AK -k SECRET --region REGION [--host HOST] [--port PORT] [--loglevel LOGLEVEL] Proxy AliYun DLA as Livy optional arguments: -h, --help show this help message and exit --vcname VCNAME Virtual Cluster Name -i AK, --access-key-id AK Aliyun Access Key Id -k SECRET, --access-key-secret SECRET Aliyun Access Key Secret --region REGION Aliyun Region Id --host HOST Proxy Host Ip --port PORT Proxy Host Port --loglevel LOGLEVEL python standard log level # 直接啟動dla livy proxy。 dlaproxy --vcname <vcname> -i akid -k aksec --region <regionid>
上述代碼中出現的輸入參數說明如下:
參數名稱
參數說明
--vcname
DLA Spark虛擬集群名稱。
說明您可以登錄Data Lake Analytics控制臺,在 中查看虛擬集群名稱。
-i
RAM用戶的AccessKey ID。
說明如果您已經創建了AccessKey,可以在RAM控制臺上查看相關信息。關于如何查看以及創建AccessKey,請參見創建AccessKey。
-k
RAM用戶的AccessKey Secret。
說明如果您已經創建了AccessKey,可以在RAM控制臺上查看相關信息。關于如何查看以及創建AccessKey,請參見創建AccessKey。
--region
DLA所在地域對應的Region ID,詳細信息請參見地域和可用區。
--host
服務綁定的Host,默認為127.0.0.1, 僅代理本地請求。可以修改為0.0.0.0或者其它地址監聽公網/內網的請求并代理,建議使用默認值。
--port
監聽端口, 默認為5000, 可以修改為其它端口,建議使用默認值。
--loglevel
日志級別, 默認為INFO,可以修改為ERROR、 WARNING、 INFO或DEBUG,建議使用默認值。
安裝Jupyter Lab。
可選:安裝venv。
說明推薦將整套環境安裝到Virtual Environment環境中,這樣后續的安裝不會破壞主賬號下的公共Python環境。
使用以下命令安裝Jupyter lab。
pip install jupyterlab #安裝Jupyter Lab。 jupyter lab #驗證一下是否安裝成功, 成功安裝的話, 可以看到啟動日志。
按照如下步驟安裝Sparkmagic。
安裝庫。
pip install sparkmagic
確保ipywidgets成功運行。
jupyter nbextension enable --py --sys-prefix widgetsnbextension
如果您使用的是JupyterLab,需要運行如下命令。
jupyter labextension install "@jupyter-widgets/jupyterlab-manager"
使用
pip show sparkmagic
找到對應的文件夾,進入文件夾執行如下命令安裝kernels。jupyter-kernelspec install sparkmagic/kernels/sparkkernel jupyter-kernelspec install sparkmagic/kernels/pysparkkernel jupyter-kernelspec install sparkmagic/kernels/sparkrkernel
修改
~/.sparkmagic/config.json
上的配置文件,詳情請參見example_config.json。運行。
jupyter serverextension enable --py sparkmagic
安裝成功后,需要手動創建配置文件
~/.sparkmagic/config.json
,并將url
的配置指向本地開啟的代理。示例如下:{ "kernel_python_credentials" : { "username": "", "password": "", "url": "http://127.0.0.1:5000", "auth": "None" }, "kernel_scala_credentials" : { "username": "", "password": "", "url": " http://127.0.0.1:5000", "auth": "None" }, "kernel_r_credentials": { "username": "", "password": "", "url": "http://localhost:5000" }, "logging_config": { "version": 1, "formatters": { "magicsFormatter": { "format": "%(asctime)s\t%(levelname)s\t%(message)s", "datefmt": "" } }, "handlers": { "magicsHandler": { "class": "hdijupyterutils.filehandler.MagicsFileHandler", "formatter": "magicsFormatter", "home_path": "~/.sparkmagic" } }, "loggers": { "magicsLogger": { "handlers": ["magicsHandler"], "level": "DEBUG", "propagate": 0 } } }, "wait_for_idle_timeout_seconds": 15, "livy_session_startup_timeout_seconds": 600, "fatal_error_suggestion": "The code failed because of a fatal error:\n\t{}.\n\nSome things to try:\na) Make sure Spark has enough available resources for Jupyter to create a Spark context.\nb) Contact your Jupyter administrator to make sure the Spark magics library is configured correctly.\nc) Restart the kernel.", "ignore_ssl_errors": false, "session_configs": { "conf": { "spark.dla.connectors": "oss" } }, "use_auto_viz": true, "coerce_dataframe": true, "max_results_sql": 2500, "pyspark_dataframe_encoding": "utf-8", "heartbeat_refresh_seconds": 30, "livy_server_heartbeat_timeout_seconds": 0, "heartbeat_retry_seconds": 10, "server_extension_default_kernel_name": "pysparkkernel", "custom_headers": {}, "retry_policy": "configurable", "retry_seconds_to_sleep_list": [0.2, 0.5, 1, 3, 5], "configurable_retry_policy_max_retries": 8 }
說明示例中的
session_configs
是提交到DLA Spark的conf
部分,如果需要加載JAR包,連接DLA的元數據服務請參考作業配置指南。DLA Livy Proxy啟動后監聽的默認地址為
127.0.0.1:5000
,如果在啟動DLA Livy Proxy時修改了默認的Host和Port, 則需要修改上述配置文件中的url
部分。示例:啟動時指定地址--host 192.168.1.3 --port 8080
, 則應當將上述配置文件中的url
為http://192.168.1.3:8080
,修改后如下所示:{ "kernel_python_credentials" : { "username": "", "password": "", "url": "http://192.168.1.3:8080", "auth": "None" }, "kernel_scala_credentials" : { "username": "", "password": "", "url": "http://192.168.1.3:8080", "auth": "None" }, "kernel_r_credentials": { "username": "", "password": "", "url": "http://192.168.1.3:8080" }, "logging_config": { "version": 1, "formatters": { "magicsFormatter": { "format": "%(asctime)s\t%(levelname)s\t%(message)s", "datefmt": "" } }, "handlers": { "magicsHandler": { "class": "hdijupyterutils.filehandler.MagicsFileHandler", "formatter": "magicsFormatter", "home_path": "~/.sparkmagic" } }, "loggers": { "magicsLogger": { "handlers": ["magicsHandler"], "level": "DEBUG", "propagate": 0 } } }, "wait_for_idle_timeout_seconds": 15, "livy_session_startup_timeout_seconds": 600, "fatal_error_suggestion": "The code failed because of a fatal error:\n\t{}.\n\nSome things to try:\na) Make sure Spark has enough available resources for Jupyter to create a Spark context.\nb) Contact your Jupyter administrator to make sure the Spark magics library is configured correctly.\nc) Restart the kernel.", "ignore_ssl_errors": false, "session_configs": { "conf": { "spark.dla.connectors": "oss" } }, "use_auto_viz": true, "coerce_dataframe": true, "max_results_sql": 2500, "pyspark_dataframe_encoding": "utf-8", "heartbeat_refresh_seconds": 30, "livy_server_heartbeat_timeout_seconds": 0, "heartbeat_retry_seconds": 10, "server_extension_default_kernel_name": "pysparkkernel", "custom_headers": {}, "retry_policy": "configurable", "retry_seconds_to_sleep_list": [0.2, 0.5, 1, 3, 5], "configurable_retry_policy_max_retries": 8 }
運行Jupyter Lab。
# 重新啟動Jupyter Lab。 jupyter lab # 啟動DLA Livy Proxy。 dlaproxy --vcname vcname -i akid -k aksec --region <regionid>
Jupyter Lab啟動日志中會打印Jupyter Lab的本地地址。如下圖所示:
當系統出現提示
Aliyun DLA Proxy is ready
,表明DLA Livy Proxy啟動成功。DLA Livy Proxy啟動成功后,您就可以正常使用Jupyter Lab了。Jupyter Lab的使用文檔,請參考jupyterlab官方地址。運行Jupyter Lab任務,DLA中會自動創建DLA Spark作業,您可以登錄Data Lake Analytics控制臺,在 菜單進行查看和管理。如下圖所示,名稱以
notebook_
為開頭的Spark作業即為Jupyter交互式作業。當Jupyter Lab運行起來后,您仍然可以動態的修改配置,修改方式是在Jupyter Lab代碼單元中使用
magic
語句來覆蓋舊的配置項。執行后,Jupyter Lab會根據新的配置項重啟作業。# 重新啟動Jupyter Lab。 jupyter lab # 啟動DLA Livy Proxy。 dlaproxy --vcname vcname -i akid -k aksec --region <regionid>
%%configure -f { "conf": { "spark.sql.hive.metastore.version": "dla", "spark.dla.connectors": "oss" } }
如果需要使用自制的依賴方法,您可以參考下述配置。
%%configure -f { "conf": { ... }, "pyFiles": "oss://{your bucket name}/{path}/*.zip" # module }
關閉Jupyter Lab作業。
單擊JupyterLab Kernel菜單欄下的Restart Kernel。
使用Docker快速啟動環境
阿里云數據湖團隊同時提供Docker鏡像快速啟動一個Jupyter交互式開發環境,Docker的安裝和使用說明請參見Docker官方文檔。
安裝并啟動Docker后,使用如下命令拉取DLA Jupyter鏡像。
docker pull registry.cn-hangzhou.aliyuncs.com/dla_spark/dla-jupyter:0.5
拉取成功后,您可以使用如下命令查看此鏡像的幫助文件。
docker run -ti registry.cn-hangzhou.aliyuncs.com/dla_spark/dla-jupyter:0.5 Used to run jupyter lab for Aliyun DLA Usage example: docker run -it -p 8888:8888 dla-jupyter:0.1 -i akid -k aksec -r cn-hanghzou -c spark-vc -l INFO -i Aliyun AkId -k Aliyun AkSec -r Aliyun Region Id -c Aliyun DLA Virtual cluster name -l LogLevel
上述代碼中出現的參數和DLA Proxy的參數非常相似,具體說明如下。
參數名稱
參數說明
-c
DLA Spark虛擬集群名稱。
說明您可以登錄Data Lake Analytics控制臺。在 中查看虛擬集群名稱。
-i
RAM用戶的AccessKey ID。
說明如果您已經創建了AccessKey,可以在RAM控制臺上查看相關信息。關于如何查看以及創建AccessKey,請參見創建AccessKey。
-k
RAM用戶的AccessKey Secret。
說明如果您已經創建了AccessKey,可以在RAM控制臺上查看相關信息。關于如何查看以及創建AccessKey,請參見創建AccessKey。
-r
DLA所在地域對應的Region ID,詳細信息請參見地域和可用區。
-l
日志級別,默認為INFO,可以修改為ERROR、 WARNING、 INFO或DEBUG,建議使用默認值。
輸入正確的參數,在本地啟動對應的實例。
docker run -it -p 8888:8888 registry.cn-hangzhou.aliyuncs.com/dla_spark/dla-jupyter:0.5 -i {AkId} -k {AkSec} -r {RegionId} -c {VcName}
啟動成功后您可以看到如下圖所示的提示信息,將標注框中的網址貼入瀏覽器可開始使用Jupyter服務直連DLA Spark。
注意事項
在排查錯誤時需要觀察底層日志,文件瀏覽框中的
dlaproxy.log
即為日志記錄文件,正確的啟動信息如下圖所示。在不掛載宿主機文件夾的情況下,關閉Docker后編輯的文件會丟失。Docker關閉時也會自動嘗試終止所有正在運行的Spark交互式作業。此時,您可以選擇如下兩種方案。
在關閉Docker前保證所有的文件被妥善的復制保管。
將本地文件夾掛載到Docker鏡像中,并將作業文件存儲在對應的文件夾下。
以Linux環境為例,將文件夾
/home/admin/notebook
掛載到Docker實例/root/notebook
文件夾下,啟動命令如下。docker run -it --privileged=true -p 8888:8888 -v /home/admin/notebook:/root/notebook registry.cn-hangzhou.aliyuncs.com/dla_spark/dla-jupyter:0.5 -i {AkId} -k {AkSec} -r {RegionId} -c {VcName}
需要注意將編輯中的notebook最終另存到
/tmp
,關閉Docker示例后,在宿主機的/home/admin/notebook
文件夾下可以看到對應的文件,下次啟動Docker實例時可以接著工作。說明更多信息,請參見 Docker卷管理文檔。
常見問題處理
問題現象:Jupyter Lab啟動失敗,出現如下報錯,如何處理?
[C 09:53:15.840 LabApp] Bad config encountered during initialization:
[C 09:53:15.840 LabApp] Could not decode '\xe6\x9c\xaa\xe5\x91\xbd\xe5\x90\x8d' for unicode trait 'untitled_notebook' of a LargeFileManager instance.
解決方法:LANG=zn jupyter lab。
問題現象:出現報錯
$ jupyter nbextension enable --py --sys-prefix widgetsnbextension Enabling notebook extension jupyter-js-widgets/extension... - Validating: problems found: - require? X jupyter-js-widgets/extension
,如何處理?解決方法:
jupyter nbextension install --py widgetsnbextension --user
和jupyter nbextension enable widgetsnbextension --user --py
。問題現象:出現報錯
ValueError: Please install nodejs >=12.0.0 before continuing. nodejs may be installed using conda or directly from the nodejs website.
,如何處理?解決方法:conda install nodejs。關于安裝Conda請參考Conda官方文檔。
問題現象:安裝Sparkmagic時報錯失敗,如下圖所示,如何處理?
解決方法:安裝Rust。
問題現象:無法使用matplot進行繪圖, 即使加入了
%matplotlib inline
仍然會報錯如下圖所示。解決方法: 當使用云端PySpark時, 使用
%matplot plt
組合plt.show()
繪制圖表, 效果如下圖所示。