Saiku大概是我的第一个持续更博的技术点,希望自己能在这条研究saiku的道路上越走越远嘻嘻
这里我们来记录一下研究saiku时遇到的异常信息,这篇博客会保持持续更新的。
1. Java heap space: 调节saiku启动文件start-saiku.bat/saiku-start.sh中的JVM参数信息 (根据自己电脑的内存去扩大参数值)
set CATALINA_OPTS= -Xms512m -Xmx768m -XX:MaxPermSize=256m
export CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Xms1024m -Xmx2048m -Xss1024k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:-UseGCOverheadLimit -XX:+UseConcMarkSweepGC -Dfile.encoding=UTF-8 -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true -Djava.awt.headless=true"
2. GC overhead limit exceeded : 调节saiku启动文件start-saiku.bat/saiku-start.sh中的JVM参数信息 (根据内存运行情况指定GC方式)
set CATALINA_OPTS= -XX:-UseGCOverheadLimit -XX:+UseConcMarkSweepGC
3. NumberFormatException: saiku执行查询时出现 这时候请注意一下自己定义的表达式 是不是字段值为空,然后参与运算的时候就会出现此异常
比如我的场景是: 在数据中有个日期字段 countdate,存储的是年月日时分秒数据,我在saiku中自定义了表达式去根据日期字段过滤出最近一周的数据,当countdatez字段为空时就会出现NumberFormatException, 表达式如下:
Datepart('ww',now()) = Datepart('ww',
DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)))
and (
(year(now()) = cast(left([countdate].[countdate].CurrentMember.name,4) as Integer))
or
((year(now()) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=1))
)
and
instr(
IIF(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer) = (YEAR(now())-1)
,(
iif((datediff('y',DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)),
Dateserial(year(now())-1,12,01))>0)
and (cast(left([countdate].[countdate].CurrentMember.name,4) as Integer) =(YEAR(now())-1))
,"yes","no")
)
,"yes"
),"yes")>0
4.Error loading page (无法加载页面): 这个可以看一下后台日志,我的后台日志是说 无法找到对应的 cube信息
原因分析: 我先拖拽了一些数据保存至固定文件夹下,然后修改了xml文件中cube名,原来保存的数据cube名不见了,saiku也不会自动更新所有的,所以就会出现此异常
处理方式: 将cube名复原 ,或者也可以删除原来拖拽保存好的信息,根据现在的cube重新拖拽一份数据再保存即可。
5.NullPointerException: 这个空指针异常一点也不陌生啦对不对哈哈哈。。。
原因分析: 和异常4有些类似,也是先保存好了文件,然后修改了xml中cube的 维度或者指标名,直接打开保存好的数据文件时 就会发现找不到以前的指标或维度信息,然后就空指针异常啦
处理方式: 编辑此数据,将被修改的字段重新拖拽然后执行即可。
6.MondrianException: Mondrian Error:Internal error: Query required more than 12 iterations : 这个异常有点神奇,我这里报出这个异常是因为我的cube定义中用到了计算指标 calculatedMeasure,定义时数据类型定义错了,更改后就正常查询了。更改之前为:<CalculatedMemberProperty name="FORMAT_STRING" value="#0.00%"/> 这里是想定义数据形式为百分比,最后使用Percent去定义就成功啦!!!
<CalculatedMember name="KPI" dimension="Measures">
<Formula>cast(IIF(([Measures].[完成量]=0) and ([Measures].[總量]=0) ,"0.00",cast([Measures].[完成量] / [Measures].[總量] as string)) as Numeric)</Formula> <!--[Measures].[完成量] / [Measures].[總量] -->
<CalculatedMemberProperty name="FORMAT_STRING" value="Percent"/>
</CalculatedMember>
7. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies : 这个异常好像是随机的一样,我之前部署saiku都没有碰到过这样的问题,最近就碰到了,网上百度的时候说是tomcat的问题扫描包的相关问题,然后也有很直观的说是-XSs这个参数设定值的问题。
解决方法: 将saiku里面的tomcat下的catalina.properties文件 (tomcat/conf/catalina.properties)
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ 改为 tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ bcprov*.jar
如果这样修改后还没有解决问题,就在 saiku的tomcat下的catalina.sh文件中添加JVM参数设定信息。(saiku/tomcat/bin/catalina.sh)
export CATALINA_OPTS="-Xms1024m -Xmx2048m -Xss1024k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:-UseGCOverheadLimit -XX:+UseConcMarkSweepGC"
8. Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap : Unsupported major.minor version 52.0;
异常原因: 本地编译saiku的时候用的是JDK 1.8 ,后来部署到服务器上发现服务器默认的jdk是1.7版本的,所以就报错了
解决方法: 指定tomcat启动的jdk版本为1.8 (前提是当前服务器上有安装jdk1.8哦)
修改文件 saiku-server/tomcat/bin/setclasspath.sh ,在文件 第二行 加入如下内容
#!/bin/sh
#在tomcat中指定jdk版本 tomcat/bin/setclasspath.sh
export JAVA_HOME=/app/lib/jdk1.8.0_92
export JRE_HOME=$JAVA_HOME/jre