Appearance
Jupyter Server的运行架构设计 #
5-1、传统的运行架构 #
传统的Jupyter运行架构其简图如下:
从上图中可以看到, 通讯过程中有3个实体: Browser / Notebook Server/ Kernel, 它们之间分别使用 http+websocket 和 ZMQ进行通讯.
5-2、采用nb2kg做中介的运行架构 #
在调整为基于容器化的Jupyter Server 运行环境后, 为了收集用户活动指标, 采用如下的方式对jupyter的运行架构进行调整:
上图中通过在调整 nb2kg 组件, 记录kernel 访问日志, 并将日志内容异步传送给manager, 修改其中的这么几个函数(使用 nb2kg 扩展要求notebook版本>=4.2.0, <6.0):
nb2kg.handlers.KernelGatewayWSClient 类的下面几个方法:
_write_message -- 向gateway发送消息(一般是要执行的代码)
on_close -- 关闭kernel
on_open -- 打开一个kernel
_read_messages -- 循环读取接收响应消息的方法
日志收集过程 #
这里修改nb2kg后捕获到的消息数据, 都存在于各自的jupyter容器中, 如果在消息收集过程中直接通过网络向收集点传输, 则会对notebook与kernel的交互产生延迟影响, 为了减少对用户体验的影响, 考虑先保存在本地日志文件中, 通过定时任务向外传递.
下面是记录下来的消息内容样例, 可以参考来进行日志梳理:
新建kernel的交互消息: #
[I 15:45:30.944 NotebookApp] Request start kernel: kernel_id=None, path=""
[I 15:45:30.965 NotebookApp] Kernel started: a4ac77c3-c59f-499c-9b71-59874110b079 !!
[I 15:45:31.063 NotebookApp] Attempting connect to kernel_id: a4ac77c3-c59f-499c-9b71-59874110b079 ...
[I 15:45:31.064 NotebookApp] Connecting to ws://127.0.0.1:8889/api/kernels/a4ac77c3-c59f-499c-9b71-59874110b079/channels ...
[I 15:45:31.642 NotebookApp] _write_message {"header":{"msg_id":"98f8d81b08e0485d8c11b4065b49bc72","username":"username","session":"9149770b761140e38ff1905ed7d164fa","msg_type":"kernel_info_request","version":"5.2"},"metadata":{},"content":{},"buffers":[],"parent_header":{},"channel":"shell"}
[I 15:45:31.650 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_6", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:45:31.646516Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_6", "msg_type": "status", "parent_header": {"msg_id": "9a025c1a-329bd4303207f3abedf2ab3c_1", "msg_type": "kernel_info_request", "username": "gg", "session": "9a025c1a-329bd4303207f3abedf2ab3c", "date": "2021-03-23T07:45:31.644250Z", "version": "5.3"}, "metadata": {}, "content": {"execution_state": "idle"}, "buffers": [], "channel": "iopub"}]
[I 15:45:31.690 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_7", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:45:31.650674Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_7", "msg_type": "status", "parent_header": {"msg_id": "98f8d81b08e0485d8c11b4065b49bc72", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "kernel_info_request", "version": "5.2", "date": "2021-03-23T07:45:31.650530Z"}, "metadata": {}, "content": {"execution_state": "busy"}, "buffers": [], "channel": "iopub"}]
[I 15:45:31.691 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_9", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:45:31.652133Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_9", "msg_type": "status", "parent_header": {"msg_id": "98f8d81b08e0485d8c11b4065b49bc72", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "kernel_info_request", "version": "5.2", "date": "2021-03-23T07:45:31.650530Z"}, "metadata": {}, "content": {"execution_state": "idle"}, "buffers": [], "channel": "iopub"}]
[I 15:45:31.691 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_8", "msg_type": "kernel_info_reply", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:45:31.651000Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_8", "msg_type": "kernel_info_reply", "parent_header": {"msg_id": "98f8d81b08e0485d8c11b4065b49bc72", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "kernel_info_request", "version": "5.2", "date": "2021-03-23T07:45:31.650530Z"}, "metadata": {}, "content": {"status": "ok", "protocol_version": "5.3", "implementation": "ipython", "implementation_version": "7.21.0", "language_info": {"name": "python", "version": "3.7.10", "mimetype": "text/x-python", "codemirror_mode": {"name": "ipython", "version": 3}, "pygments_lexer": "ipython3", "nbconvert_exporter": "python", "file_extension": ".py"}, "banner": "Python 3.7.10 | packaged by conda-forge | (default, Feb 19 2021, 16:07:37) \nType 'copyright', 'credits' or 'license' for more information\nIPython 7.21.0 -- An enhanced Interactive Python. Type '?' for help.\n", "help_links": [{"text": "Python Reference", "url": "https://docs.python.org/3.7"}, {"text": "IPython Reference", "url": "https://ipython.org/documentation.html"}, {"text": "NumPy Reference", "url": "https://docs.scipy.org/doc/numpy/reference/"}, {"text": "SciPy Reference", "url": "https://docs.scipy.org/doc/scipy/reference/"}, {"text": "Matplotlib Reference", "url": "https://matplotlib.org/contents.html"}, {"text": "SymPy Reference", "url": "http://docs.sympy.org/latest/index.html"}, {"text": "pandas Reference", "url": "https://pandas.pydata.org/pandas-docs/stable/"}]}, "buffers": [], "channel": "shell"}]
执行 print('hello1') 的交互消息: #
[I 15:47:38.927 NotebookApp] _write_message {"header":{"msg_id":"a7b6d680c50a4dfd967abafe6420a8c8","username":"username","session":"9149770b761140e38ff1905ed7d164fa","msg_type":"execute_request","version":"5.2"},"metadata":{},"content":{"code":"print(\"hello1\")","silent":false,"store_history":true,"user_expressions":{},"allow_stdin":true,"stop_on_error":true},"buffers":[],"parent_header":{},"channel":"shell"}
[I 15:47:38.941 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_10", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:47:38.930230Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_10", "msg_type": "status", "parent_header": {"msg_id": "a7b6d680c50a4dfd967abafe6420a8c8", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:47:38.930033Z"}, "metadata": {}, "content": {"execution_state": "busy"}, "buffers": [], "channel": "iopub"}]
[I 15:47:38.982 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_11", "msg_type": "execute_input", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:47:38.930793Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_11", "msg_type": "execute_input", "parent_header": {"msg_id": "a7b6d680c50a4dfd967abafe6420a8c8", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:47:38.930033Z"}, "metadata": {}, "content": {"code": "print(\"hello1\")", "execution_count": 1}, "buffers": [], "channel": "iopub"}]
[I 15:47:38.982 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_12", "msg_type": "stream", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:47:38.940224Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_12", "msg_type": "stream", "parent_header": {"msg_id": "a7b6d680c50a4dfd967abafe6420a8c8", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:47:38.930033Z"}, "metadata": {}, "content": {"name": "stdout", "text": "hello1\n"}, "buffers": [], "channel": "iopub"}]
[I 15:47:38.983 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_14", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:47:38.942636Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_14", "msg_type": "status", "parent_header": {"msg_id": "a7b6d680c50a4dfd967abafe6420a8c8", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:47:38.930033Z"}, "metadata": {}, "content": {"execution_state": "idle"}, "buffers": [], "channel": "iopub"}]
[I 15:47:38.983 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_13", "msg_type": "execute_reply", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:47:38.941832Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_13", "msg_type": "execute_reply", "parent_header": {"msg_id": "a7b6d680c50a4dfd967abafe6420a8c8", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:47:38.930033Z"}, "metadata": {"started": "2021-03-23T07:47:38.930643Z", "dependencies_met": true, "engine": "06c5b0ba-56f7-4515-b94b-7430733417ac", "status": "ok"}, "content": {"status": "ok", "execution_count": 1, "user_expressions": {}, "payload": []}, "buffers": [], "channel": "shell"}]
执行 1+2 的交互消息: #
[I 15:54:09.146 NotebookApp] _write_message {"header":{"msg_id":"6779ba6d394d44788fa030b1b3efc72d","username":"username","session":"9149770b761140e38ff1905ed7d164fa","msg_type":"execute_request","version":"5.2"},"metadata":{},"content":{"code":"1+2","silent":false,"store_history":true,"user_expressions":{},"allow_stdin":true,"stop_on_error":true},"buffers":[],"parent_header":{},"channel":"shell"}
[I 15:54:09.161 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_15", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:54:09.148252Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_15", "msg_type": "status", "parent_header": {"msg_id": "6779ba6d394d44788fa030b1b3efc72d", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:54:09.148034Z"}, "metadata": {}, "content": {"execution_state": "busy"}, "buffers": [], "channel": "iopub"}]
[I 15:54:09.202 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_16", "msg_type": "execute_input", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:54:09.148742Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_16", "msg_type": "execute_input", "parent_header": {"msg_id": "6779ba6d394d44788fa030b1b3efc72d", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:54:09.148034Z"}, "metadata": {}, "content": {"code": "1+2", "execution_count": 2}, "buffers": [], "channel": "iopub"}]
[I 15:54:09.202 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_17", "msg_type": "execute_result", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:54:09.150032Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_17", "msg_type": "execute_result", "parent_header": {"msg_id": "6779ba6d394d44788fa030b1b3efc72d", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:54:09.148034Z"}, "metadata": {}, "content": {"data": {"text/plain": "3"}, "metadata": {}, "execution_count": 2}, "buffers": [], "channel": "iopub"}]
[I 15:54:09.202 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_19", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:54:09.163482Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_19", "msg_type": "status", "parent_header": {"msg_id": "6779ba6d394d44788fa030b1b3efc72d", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:54:09.148034Z"}, "metadata": {}, "content": {"execution_state": "idle"}, "buffers": [], "channel": "iopub"}]
[I 15:54:09.203 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_18", "msg_type": "execute_reply", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T07:54:09.162701Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_18", "msg_type": "execute_reply", "parent_header": {"msg_id": "6779ba6d394d44788fa030b1b3efc72d", "username": "username", "session": "9149770b761140e38ff1905ed7d164fa", "msg_type": "execute_request", "version": "5.2", "date": "2021-03-23T07:54:09.148034Z"}, "metadata": {"started": "2021-03-23T07:54:09.148687Z", "dependencies_met": true, "engine": "06c5b0ba-56f7-4515-b94b-7430733417ac", "status": "ok"}, "content": {"status": "ok", "execution_count": 2, "user_expressions": {}, "payload": []}, "buffers": [], "channel": "shell"}]
关闭kernel的消息交互: #
[I 16:18:35.026 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_20", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T08:18:34.724230Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_20", "msg_type": "status", "parent_header": {"msg_id": "893065b9-f5805d57b0e7c3892b122d32_0", "msg_type": "shutdown_request", "username": "gg", "session": "893065b9-f5805d57b0e7c3892b122d32", "date": "2021-03-23T08:18:34.722609Z", "version": "5.3"}, "metadata": {}, "content": {"execution_state": "busy"}, "buffers": [], "channel": "iopub"}]
[I 16:18:35.067 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_22", "msg_type": "shutdown_reply", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T08:18:34.724888Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_22", "msg_type": "shutdown_reply", "parent_header": {"msg_id": "893065b9-f5805d57b0e7c3892b122d32_0", "msg_type": "shutdown_request", "username": "gg", "session": "893065b9-f5805d57b0e7c3892b122d32", "date": "2021-03-23T08:18:34.722609Z", "version": "5.3"}, "metadata": {}, "content": {"status": "ok", "restart": false}, "buffers": [], "channel": "iopub"}]
[I 16:18:35.067 NotebookApp] --receive message: [{"header": {"msg_id": "db24e902-8bf9fec78528a6c1da837ee1_23", "msg_type": "status", "username": "username", "session": "db24e902-8bf9fec78528a6c1da837ee1", "date": "2021-03-23T08:18:34.726160Z", "version": "5.3"}, "msg_id": "db24e902-8bf9fec78528a6c1da837ee1_23", "msg_type": "status", "parent_header": {"msg_id": "893065b9-f5805d57b0e7c3892b122d32_0", "msg_type": "shutdown_request", "username": "gg", "session": "893065b9-f5805d57b0e7c3892b122d32", "date": "2021-03-23T08:18:34.722609Z", "version": "5.3"}, "metadata": {}, "content": {"execution_state": "idle"}, "buffers": [], "channel": "iopub"}]