May 23, 2019 • Gina Zhai

随着数据量的激增,传统的 OLTP 平台已无法满足用户的分析需求。OLAP 平台应运而生,OLAP 平台通常由 OLAP Engine 与用户操作分析页面组成。本文将会以 Saiku + Kylin 的组合方式讲解多维 OLAP 平台的搭建。

Saiku 简介

Saiku 是一个用于 OLAP 分析的套件。用户可在浏览器中通过拖拽的方式进行分析。降低了使用者的学习成本。它能够连接多种数据源,如 Microsoft SQL Server, Oracle Database, MySQL, MongoDB 等。
Saiku 支持两种连接方式:一是 Mondrian,二是 XMLA。
Mondrian 是一个开源的商务分析引擎。使用 MDX(MultiDimensionalExpressions) 完成多维查询。
XMLA(XML for Analysis)是一种基于简单对象访问协议(SOAP)的 XML 协议。

Kylin 简介

Kylin 是一个基于 Hadoop 的 OLAP 引擎,可查询分析历史与实时数据,并在亚秒级返回查询结果。

前期准备

  • 安装 JAVA 并设置 JAVA_HOME
  • Saiku 社区下载 Saiku 最新版本
  • Kylin 官网下载 Kylin 最新版本,即 2.6.2
  • 在 Kylin v2.6.2 中构建一个 Cube

    连接 Saiku 到 Kylin

    1.执行 unzip saiku-latest.zip 解压下载好的 Saiku 包,切换至 saiku-server 文件夹。解压下载好的 Kylin 包,进入解压后文件夹,将 lib/kylin-jdbc-.jar 拷贝至 saiku-server/tomcat/webapps/saiku/WEB-INF/lib
    2.在 saiku-server 文件夹下执行 ./start-saiku.sh 命令启动 Saiku,启动后可在浏览器中输入 http://localhost:8080 访问 Saiku 页面。默认端口为 8080,可在 saiku-server/tomcat/conf/server.xml 中进行修改。
    Saiku   Kylin 搭建多维 OLAP 平台 - 图1
    3.访问 https://licensing.meteorite.bi/login 进行注册并登录。
    4.登录后,先创建公司(必须),再创建 License,Hostname 为启动 Saiku 的机器 IP。创建完成后,下载 License 到本地。
    Saiku   Kylin 搭建多维 OLAP 平台 - 图2
    5.访问 http://localhost:8080/upload.html 上传 License。上传所需用户名与密码均为 admin
    6.访问 http://localhost:8080 进行登录,用户名密码均为 admin。如果不执行上述 3-5 步骤,直接登录将会报如下错。
    1. Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html
    7.登录后,点击管理控制台,即顶部导航栏最右边包含 A 的图标。然后点击 Add Schema,添加 Mondrian Schema 的 XML 文件和 Schema Name,最后点击 Upload 按钮,显示 Upload Successful! 即可。XML 文件由自己编写,官方提供两个参考样例 Earthquakes.xml 和 FoodMart4.xml,在 saiku-server/data 目录下。具体语法可参考这个网站
    Saiku   Kylin 搭建多维 OLAP 平台 - 图3
    如下为本次使用的示例 XML 文件。其中包含一张名为 KYLINSALES 的表,包含 TRANS_ID,PART_DT,LSTG_FORMAT_NAME 这 3 个维度和 1 个 SUM(PRICE) 度量。
    注意_:表(列)名大小写敏感,需与 Kylin 中加载的数据源表(列)名称对应
    1. <?xml version='1.0'?>
    2. <Schema name='default' metamodelVersion='4.0'>
    3. <PhysicalSchema>
    4. <Table name='KYLIN_SALES'>
    5. </Table>
    6. </PhysicalSchema>
    7. <Cube name='kylin_sales_cube' defaultMeasure='Sum PRICE'>
    8. <Dimensions>
    9. <Dimension name='Trans_id' table='KYLIN_SALES'>
    10. <Attributes>
    11. <Attribute name='Trans_id' keyColumn='TRANS_ID' hasHierarchy='true'/>
    12. </Attributes>
    13. </Dimension>
    14. <Dimension name="Date" table='KYLIN_SALES'>
    15. <Attributes>
    16. <Attribute name='Order_date' keyColumn='PART_DT' hasHierarchy='true'/>
    17. </Attributes>
    18. </Dimension>
    19. <Dimension name='Trans_type' table='KYLIN_SALES'>
    20. <Attributes>
    21. <Attribute name='Trans_type' keyColumn='LSTG_FORMAT_NAME' hasHierarchy='true'/>
    22. </Attributes>
    23. </Dimension>
    24. </Dimensions>
    25. <MeasureGroups>
    26. <MeasureGroup name='SUM' table='KYLIN_SALES'>
    27. <Measures>
    28. <Measure name='Sum PRICE' column='PRICE' aggregator='sum' formatString='Standard'/>
    29. </Measures>
    30. <DimensionLinks>
    31. <FactLink dimension='Trans_id'/>
    32. <FactLink dimension='Date'/>
    33. <FactLink dimension='Trans_type'/>
    34. </DimensionLinks>
    35. </MeasureGroup>
    36. </MeasureGroups>
    37. </Cube>
    38. </Schema>
    8.点击 Add Data Source,填写如下参数。
    1. Name: Kylin_Demo
    2. Connection Type: Mondrian
    3. URL: jdbc:kylin://localhost:7070/{project_name}
    4. Schema: {mondrian_schema}
    5. JDBC Driver: org.apache.kylin.jdbc.Driver
    6. Username: {kylin_username} (Default: ADMIN)
    7. Password: {kylin_password} (Default: KYLIN)
    8. Security: (depend on your security setting)
    点击 Save 按钮保存。
    9.点击 Home Tab;点击 Create a new query 进入查询分析页面。
    Saiku   Kylin 搭建多维 OLAP 平台 - 图4
    10.点击选择多维数据集下拉框,选择刚刚创建好的 Kylin 数据源。
    Saiku   Kylin 搭建多维 OLAP 平台 - 图5
    11.通过拖拽的方式选择维度和度量进行分析。结果以表格形式展示,可在页面右边切换图表模式。
    Saiku   Kylin 搭建多维 OLAP 平台 - 图6
    上图所示拖拽方式会首先转换为 MDX 发送给 Mondrian,Mondrian 会将其转换为 SQL 发送给 Kylin,Kylin 查找可回答该 SQL 语句的 Cube,将查询结果返回给 Mondrian,再由 Mondrian 返回给 Saiku 进行展示。上图所示方式生成的 SQL 语句如下:
    1. select "KYLIN_SALES"."TRANS_ID" as "c0", "KYLIN_SALES"."LSTG_FORMAT_NAME" as "c1", sum("KYLIN_SALES"."PRICE") as "m0" from "KYLIN_SALES" as "KYLIN_SALES" group by "KYLIN_SALES"."TRANS_ID", "KYLIN_SALES"."LSTG_FORMAT_NAME"

    常见问题

  1. tomcat 启动报错。java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
    解决方案:在 saiku-server/tomcat/conf/catalina.properties 中的 tomcat.util.scan.DefaultJarScanner.jarsToSkip=\ 后加,*
  2. 选择 schema 后,指标和维度不显示。日志中报如下错:java.lang.NoClassDefFoundError: mondrian/olap/LevelType
    解决方案:解压 saiku-server/tomcat/webapps/saiku/WEB-INF/lib 下的 saiku-query-0.4-SNAPSHOT.jar,删除 mondrain 文件夹后重新打包,并替换原有 jar 包。

    参考文献