项目中的报表系统使用开源的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();
}