前面我们介绍了zeppelin的修改,前面由于自己的原因,对zeppelin的修改过于多,现在由于优化了,我们两个类,

一个是zeppelin-server的NotebookServer的类的broadcastParagraph(Note note,Paragraph p)的代码,另外

的一个是zeppelin-zengine里面的Note的run(String paragraphId)的这个方法还有添加了Utils的这个类对于数据集的查找,对于这两个方法,就可以完美的对

zeppelin的数据集的修改。

我们首先介绍一下zeppelin的工作原理以及我们做的修改原理

1.zeppelin的实现

原先zeppelin的实现原理是当我在note的paragraph里面写spark语句的时候,当我们点击运行或点击其他的note的时候,

此时,zeppelin会保存那个paragraph里面的所有数据,而且不会进行改变。当我们需要运行的时候,

zeppelin就会去找notebook里面paragraph的text属性然后进行运行以及修改状态和显示到页面。

2.zeppelin的修改点

关于zeppelin的paragraph.text保存到数据库的操作没有进行更改,将用户所写数据原样的保存到数据库中

改动一:

在run的时候,把待运行paragraph里面的text数据中的数据集改为真实路径提交到zeppelin中运行

改动二:

运行完成回显数据的时候修改其paragraph状态,再恢复成为用户输入的样子(把真实路径换为数据集)

下面贴一下代码

zeppelin-zengine的Note的类

 public void run(String paragraphId) {
//根据是否逾期来选择读取数据的方式
if(Utils.isOverDueTime()){
// setdataMap = findData();
setdataMap = Utils.finddataMap();
setdataList = Utils.finddataList();
}
Paragraph p = getParagraph(paragraphId);
p.setListener(jobListenerFactory.getParagraphJobListener(this)); if (p.isBlankParagraph()) {
logger.info("skip to run blank paragraph. {}", p.getId());
p.setStatus(Job.Status.FINISHED);
return;
} String requiredReplName = p.getRequiredReplName();
Interpreter intp = factory.getInterpreter(p.getUser(), getId(), requiredReplName); if (intp == null) {
String intpExceptionMsg =
p.getJobName() + "'s Interpreter " + requiredReplName + " not found";
InterpreterException intpException = new InterpreterException(intpExceptionMsg);
InterpreterResult intpResult =
new InterpreterResult(InterpreterResult.Code.ERROR, intpException.getMessage());
p.setReturn(intpResult, intpException);
p.setStatus(Job.Status.ERROR);
throw intpException;
}
if (p.getConfig().get("enabled") == null || (Boolean) p.getConfig().get("enabled")) {
p.setAuthenticationInfo(p.getAuthenticationInfo()); Paragraph p2 = p;
if (p.settings != null) {
String text = p2.getText();
if (text != null && text.contains("#")) {
p2 = p.cloneParagraphForUser(p.getId());
p2.setListener(jobListenerFactory.getParagraphJobListener(this));
p2.setAuthenticationInfo(p.getAuthenticationInfo());
//替换数据
for (String s : setdataList){
if(! text.contains("#")){
break;
}
if(text.contains(s)){
text = text.replaceAll(s, setdataMap.get(s));
}
}
p2.setText(text);
p2.setInterpreterFactory(factory);
p2.setNote(p.getNote());
}
}
intp.getScheduler().submit(p2);
}
}

zeppelin-server的NotebookServer

 public void broadcastParagraph(Note note, Paragraph p) {
Paragraph cacheP = note.getParagraph(p.getId());
if(cacheP == null)
cacheP = p;
if (cacheP.getText() != null && !cacheP.getText().equals(p.getText())) {
if (p.getReturn() instanceof InterpreterResult) {
cacheP.setReturn(p.getResult(), p.getException());
} else {
cacheP.setResult(p.getReturn());
}
cacheP.setStatus(p.getStatus());
return;
}
// if (p.settings != null) {
// //clone()方法
// p2 = p.cloneParagraphForUser(p.getId());
//
// String text = p2.getText();
// if (text != null) {
// if (text.contains("/tmp/xjdx.txt")) {
// text = text.replaceAll("/tmp/xjdx.txt", "#mydata");
// p2.setText(text);
// }
// }
// }
if (note.isPersonalizedMode()) {
broadcastParagraphs(p.getUserParagraphMap(), cacheP);
} else {
broadcast(note.getId(), new Message(OP.PARAGRAPH).put("paragraph", cacheP));
}
}

下面介绍一下Utils的类

public class Utils {

    //数据库信息
// private static final String driver = "com.mysql.jdbc.Driver";
// private static final String url = "jdbc:mysql://172.20.11.10:3306/xxxx?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false";
// private static final String username = "xxxx";
// private static final String password = "xxxx"; private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
private static final long ALLOW_TIME = 10 * 1000;
private static Date preTime = null; private static HashMap<String,String> setdataMap = null;
private static ArrayList<String> setdataList = null; static{
driver = Config.getConfig("jdbc_driverClassName");
url = Config.getConfig("jdbc_url");
username = Config.getConfig("jdbc_username");
password = Config.getConfig("jdbc_password");
} //是否逾期时间
public static boolean isOverDueTime() {
Date d = new Date();
if (preTime == null || (d.getTime() - preTime.getTime()) > ALLOW_TIME || setdataList == null || setdataMap == null)
return true;
return false;
} //进行实时查询数据库查询
public static HashMap<String,String> finddataMap(){
try {
preTime = new Date();
setdataMap = new HashMap<>();
Class.forName(driver);
Connection conn = (Connection) DriverManager.getConnection(url, username, password);
String sql = "select dataset.ds_name , dataset_storage.item_value from dataset left join dataset_storage on dataset.id = dataset_storage.dataset_id and dataset_storage.item_key = 'majorPath'";
PreparedStatement pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
if((rs.getString("item_value")) != null ){
setdataMap.put("#" + rs.getString("ds_name"),rs.getString("item_value"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return setdataMap;
} public static ArrayList<String> finddataList(){
setdataList = new ArrayList<>();
if(setdataMap != null){
for (String s:setdataMap.keySet()){
setdataList.add(s) ;
}
}
return setdataList;
} }

以上就是对于zeppelin的数据集修改的二次优化

zeppelin的数据集的优化的更多相关文章

  1. 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

    一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ...

  2. SqlServer性能优化 即席查询(十三)

    执行计划,查询类别: 1.即席查询     2.预定义查询 select c.EnglishProductCategoryName,p.EnglishProductName,p.Color,p.Siz ...

  3. MSSQL数据批量插入优化详细

    序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ...

  4. Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理

    前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...

  5. Hadoop中两表JOIN的处理方法(转)

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...

  6. (转)MapReduce中的两表join几种方案简介

    转自:http://blog.csdn.net/leoleocmm/article/details/8602081 1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而 ...

  7. Hadoop中两表JOIN的处理方法

    Dong的这篇博客我觉得把原理写的很详细,同时介绍了一些优化办法,利用二次排序或者布隆过滤器,但在之前实践中我并没有在join中用二者来优化,因为我不是作join优化的,而是做单纯的倾斜处理,做joi ...

  8. (转)MapReduce 中的两表 join 几种方案简介

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...

  9. apriori && fpgrowth:频繁模式与关联规则挖掘

    已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...

随机推荐

  1. html table 的属性

    表格table th,td 文字顶部对齐 <th valign="top"></th> <td valign="top">& ...

  2. Visual Studio Code 入门教程

    Extensible and customizable.(可扩展的和可定制的,这是我喜欢它的原因) Want even more features? Install extensions to add ...

  3. python的元组

    Python的元组和列表很相似,只是元组一旦定义就无法修改,比如定义一个学生的元组: names = ('alex','jack') print(names)#('alex', 'jack') pri ...

  4. Myeclipse与tomcat的运行问题

    在myeclipse中修改自己servlet后,在次运行时,可能会没有变化,这时需要重启tomcat,重新加载servlet

  5. MyEclipse内存溢出问题

    今天碰到的问题,先记录下来 Console报错: Java.lang.OutOfMemoryError: PermGen space 跟着步骤: 在这里加入:-Xms800m -Xmx800m -XX ...

  6. Node.js-Webstorm2018配置nodejs

    网上都是webstorm老版本的设置方法!根本就找不到以下配置项: 下面介绍2018版的配置方式.功能:使webstrom支持node.js语法检测及语法提示! 例如:配置前,没有任何提示 配置后 配 ...

  7. April 28 2017 Week 17 Friday

    The only thing more painful than learning from experience is not learning from experience. 比从经验中学习更为 ...

  8. wxWidgets窗口类型

    如果在创建窗口的时候你没有指定窗口的边框类型,那么在不同的平台上将会有不同的边框类型的缺省值.在windows平台上,控件边框的缺省值为 wxSUNKEN_BORDER,意为使用当前系统风格的边框.你 ...

  9. HTML入门1—HTML基础学习

    html文档结构 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. QT学习之QT判断界面当前点击的按钮和当前鼠标坐标

    1.QObject::sender( ) 返回发送信号的对象的指针,返回类型为QObject* .可使用qobject_cast动态类型转换成对应的发送信息的对象(对象类的基类中需要有QObject) ...