Zeppelin是一款web笔记本,可以迭代式的进行数据分析。比如%spark就可以写spark application相关的scala代码,%sql就可以直接写spark sql,写完后直接运行看效果,还可以出各种柱状图、区域图等,非常方便。
但是,最近却遇到了一次机器突然断电后,notebook内容完全被清空的情况。写notebook的浏览器运行在一台机器上,而Zeppelin Server则运行在另一台机器上,两台机器在同一个局域网内。
所以,希望可以将Zeppelin更新notebook内容的机制弄清楚。
注:
在Zeppelin中,此为notebook:
而此为notebook的paragraph:
Zeppelin目录结构如下:
我们只挑当前关心的读,从前往后的读。
Web部分
Notebook主要在此:
具体行为为:
1. 发送websocket消息,根据指定的noteid得到note内容,渲染页面
2. 监听paragraph的点击,得到当前focus的paragraph
3. 监听按键事件,并broadcast按键事件
4. 监听用户关闭浏览器事件和页面跳转事件,在关闭浏览器、页面跳转前,先:
a. killTimeSaver
b. saveNote
saveNote会调用saveParagraph方法
notebook中的paragraph文件夹,是对paragraph的处理,具体行为为:
a. 写的代码内容在paragraph.text这个model中
b. Editor监听input,当有input时调用aceChanged事件,aceChanged事件会调用startTimeSaver方法,startTimeSaver方法会调用saveNote方法,saveNote会调用saveParagraph方法
总而言之一句话,就是你写代码、关闭页面、刷新页面都会触发saveParagraph方法(这样就让人有随时写随时保存,不用担心保存问题的感觉)。那这个saveParagraph方法做了啥事情呢?它就是调用了commitParagraph方法,commitParagraph方法里:
将paragraph的标题、内容、配置以及参数都用websocketMsgSrv传了出去。
最终传输的就是这个:
Server部分
Zeppeline-server中的NotebookServer负责处理这各类消息,其中就包括COMMIT_PARAGRAPH消息。
具体的updateParagraph代码如下:
并且广播的操作参数为PARAGRAPH,通知前台。
其中note.persist方法会:
1. 先将内容写入.note.json
2. mv .note.json为note.json
暂时想到的:
1. 不可能是写.note.json时断电,因为这样不会影响到至关重要的note.json文件
2. 从notebook目录来看,.note.json已经不存在了,只有note.json存在;所以可能是mv已经成功了或者mv根本没发生连.note.json都没有写(不过重testdisk恢复的情况看,8:41时是有.note.json这样一个空文件的)
3. note.json的编辑时间是08:41,确实也是断电的时间;电是9点之后来的,所以不会是重启时有”恢复”机制将它恢复成了空
虽然还没想清楚原因,不过大致将更新notebook的过程整理了一下: