Hive作为Mondrian的数据源

      项目中的报表系统使用开源的mondrian和saiku作为工具实现的,现在自己又不得不去熟悉OLAP这一块的东西,首先要面对的就是mondrian这一座大山,听他们之前的开发人员介绍说mondrian里面会有很多坑,尤其是性能问题,在之前自己的测试过程中自己也遇到了一些问题,但是当时没怎么记录过了一两个月就差不多忘记怎么解决的了。
      不过当时对于mondrian的慢还是深有体会的,至于他是怎么实现的我也没有看过源代码,只是通过查看执行结果发现的,我使用的数据源是官方提供的foodmart数据库,在之前的文章中介绍了如何生成这些数据和如何将这些数据导入到hive中,然后我在自己的测试集群上搭了伪分布式的集群,使用mondrian分别将mysql和hive作为数据源进行测试,一个MDX查询mysql可以几秒钟查到的结果,在hive中整整跑了半个小时,当时观察着hive的history记录发现每一个sql都会跑一个甚至多个mapreduce任务,至于原因嘛,我觉得首先mondrian生成的sql就是比较多的,我记录mysql的查询记录发现一个MDX查询会生成大概18条SQL查询,其中不乏group by和join之类的查询,因为mondrian没有对底层数据源进行优化(我认为),所以对于mysql和hive生成的SQL理论上是一样的(没有进行比较),所以这些冗长的SQL拖慢了整个查询的速度;其次hive不是mysql那样的面向TPS的数据库,它是面向吞吐量的,所以每一个SQL查询的响应时间是很久的,通过观察发现生成的这些SQL是顺序执行的,为什么不慢呢!
      虽然慢,但是先实功能再说其他的吧,之前测试hive的过程中记得自己对hive的jdbc源码进行了修改,主要是修改了一些hive在实现jdbc中没有实现但是抛出异常的接口,而mondrian会调用这些接口导致下面的流程走不下去了,整体的修改应该说还是比较简单的。另外一个问题是当时的hive是没有使用任何认证机制的,包括hadoop也是没有认证机制的,现在在公司的hadoop集群上跑需要使用kerberos认证,这一块自己还不熟悉,还只是知道怎么用,所以还需要恶补了一下关于kerberos认证的知识。

      之前的准备工作已经做好了,首先我已经测试了使用mysq作为数据源使用mondrian作为MDX查询引擎的流程、然后记录了如果生成mondrian的foodmart数据以及如何将数据到导入到hive中,另外,还有如何部署hive的hiveserver2,然后使用jdbc连接这个server。万事俱备,只欠东风了。
      首先既然hiveserver是用了kerberos认证的,其实它是一个代理服务器,使用代理用户hive代理其他用户提交mapreduce任务和执行HDFS操作,所以在代码中首先需要使用kerberos认证,认证的流程如下:
              Configuration conf = new Configuration();
              conf.setBoolean( "hadoop.security.authorization" , true);
              conf.set( "hadoop.security.authentication" , "kerberos" );
              UserGroupInformation. setConfiguration(conf);
               try {
                     UserGroupInformation. loginUserFromKeytab("intern/bigdata", "C:\\Users\\Administrator\\Desktop\\intern.keytab" );
              } catch (IOException e) {
                      // TODO Auto-generated catch block
                     e.printStackTrace();
              }

    初始化了kerberos之后,接下来需要指定hive的jdbc驱动器,在使用mysql的时候貌似没有指定,但是mondrian并没有官方支持hive的版本(其实mondrian只是支持提供了jdbc接口的数据源),所以需要在代码的开始指定hive数据源
           try {
             Class. forName("org.apache.hive.jdbc.HiveDriver");
           } catch (ClassNotFoundException e) {
             e.printStackTrace();
           }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值