以下是我在2017 ES 广州 meetup的分享

ppt:https://elasticsearch.cn/slides/11#page=22

摘要

ES最多使用的场景是搜索和日志分析,然而ES强大的实时索引查询、全文检索和聚合能力也能成为数据仓库与OLAP场景的强力支持。本次分享将为大家带来数说故事如何借助ES和Hadoop生态在不同的数据场景下构建起数据仓库能力。

背景

数说故事主要业务为数据商业智能分析,涉及业务包括数字营销、数据分析洞察、消费者连接,同时我们还拥有自己的数据源。

目前我们内部有3种主要取数方式,一种是基于HBase的大规模导出,通俗来说就是Scan HBase扫表,一般用来处理需要全表数据做离线处理的需求。第二种是先从ES query出ID,然后再从HBase get数据,这里ES被当做了HBase的索引层,这种取数方式在我们的业务中用的最多。之所以不从ES取数,一方面是由对ES负担压力比较大,另一方面是无法存放较长的字段。第三种与全量数据库无太多关系,主要涉及业务层面,比如对已有的ES小库做打标签或者ETL操作,然后进行转化写入另一个库,类似数据仓库中将工作表提取出来,然后转换写入另一个表。
基于这些需求我们希望有一个能够统一三种取数模型的解决方案,这也就是Gaia项目的由来,Gaia其实就是离线取数与基础分析能力的构建。

Gaia

Gaia需要解决的问题主要有四点。

  • 一是构建Hive on HBase/ ES/Banyan(对于三种取数模式)的能力,由于Banyan是基于ES索引,所以它在构建时要做的事情与ES差不多。
  • 二是对不同存储的查询条件优化,在MySQL中使用where条件查询之所以会很快,是因为MySQL已经帮你建立的索引。对应到NoSQL中其实也是一样的,如果where条件没有与索引层建立好关系,select查询就会触发全表扫描,造成很大的负担。
  • 三是提供ES特有的查询支持。
  • 四是提供拓展性的SQL表达能力。

StorageHandler

在介绍如何构建Hive on ES/Banyan之前,要先讲一下StorageHandler,它是Hive对接外部存储的核心类,主要功能有三个:InputFormat / OutputFormat(如何读写)、MetaHook(如何读写Hive元数据)、Predicate Pushdown(下推优化、分解条件)。
这三个功能中InputFormat在做两件事,首先是InputSplit——按片分割,利用preference制定shard做到并行读取,第二个是RecordReader——内部先scroll一批数据,然后一直调next到当前数据为空时,scroll新一批数据。
之前提过Banyan和ES的取数方式其实差不多,不同之处在于Banyan扩展了自己的StorageHandler和InputFormat。正常情况下ES scroll到数据后会直接传给SearchHit,这里则新增了读Hbase的过程,接着再生产新数据填充给SearchHit。

下推优化

StorageHandler的下推优化在数据库中是一个比较重要的概念,它涉及到了Sargable和谓语下推两个概念。Sargable的全称是Search ARGument ABLE,即SQL中可利用数据库自身索引优势对查询条件进行执行性能优化。一般来说可以优化的为SQL中的WHERE条件,ORDER BY , GROUP BY, HAVING 等有时候可Sargable,当然情况并非绝对,主要还是和实际数据库的支持有关。谓语下推是在实际数据读取和SQL实际执行之前预先执行条件语句进行预处理和过滤。
接下来所讲的就是下推优化的具体实现。
首先从StorageHandler中获取到ExprNodeDesc结点树对象,再基于该对象构建通用的结点树。这一步是可行的过程,一般可以直接基于Hive的原生对象实现,但是我们想要更加定制化的操作以及同时支持HBase和ES不同的存储,所以还是将它给抽了出来。
第二步是自顶向下查询可优化的操作符并进行优化,数据存储的时候已经预先定义好了可优化的操作符。在遇到不可优化的操作符时,会出现两种情况。如果逻辑连接符是AND则跳过当前节点并继续优化兄弟节点,若果是OR则放弃优化。
最后一步是将可优化的结点树转为存储可支持的查询条件(ES Query、HBase Filter等)。
(Hive的源码对象)
在有了构建能力之后,还需要支持ES特有的查询。之所以要怎么做,是由于像es_match、es_matchphrase之类的,如果是在ES的场景下很好实现,但是要用代码实现不仅麻烦而且性能很低。最后我们经过考虑,决定对他们的支持不做具体实现,只是返return true,只用来做下推查询。

ES自动建表

在有很多小表的情况下,如果用户借助数参建表,每次需要使用create table还要写入众多字段。数据和mapping都在的情况下,还要使用这种方式实在是过于繁琐。所以我们给Gaia新增了一个新的特性——ES自动建表,只需要指定es.nodes和es.resource,就可以读取mapping以及数据抽样检查,最后生成完整的create table语句。它的实现是基于SemanticAnalyzerHook 拦截 ASTNode语法树,再读取ES mapping,重写 CREATE 语句。

Gaia-优势

从业务层面来看Gaia减少了写代码的开销和出错率,是更友好的筛选取数工具,同时也为后续的数据分析提供了基础。对平台方来说最重要的是有统一管控计算资源以及审计的能力。

Cube

数说立方(Cube) 是数说故事自研的基于ES的OLAP产品,可提供非技术人员自由的导入数据、维度透视、统计分析等功能。
ES为Cube提供了几点优势。一是即席查询,可以实时查询且灵活度高,只需要索引字段而不用预计算出维度表。二是占用空间小,由于使用ES索引代替维度表,所以空间的开销得以减小。三是全文检索支持,lucene支持。

ES相关技术点

这里先讲下使用Es-hadoop过程中的一些经验。

  • 建议使用lasted stable的es-hadoop版本,因为旧版本还是有些隐性BUG,而新版代码更加清晰,对旧版也有很好的兼容。
  • 使用时注意一些特殊字段(suggest, array,nested等) ,可能会有坑或不兼容等。比如某个旧版本中在识别到suggest后,就不会再去扫描后续字段。

Es-hadoop还支持跨版本ES的读写。在ES5的时候es-rest被独立出来,用来提供客户端统一接口读写不同版本ES的能力。
Cube通过Schema识别实现了ES表的自动导入,这里主要遇到的问题是ES的数组字段不易识别,因此我们对导入的库做了抽样数据然后进行schema调整。
用户导入的表可能包含众多字段,这就出现了一个问题,即什么样的数据字段可以成为维度。对此除了在产品层面提供给用户配置之外,我们还希望能够进行自动识别。因此用到了Cardinality查询,识别字段的基数,然后设定阀值过滤。

以上为全部分享内容,谢谢大家

2017 ES GZ Meetup分享:Data Warehouse with ElasticSearch in Datastory的更多相关文章

  1. 浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案

    作者 王枫发布于2014年2月19日 综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个 ...

  2. 转:浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案

    综述 随着越来越多的组织的数据从GB.TB级迈向PB级,标志着整个社会的信息化水平正在迈入新的时代 – 大数据时代.对海量数据的处理.分析能力,日益成为组织在这个时代决胜未来的关键因素,而基于大数据的 ...

  3. Azure SQL 数据库仓库Data Warehouse (1) 入门

    <Windows Azure Platform 系列文章目录> 在之前的项目中遇到了客户使用SQL数据仓库的场景,在这里记录一下 1.什么是SQL 数据库仓库 (SQL DW) SQL D ...

  4. 混合 Data Warehouse 和 Big Data 倉庫的新架構

    (讀書筆記)許多公司,儘管想導入 Big Data,仍必須繼續用 Data Warehouse 來管理結構化的營運數據.系統記錄.而 Big Data 的出現,為 Data Warehouse 提供了 ...

  5. Azure SQL Data Warehouse

    Azure SQL Data Warehouse & AWS Redshift Amazon Redshift Amazon Redshift 是一种快速.完全托管的 PB 级数据仓库,可方便 ...

  6. 场景4 Data Warehouse Management 数据仓库

    场景4 Data Warehouse Management 数据仓库 parallel 4 100% —> 必须获得指定的4个并行度,如果获得的进程个数小于设置的并行度个数,则操作失败 para ...

  7. Data Warehouse

    Knowledge Discovery Process OLTP & OLAP 联机事务处理(OLTP, online transactional processing)系统:涵盖组织机构大部 ...

  8. DataBase vs Data Warehouse

    Database https://en.wikipedia.org/wiki/Database A database is an organized collection of data.[1] A ...

  9. data warehouse 1.0 vs 2.0

    data warehouse 1.01. EDW goal, separate data marts reqlity2. batch oriented etl3. IT driven BI - das ...

随机推荐

  1. java操作mongodb & springboot整合mongodb

    简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...

  2. PMI-ACP练习题知识积累-打印版

    敏捷铁三角的参数:价值,质量,约束.传统的铁三角包括的参数是范围,进度和成本 敏捷计划的三个主要层级为:发布计划,迭代计划,每日计划 敏捷开发模型的特征包括 开发由多个迭代组成. 敏捷拥抱不确定性,而 ...

  3. IIS+nginx反向代理 负载均衡

    本文没有过多的讲述,只讲述重点地方.由这两个转自的文章进行中和 1.nginx+iis实现负载均衡(这篇文章主要是有第2篇文章的工具) 2.nginx+iis使用(这篇文章讲得很详细,配置文件直接复制 ...

  4. vs/windows程序找不到入口点cuvidGetDecodeStatus于AppDecGL.exe动态链接库上

    解决方法:这个问题的原因是由于使用的英伟达显卡驱动版本不够新,更新显卡驱动即可. 找了一个多月的原因,终于知道起源了.最终问题还是出在了nvcuvid.lib/.dll上面.通过分析vs调试信息可以得 ...

  5. linux常用命令使用方法

    一.常用的分析服务器日志命令 1.查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2.查看某一个页面被访问的次数: grep "/ ...

  6. JAVA Scanner的简单运用

    package Code428; import java.util.Scanner; /*Scanner 可以实现键盘输入数据 引用的步骤1.import 包路径.类名称只有java.lang包下的内 ...

  7. P2255 [USACO14JAN]记录奥林比克

    P2255 [USACO14JAN]记录奥林比克 题目描述 农民约翰热衷于所有寒冷天气的运动(尤其是涉及到牛的运动), 农民约翰想录下尽可能多的电视节目. 为moolympics电视时间表由N个不同的 ...

  8. RROR: [XSIM 43-3238] Failed to link the design.

    仿真时遇到上述错误,在tcl下运行 set_property -name {xsim.elaborate.xelab.more_options} -value {-cc clang} -objects ...

  9. Django—视图

    索引 一.URLconf 二.视图 三.HttpReqeust对象 3.1 QueryDict对象 3.2 GET和POST属性 四.HttpResponse对象 4.1 子类JsonResponse ...

  10. 宏定义define和const的区别

    define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...