saiku 元数据存储分析

一、介绍

使用saiku的人一定对他的元数据存储都特别感兴趣,特别是有分布式管理需求的项目,更是迫切需要了解。其实它是使用Apache的开源项目Jackrabbit管理文件的!

二、代码跟踪

我也是使用了一段时间,希望深入了解它的元数据存储,下面是代码跟踪:

2.1 ajax

首先还是从ajax入手:ajax请求:/saiku/rest/saiku/admin/datasources?_=1466478165922

对应的脚本:org.saiku.web.rest.resources.AdminResource,方法如下:

    @GET
    @Produces( {"application/json"})
    @Path("/datasources")
    @ReturnType("java.lang.List<SaikuDatasource>")
    public Response getAvailableDataSources() 

发现核心代码是:datasourceService.getDatasources().values() 不过看不出来什么,于是从代码注入开始查起!

2.2 代码注入

AdminResource对象注入:
    <bean id="adminBean" class="org.saiku.web.rest.resources.AdminResource">
        <property name="userService" ref="userServiceBean"/>
        <property name="datasourceService" ref="datasourceServiceBean"/>
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
        <property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
        <property name="logExtractor" ref="logwriterbean"/>
    </bean>
UserService对象注入:
    <bean id="userServiceBean" class="org.saiku.service.user.UserService">
        <property name="jdbcUserDAO" ref="userDAO"/>
        <property name="datasourceService" ref="datasourceServiceBean"/>
        <property name="iDatasourceManager" ref="repositoryDsManager"/>
        <property name="adminRoles">
            <list>
                <value>ROLE_ADMIN</value>
            </list>
        </property>
        <property name="sessionService" ref="sessionService"/>
    </bean>
DatasourceService对象注入:
    <bean id="datasourceServiceBean" class="org.saiku.service.datasource.DatasourceService">
        <property name="connectionManager" ref="connectionManager"/>
    </bean>

发现部分核心代码:

  private void readObject(ObjectInputStream stream)
      throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
    datasources = connectionManager.getDataSourceManager();
  }

继续跟踪:

connectionManager对象注入:
    <bean id="connectionManager" class="org.saiku.web.core.SecurityAwareConnectionManager" init-method="init"
          destroy-method="destroy" depends-on="mondrianVFS">
        <property name="dataSourceManager" ref="repositoryDsManager"/> --这是注入执行setDataSourceManager方法,传入repositoryDsManager对象
        <property name="sessionService" ref="sessionService"/>
    </bean>
repositoryDsManager对象注入:
    <bean id="repositoryDsManager" class="org.saiku.service.datasource.RepositoryDatasourceManager" init-method="load" destroy-method="unload">
        <property name="userService" ref="userServiceBean"/>
        <property name="configurationpath" value="../../repository/configuration.xml"/>
        <property name="datadir" value="../../repository/data"/>
        <property name="foodmartdir" value="../../data"/>
        <property name="foodmartschema" value="../../data/FoodMart4.xml"/>
        <property name="foodmarturl" value="jdbc:h2:../../data/foodmart;MODE=MySQL"/>
        <property name="earthquakeDir" value="../../data"/>
        <property name="earthquakeSchema" value="../../data/Earthquakes.xml"/>
        <property name="earthquakeUrl" value="jdbc:h2:../../data/earthquakes;MODE=MySQL"/>
        <property name="repoPasswordProvider" ref ="repoPasswordProviderBean"/>
        <property name="defaultRole" value="ROLE_USER"/>
        <!-- If you change the repoPassword set this property for at least 1 restart to update the old repo password-->
        <!--<property name="oldRepoPassword" value="sa!kuanalyt!cs"/>-->
    </bean>

获取所有的元数据,就是获取RepositoryDatasourceManager对象的datasources对象,这个对象是由下面的代码生成的:

   public void load() {
        irm = JackRabbitRepositoryManager.getJackRabbitRepositoryManager(configurationpath, datadir, repopasswordprovider.getPassword(),
            oldpassword, defaultRole);
        try {
            irm.start(userService);
            this.saveInternalFile("/etc/.repo_version", "d20f0bea-681a-11e5-9d70-feff819cdc9f", null);
        } catch (RepositoryException e) {
            log.error("Could not start repo", e);
        }
        datasources.clear();
        try {

            List<DataSource> exporteddatasources = null;
            try {
                exporteddatasources = irm.getAllDataSources();
            } catch (RepositoryException e1) {
                log.error("Could not export data sources", e1);
            }

            if (exporteddatasources != null) {
                for (DataSource file : exporteddatasources) {
                    if (file.getName() != null && file.getType() != null) {
                        Properties props = new Properties();
                        SaikuDatasource.Type t = SaikuDatasource.Type.valueOf(file.getType().toUpperCase());
                        SaikuDatasource ds = new SaikuDatasource(file.getName(), t, props);
                        datasources.put(file.getName(), ds);
                    }
                }
            }
        } catch (Exception e) {
            throw new SaikuServiceException(e.getMessage(), e);
        }
    }

三、终极发现

saiku是使用JackRabbit管理树状元数据的,如果想要扩展,只能在JackRabbit基础上进行扩展,同志们继续努力!
JackRabbitIBM文档:http://www.ibm.com/developerworks/cn/java/j-jcr/
JackRabbit入门文档: http://suigara.iteye.com/blog/1454765 
时间: 2024-09-27 04:39:09

saiku 元数据存储分析的相关文章

BCS--设置BDC元数据存储权限--访问被业务数据拒绝

设置元数据存储权限 http://blog.163.com/[email protected]/blog/static/8297850320139126930290/

hive元数据存储

Hive 元数据存储 Hive 将元数据存储在 RDBMS中,有三种模式可以连接到数据库: Single User Mode: 此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test. Multi User Mode:通过网络连接到一个数据库中,是最经常使用到的模式. RemoteServer Mode:用于非Java 客户端访问元数据库,在服务器端启动一个MetaStoreServer,客户端利用Thrift 协议通过MetaStoreServer 访问元数据

Hive 元数据存储

Hive 元数据存储 Hive 将元数据存储在 RDBMS中,有三种模式可以连接到数据库: Single User Mode: 此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test. Multi User Mode:通过网络连接到一个数据库中,是最经常使用到的模式. RemoteServer Mode:用于非Java 客户端访问元数据库,在服务器端启动一个MetaStoreServer,客户端利用Thrift 协议通过MetaStoreServer 访问元数据

大数据影响安防 存储分析问题迎刃而解

大数据无疑是今年的热门关键词之一,网络飞速发展,信息时代扑面而来,大量数据涌现.这些数据的价值,若能应用便是一笔财富,若不能挖掘其价值 进行应用,则只是数据,甚至可能是一种负担.安防数据也正在以几何级的速度快速增长,越来越多的安防用户对大数据提出了更高的要求,希望能够通过海量数据 的分析,达到预测预警的作用. 大数据对安防的真正意味是什么?对安防监控有何帮助? 美国利用大数据的做了什么? 在谈大数据对安防监控的影响之前,我们先来看下在大数据应用方面较为成熟的美国利用大数据做了些什么? 1.美国国

hive的本地安装部署,元数据存储到mysql中

要想使用Hive先要有hadoop集群的支持,使用本地把元数据存储在mysql中. mysql要可以远程连接: 可以设置user表,把localhost改为%,所有可连接.记住删除root其他用户,不然可能会有影响 update user set host='%' where host='localhost'; Hive的安装部署: 1.解压tar文件 2.修改文件: 修改conf/下面的文件: cp hive-env.sh.tempalte hive-env.sh 配置hive-env.sh文

存储分析--- 转载

2013年SSD行业发展总结[转载] (2014-06-09 23:33:07) 转载▼ 标签: flash ssd 存储 分类: SSD 1.概述 2013年是Flash存储领域非常不平凡的一年,Flash盘阵厂商Violin Memory上市之后就股票大跌,CEO被迫辞退.混合存储厂商Nimble Storage终于在年末成功上市.Cisco在自己的老本行之外于去年下半年收购全Flash盘阵厂商Whiptail,开始入足存储领域.FusionIO在去年一直收益不佳,并且引发高层动荡,创始人兼

png的格式及像素存储分析

从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据块里的像素直接存储调色板里的索引值,根据索引寻找对应的颜色及透明色.透明色的指定由PLTE后的tRNS图像透明数据块指定.布尔透明和alpha透明的区别是alpha透明为透明色附加了8位(1byte)的透明级别.tRNS图像透明数据块的长度与调色板对应如下. PLTE块格式为:? 循环? RED: 

C语言共用体存储分析

float类型的数据在内存中是如上存储的,float类型的存储方式如下(摘自博客 http://blog.csdn.net/yezhubenyue/article/details/7436624): 取原文中的部分总结如下: 浮点型变量在计算机内存中占用4字节(Byte),即32-bit.遵循IEEE-754格式标准. 一个浮点数由2部分组成:底数M和指数E. 底数部分 使用2进制数来表示此浮点数的实际值. 指数部分 占用8-bit的二进制数,可表示数值范围为0-255.但是指数应可正可负,所以

saiku- 通过 saiku 的 DEMO 分析 connection

示例:FOODMART connection: foodmart catalog: FoodMart schema: FoodMart cube: Sales/HR/Sales 2/.../ =========================== Cube 1 :Sales ============================== 关注三个属性:[Dimensions].[measures].[properties] [Dimensions:5个] [[Customer], [Product