docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础...

35

Upload: lythuan

Post on 18-Feb-2018

245 views

Category:

Documents


9 download

TRANSCRIPT

Page 1: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理
Page 2: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理
Page 3: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理
Page 4: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

Java BI新生代

来自百度商业运营的实践 孟然

@数据大不懂

Page 5: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

关于我

 

孟然 百度 架构师

近10年Java相关研发经验,

关注 •  应用中间件 •  服务化架构 •  高性能计算

Baidu 百度

Page 6: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

大纲

没啥效果

Baidu 百度

BI介绍和实施过程中遇到的问题 1

摸索前进和相关Java工具的应用体会 2

技术框架展示及未来的规划展望 3

Page 7: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI – 印象

好像很贵

OLAP吧 实施周期⻓长

数据仓库

报表 没啥效果

开源的少

数据挖掘

Baidu 百度

ETL

Page 8: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI – 认识

目标:数据转化为知识

价值:辅助商业决策

方式:一个解决方案

挑战:大数据和分析模型

决策支持

运营分析

管理效能

Baidu 百度

Page 9: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI – 行业现状

Baidu 百度

Page 10: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 1.0 – 标准实施流程

•  应用集成 •  数据价值链

•  数据二次加工(聚集) •  分析建模

应用阶段

ETL阶段

报表阶段

OLAP 阶段

实施 过程

•  数据一次加工(登台) •  质量把控

•  数据三次加工(展现) •  报表可视化

A

R

O

E

Baidu 百度

~70%

Page 11: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 1.0 – 技术思路

Baidu 百度

面向存储的DW + 面向分析的DM

物化处理 + 各级缓存

稳定式数据建模 + 报表

比较分析法 + 多维分析法

Page 12: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 1.0 – 相关工具

Eclipse  Birt 02

可视化和报表 模型和分析 存储和计算

Jasper  ReportjPivot

Mondrian

ZKSpreadsheetSaiku  AnalyBcs

MS  Excel

Pentaho  KeDleMySQLWeka

Baidu 百度

Hive Palo(百度) ETLJet(百度)

面向RD 提供API

面向RD 提供框架

面向用户 提供服务

R

Page 13: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 1.5 – 我们的实践

Baidu 百度

技术

n  ROLAP

n  数据库分片

n  多级结果缓存

n  Agg ETL

n  条件预热

n  服务分级

辅助

n  20个VM + 2台物理机

n  UV在3w左右

n 最小数据延迟时间30min

数据

5亿条事实数据的cube 3秒内响应占比97%

不满意

接入组件

报表配置&集成套件

报表运行时服务

多维计算 组件

报表引擎 组件

可视化 组件

公共基础 组件

Cube Access

JavaCC

FlatData Access

Http Invoker

Json Rpc

DB Con Pool

Cluster Agent

Parallel Calculator

Cache Client

UDF Lib

PivotData Model

MetaData Lib OLAP

Engine

条件 格式

规则引擎 计算列 参数

处理器 模板解析

执行引擎 权限接口

设计工具 Cube建模 图形 设计器

高级查询 Parameter

透视表 Pivottable

图形 Echarts

格式转换 Transform

交互分析 Interaction

布局 Layout

XUI Framework

API&URL 服务

固定报表 动态报表 多维分析报表

组件架构

图形 API

OLAP API

预警 API

静态化 API

数据投递 API

透视表 设计器 SQL编辑器

Page 14: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 1.5 – 3%的困扰

Monster用户 超大维度、全量事实数据

钻透操作结果不一致 不同粒度数据不同延迟度

无法Ad-hoc 受限于约定好的指标和维度

自服务能力不够 門槛还是高

响应低延迟的交互分析体验

数据低延迟

技术 难点

Baidu 百度

Page 15: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – Key Points

Baidu 百度

Build

Fullstack@Web

Run

In-Memory/Cluster

Schemaless ETLless Deployless

ElasBc Parallel Mini  Cubes

Template  First InteracBon  First

Page 16: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Java8 Stream

•  Parallel Stream/Reduction •  Sum/Count/Avg/Distinct •  Filter/Groupby

原型请参考https://github.com/totyumengr/minicubes

内存Cube聚合计算

Baidu 百度

n  Parallel模式远快于Sequential模式,但稳定度不如

n  Concurrent Reduction慢于普通Reduction模式

n  And/Or操作太消耗方法堆栈(XSS),超K个基本不行

n  不支持in,Filter大量value需要定义Predicate

Page 17: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Java8 Stream 实际测试数据

Baidu 百度

* Java8 Stream parallel循环执行几次sum聚集计算,parallel模式的第一次通常较慢(和sequential模式持平);

1. vm上800w数据全量sum,parallel模式(约190ms)比sequential模式(约850ms)快4倍左右;

2. 物理机上2000w数据全量sum,parallel模式(约230ms)比sequential模式(约2秒)快9倍左右; * 8G内存中大约可以存放2.5kw条记录(5个维度和4个指标),这些原始数据大小应该在1.5G。 * 3台物理机+1台虚拟机搭建集群上载入大概1亿条数据:

1. 单指标全量sum耗时平均400ms左右; 2. 单指标全量groupby-sum耗时平均600ms左右,结果7000条左右; 3. 单指标全量groupby-distinct耗时平均800ms左右,结果7000条左右; 4. 单指标全量groupby-distinctcount耗时平均800ms左右,结果7000条左右; 5. 虚拟机性能是物理机的1/3~1/2,所以请保持虚拟机载入数据量为物理机1/3~1/2;

**以上基于CPU12核/内存128G的物理机和CPU8核/16G内存的虚拟机搭建集群测试得出**

引用自: http://www.infoq.com/articles/forkjoin-to-parallel-streams Posted by Raoul-Gabriel Urma & Mario Fusco on Feb 21, 2014

传统单线程

Java8 Stream

ForkJoin框架

Page 18: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Java8 Stream 示例代码

Baidu 百度

•  groupby

•  map merge

•  sum

Page 19: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Bitmap Index

•  Low-cardinality •  AND/OR/XOR •  Compressed

引用 https://github.com/lemire/RoaringBitmap

内存Cube数据索引

Baidu 百度

n  OLAP操作中切片/切块/下钻等,很好的对应到Bit操作

n  大量value间的And/Or操作非常快

n  非常适合distinct[-count]类计算

n  内存非常友好,适合做大数据量的索引

Page 20: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Bitmap Index 实际测试数据

Baidu 百度

•  使用compressed bitset对21147413条记录的5个维度(共340386维值)进行索引,占用内存180M。 •  2000w数据量在单机MySQL和Java8 Stream上性能对比:

具体测试数据请参考https://github.com/totyumengr/minicubes

场景 MySQL Java8 单指标全量sum 8850ms 210ms 单指标全量groupby-sum 24860ms 380ms 单指标全量groupby-distinctcount 26050ms 430ms 过滤1000个维值&&200个维值,单指标groupby-sum 34110ms 380ms 过滤1000个维值,单指标sum 12560ms 240ms 过滤40个维值&&30个维值,单指标groupby-sum 300ms 240ms 过滤6991个维值 && 201个维值,单指标sum操作 600ms

Page 21: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Hazelcast

•  Parallel Query Executor •  Shard Manager •  Delta Data/Index Queue

引用 https://github.com/hazelcast/hazelcast

内存Cube集群

Baidu 百度

n  轻量级去中心化的集群构建和管理工具

n  Distributed ExecutorService实现

n  移除大量缓存Key时有不一致的现象

n  Map实现性能不高,单机单线程3k/s的put操作

Page 22: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 基础技术 – Spring Boot

•  Smart Autoconfiguration •  Cloud Ready – Single Jar •  Easy Dev-Env Setting

引用 https://github.com/spring-projects/spring-boot https://github.com/spring-projects/spring-boot/issues/1106

微服务构建

Baidu 百度

n  真正基于Spring的应用级开发框架

n  消除了Web开发时偏复杂的环境配置过程

n  可执行Fat-Jar目前不适合reload需求环境

n  集成了Metrics、 Jolokia等产品级特性

Page 23: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 突破ROLAP

Baidu 百度

Java开源ROLAP的问题

预警类报表服务

性能表现

叉乘10w个维值是天花板。 现实中很普遍的需求:二级行业维度(200个)和岗位维度(至少500个)交叉 大维度条件会被分批请求DB,然后内存合并,处理时间成几何倍数增⻓长。 退化维和distinct聚合使用带来的MySQL IO占用,间断性拉低整体响应。

架构设计

实现复杂度过高。 架构上⻓长年未进行大版本重构;Cache到处散落;实现MDX导致的逻辑复杂 无法处理大规模数据计算。 过于追求segmentcache复用导致的大结果集内存合并非常占用CPU; 单Actor、单机架构,无法发挥出多核/集群优势 数据冷热分级。 未考虑将超大规模Cube中数据进行分级处理,segmentcache过于碎片化

代码实现

深度应用时会踩到一些“坑”。 比如:schema刷新时的memory-leak;诡异的多维度交叉展开时数据汇总出错;加上计算指标后性能骤降;Top和层级内排序问题; 大量的SoftRef、WeakRef使用,导致GC不友好

Page 24: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 突破ROLAP

Baidu 百度

Java开源ROLAP的问题

变态】

的业务需求举例

On-the-fly维度。 无法落地为Tree状结构的动态维度,如OLTP系统内的数据权限控制问题;指标通过case when转维度查询

组合维度。 业务上希望可以通过下钻追查不同维度层级间的指标问题。

不完整周期的同环比。 比如当前周的环比上周的情况,如果加上月/季度边界条件会更复杂。

distinct-countif。 比如时间维度上看有消费的客户数,还要有同环比。

维值名称频繁调整。 比如在下钻过程中展示当前时间过滤轴维值条件下的一线部門名称。 (现实情况中岗位维度的架构调整比较频繁)

Page 25: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – Tesseract OLAP Engine

Fact + Dimension

Tables

索引管理

(退化)维度

单维轻度聚合

二级索引列

计算列

内置(同环比等)

自定义函数

分析模型

Schema File

SQL生成器

Dialect

Mini Cube

多维模型

DSL Parser Cells Request

REST  API

Pivot Result

Mini Cube

Mini Indexes

任务执行器

Index Task

SQL Task

Baidu 百度

逻辑

Page 26: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – Tesseract OLAP Engine

Baidu 百度

物理

Index Store@主(MMap/NIOFS)

查询服务 (A版本)

增量更新 (B版本)

索引节点@副本

查询服务 (A版本)

增量更新 (B版本)

Index Writer线程 申请更新锁

载入数据/索引写入

开始副本分发

索引管理 - cube1/B building - cube2/A working - cube3/B dispatching

Index Reader线程 Filter

Map Collecor

Nginx Cluster

REST  API

Netty IO

Embedded Tomcat Rest Handler

JVM(Spring Boot App)

Data Source JMX Exporter

JVM

Netty IO

Embedded Tomcat

Index Reader

Index Writer

Dispatch Task Query Task

Fact + Dimension Tables

Groupby

Check

sum/count/distinct Sort

Agg by Java8 Stream Split

Route

Fill

Combine

MiniCubes MiniCubes

Hazelcast

- Cluster Manager - Cluster Event Queue

Cluster

Page 27: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 突破传统报表

Baidu 百度

设计器

提供客户端软件形式居多。比如JasperReport和Birt

纯画布式设计理念。門槛非常高

面向报告类的排版⻛风格设计。CSS绝对定位

数据可视化

多以平面表格(最多二维交叉表)来承载数据模型

面向“打印机”的报表。 缺乏报表内组件的Interaction设计思路。整体驱动力仅仅是一条SQL

可视化能力较差。 图形大都后台生成的静态图片,缺少现代富交互图形效果。 更加缺少领域内的可视化模型:营销转化漏斗、类脑图的因素分析

二次

开发

后端技术生成的HTML报表。 报表⻚页面结构组织非常“怪异”,无法深入集成:比如内外⻚页面间事件通知

Java开源报表引擎的问题

Page 28: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 突破传统报表

Baidu 百度

Java开源报表引擎的问题

方法:用现代FE技术来做报表和分析工具

变态】

的业务需求举例

报表⻚页面中部分功能的权限控制。 比如:下载功能需要的权限控制,无权限不显示按钮。

报表⻚页面中可以嵌入OLAP工具。 主题分析业务上希望可以有多维交叉和钻取操作,但同时操作不能过于复杂。

固定报表多端展现一致。 同一报表在浏览器、Outlook邮件、下载的Excel中表现一致。

支持在浏览器上全流程制作报表。 开源的报表设计器操控不符合“国情”,用户觉得还是太偏的RD工具。

Page 29: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – XUI Engine

Baidu 百度

前端引擎驱动模式

数据准备

报表组装

数据获取

数据加工 函数表达式计算列/条件格式

透视表模型

处理链

JSON “data”:“OK”

平面表模型 图形模型

权限 系统

DAL

DB

CUBE

App 数据权限

报表服务接入物理模型

报表使用 RMI

VM <div>…</div>

模板化之路 = 打通前/后端组件

BE Access

Entry

元数据 DB

日历 下拉

树形 输入 Form

JS图形 拖放

点击

导出

透视表 平面表

面包屑

OLAP

下载

参数 组件

图形 组件

表格 组件

Interactions Bus

Interactions Bus

Json RPC

Param Handler

Pivot Data Model

Chart Handler

Data Access Layer

Calc/Cf Handler

Distribute Cache

Cube Meta Mgr Olap Model Service

应用 DB

Frontend Action

Data Transfer Bus

静态文件 服务器

1. DI Factory

FE Engine

2. Bind UI event

3. Regist interaction

4. Init phase

分⻚页

WebSocket

Page 30: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – Rich Interactive Report

Baidu 百度

融合OLAP分析能力和报表可视化能力

1. 时间粒度及时间点切换

3. 切片切块

2. 维度指标切换

5. 个性化定制报表

4. 数据下载

6. 维度可下钻 7. 指标排序对比

8. 可下钻至账户明细

9. 趋势分析

•  适度放开OLAP分析功能,平衡操作复杂度 •  加入分析过程可视化支持,增强一体化体验

Demo

Page 31: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – ShowCase

Baidu 百度

Page 32: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 开源计划

Baidu 百度

平台整体开源

2014/10/31

hDps://github.com/Baidu-­‐ecom/bi-­‐plaYorm

•  报表设计器@Web •  JS OLAP工具

•  Tesseract OLAP引擎

Page 33: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

BI 2.0 – 未来规划

Baidu 百度

移动BI方向

大背景

n  决策支持需求客户基本上不在PC端工作

n  业务管理层在移动端有更高的管理效能类指标查询需求

n  语音入口和声音出口更有利于BI类“片状”信息的获取

技术需求

ü  语音识别(百度擅⻓长的领域)

ü  App开发(目前已非难点)

Page 34: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

谢谢

Page 35: docs.huihoo.comdocs.huihoo.com/infoq/qconshanghai-java-bi-the-new-generation... · 公共基础 组件 Cube Access ... 内存Cube 聚合计算 Baidu ... 轻量级去中心化的集群构建和管理

@InfoQ   infoqchina