zeppelin的数据集的优化
前面我们介绍了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的数据集的优化的更多相关文章
- 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化
		一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ... 
- SqlServer性能优化 即席查询(十三)
		执行计划,查询类别: 1.即席查询 2.预定义查询 select c.EnglishProductCategoryName,p.EnglishProductName,p.Color,p.Siz ... 
- MSSQL数据批量插入优化详细
		序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ... 
- Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理
		前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ... 
- Hadoop中两表JOIN的处理方法(转)
		1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ... 
- (转)MapReduce中的两表join几种方案简介
		转自:http://blog.csdn.net/leoleocmm/article/details/8602081 1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而 ... 
- Hadoop中两表JOIN的处理方法
		Dong的这篇博客我觉得把原理写的很详细,同时介绍了一些优化办法,利用二次排序或者布隆过滤器,但在之前实践中我并没有在join中用二者来优化,因为我不是作join优化的,而是做单纯的倾斜处理,做joi ... 
- (转)MapReduce 中的两表 join 几种方案简介
		1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ... 
- apriori && fpgrowth:频繁模式与关联规则挖掘
		已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ... 
随机推荐
- Design Pattern ->Bridge
			Layering & Contract Philosophy With additional indirection. class CWindowImp { public: virtual v ... 
- Extjs4几个小知识点
			1.Why user "var me=this" in Extjs4?有个英文解释很好: Say you have a method in your object A which ... 
- 初学React:定义一个组件
			接着聊React,今天说说如何创建一个组件类. <!DOCTYPE html> <html lang="en"> <head> <meta ... 
- SQL语句关于时间的查询小心得,希望大家给点意见
			完全使用时间函数去搞定查询日期,之前写的可能有些问题,现在删了修正一下 本月记录: SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())= ... 
- Android(java)学习笔记63:Clock App 编写报错01
			1. 首先我们二话不说直接先看报错内容如下: 07-12 08:25:03.572: E/dalvikvm(3602): native fork pid:0 done. 07-12 08:25:03. ... 
- 计算最大矩形面积,POJ(2082)
			题目链接:http://poj.org/problem?id=2082 把矩形按照高度一次递增的循序排列,当违反这一规则的时候,更新ans,用新的data替换之前的矩形.然后最后扫一遍. #inclu ... 
- redis hash类型
- [vijos p1028] 魔族密码
			描述 风之子刚走进他的考场,就……花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###花花:……咦~~好冷~~我们现在要 ... 
- CBCGPImage的GetSize的问题及解决方法
			BCGControlBar Pro for MFC 25.10是目前(2018-07-16)网上能够找到的最新能够使用的版本,我配合Visual Studio 2010使用.在单文档MFC程序的视图中 ... 
- 在网页标题上加个logo
			只需在title标签上加个link标签即可 <link rel="icon" href="images/icon.png" > <title& ... 
