SparkES 多维分析引擎设计

设计动机

ElasticSearch 毫秒级的查询响应时间还是很惊艳的。其优点有:

  1. 优秀的全文检索能力
  2. 高效的列式存储与查询能力
  3. 数据分布式存储(Shard 分片)

其列式存储可以有效的支持高效的聚合类查询,譬如groupBy等操作,分布式存储则提升了处理的数据规模。

相应的也存在一些缺点:

  1. 缺乏优秀的SQL支持
  2. 缺乏水平扩展的Reduce(Merge)能力,现阶段的实现局限在单机
  3. JSON格式的查询语言,缺乏编程能力,难以实现非常复杂的数据加工,自定义函数(类似Hive的UDF等)

Spark 作为一个计算引擎,可以克服ES存在的这些缺点:

  1. 良好的SQL支持
  2. 强大的计算引擎,可以进行分布式Reduce
  3. 支持自定义编程(采用原生API或者编写UDF等函数对SQL做增强)

所以在构建即席多维查询系统时,Spark 可以和ES取得良好的互补效果。通过ES的列式存储特性,我们可以非常快的过滤出数据,并且支持全文检索,之后这些过滤后的数据从各个Shard 进入Spark,Spark分布式的进行Reduce/Merge操作,并且做一些更高层的工作,最后输出给用户。

通常而言,结构化的数据结构可以有效提升数据的查询速度,但是会对数据的构建产生一定的吞吐影响。ES强大的Query能力取决于数据结构化的存储(索引文件),为了解决这个问题,我们可以通过Spark Streaming有效的对接各个数据源(Kafka/文件系统)等,将数据规范化后批量导入到ES的各个Shard。Spark Streaming 基于以下两点可以实现为ES快速导入数据。

  1. Spark RDD 的Partition 能够良好的契合ES的Shard的概念。能够实现一一对应。避免经过ES的二次分发
  2. Spark Streaming 批处理的模式 和 Lucene(ES的底层存储引擎)的Segment对应的非常好。一次批处理意味着新生成一个文件,我们可以有效的控制生成文件的大小,频度等。

架构设计

下面是架构设计图:

spark-es-4.png

整个系统大概分成四个部分。分别是:

  1. API层
  2. Spark 计算引擎层
  3. ES 存储层
  4. ES 索引构建层

API 层

API 层主要是做多查询协议的支持,比如可以支持SQL,JSON等形态的查询语句。并且可是做一些启发式查询优化。从而决定将查询请求是直接转发给后端的ES来完成,还是走Spark 计算引擎。也就是上图提到的 Query Optimize,根据条件决定是否需要短路掉 Spark Compute。

Spark 计算引擎层

前面我们提到了ES的三个缺陷,而Spark 可以有效的解决这个问题。对于一个普通的SQL语句,我们可以把 where 条件的语句,部分group 等相关的语句下沉到ES引擎进行执行,之后可能汇总了较多的数据,然后放到Spark中进行合并和加工,最后转发给用户。相对应的,Spark 的初始的RDD 类似和Kafka的对接,每个Kafka 的partition对应RDD的一个partiton,每个ES的Shard 也对应RDD的一个partition。

ES 存储层

ES的Shard 数量在索引构建时就需要确定,确定后无法进行更改。这样单个索引里的Shard 会越来越大从而影响单Shard的查询速度。但因为上层有了 Spark Compute层,所以我们可以通过添加Index的方式来扩大Shard的数目,然后查询时查询所有分片数据,由Spark完成数据的合并工作。

ES 索引构建层

数据的结构化必然带来了构建的困难。所以有了Spark Streaming层作为数据的构建层。这里你有两种选择:

  1. 通过ES原生的bulk API 完成索引的构建
  2. 然Spark 直接对接到 ES的每个Shard,直接针对该Shard 进行索引,可有效替身索引的吞吐量。
时间: 2024-10-27 16:50:54

SparkES 多维分析引擎设计的相关文章

基于Renascence架构的SQL查询引擎设计

基于Renascence架构的sqlite查询优化 sqlite查询优化方案是一开始是在Hw时设计的,但当时只实现一些简单case,并未完成sql的普遍支持.后面考虑到这可以做为 Renascence 架构的一个实验场景,因此将其方案做了一番修改,代码也重写了一遍,现在做成一个能支持普通sql查询的demo. sqlite架构 参考:http://wiki.dzsc.com/info/7440.html sqlite是移动设备广泛使用的轻量级数据库引擎.它主要由前端--虚拟机--后端三部分组成,

《上古卷轴》最新作正式推出或将采用全新的3D引擎设计

Bethesda本周正式宣布将推出<上古卷轴>系列游戏的最新作<上古卷轴:斯凯瑞姆>.目前有关这款游戏的细节我们还所知甚少,不过据IGN网站上的 一小段宣传视频似乎可以看出至少按目前的设定游戏中龙族将扮演邪恶角色.另外游戏的场景将安排在<上古卷轴>系列游戏前作中泰姆瑞尔帝国以北的斯凯瑞姆地 区. <上古卷轴:斯凯瑞姆>似乎会采用全新的3D引擎设计,不过Bethesda公司的高管Nick Breckon早些时候曾在tweet上发帖称他目前还无法确认这一点.随后

[申精]淘宝网爬虫引擎设计架构图等

问题描述 我曾经是一名JAVAWEB程序员,2009年12月辞去工作后,来到北京找工作,我现在在一家金融公司做网管,白天工作很是郁闷(网管的郁闷想必大家都知道吧,领导不重视技术,看待搞技术的和看待民工类似),只有晚上下班后,才是我的自由程序员时间,沉浸在我编程得到快感之中.我现在利用我所有的闲余时间,所有的周末.制作了淘宝网决策搜索引擎啊.但随着项目的制作进展,我发现<淘宝网>自身由于掌握自己数据库,做的会比我更好,目前我计划将项目做成一个网罗各大购物网站的专业搜索引擎,提供各种商品和商家的情

这些年,我工作上走过的路

毕业季 2008年12月,清晨的阳光有气无力的铺在了一片没有经过打理的草地上.有了阳光,没了打理,自然成了杂草儿们的天堂,千奇百怪任性长着.阳光顺着草地,扶着墙翻过窗子,跃进了阳台.阳台左边是洗手间,前方是一个虚掩着的门,到了这,阳光止住了它慵懒的脚步.大学的宿舍是长方形的,四个边角都放着写字台和床.说是床,其实就是写字台上的一个挡板.海南蚊子多,所以挡板上都是有蚊帐的,蚊帐带来的坏处是,如果蚊子进去了,它除了烦你也别无出路,好处是,可以形成自己的一个小牢笼.我睡眼惺收,散发着一丝颓废的气质.颓

自定义Spark Partitioner提升es-hadoop Bulk效率

前言 之前写过一篇文章,如何提高ElasticSearch 索引速度.除了对ES本身的优化以外,我现在大体思路是尽量将逻辑外移到Spark上,Spark的分布式计算能力强,cpu密集型的很适合.这篇文章涉及的调整也是对SparkES 多维分析引擎设计 中提及的一个重要概念"shard to partition ,partition to shard " 的实现.不过目前只涉及到构建索引那块. 问题描述 当你bulk数据到集群,按照ElasticSearch Bulk 源码解析所描述的:

设计自己的3D图像引擎(1): WuguiEngine之开篇的话

前言: 研究3D游戏相关的知识有了不少的时间了.最近一段时间开始写自己的3D图像引擎-WuguiEngine. 代码也参考了不少的资料. 从引擎的功能上来说,不求能够让大众接受, 不求能够成为一个众多人维护的开源项目(不过源代码是开放的,只是没有太多精力来管理一个项目). 只是我一个在学习过程中的一个简单的项目.同时我在编写的过程中也希望能够多和大家交流, 把我的心得与大家分享, 也希望大家能够为我的学习或者项目提出一些意见. 本引擎虽然不算一个很易用的引擎, 不过也会实现目前流行的一些技术.

唐端荣|DSP投放引擎的设计与实现

广告,即广而告之.广告的本质是传播,广告的灵魂是创意.广告一词,据考证是一外来语.它首先源于拉丁文advertere,其意为注意,诱导,传播.中古英语时代(约公元1300-1475年),演变为Advertise,其含义衍化为"使某人注意到某件事",或"通知别人某件事,以引起他人的注意".直到17世纪末,英国开始进行大规模的商业活动.这时,广告一词便广泛地流行并被使用.此时的"广告",已不单指一则广告,而指一系列的广告活动.静止的物的概念的名词Ad

大数据时代的互联网分析引擎

随着互联网尤其是移动互联网的高速发展,互联网文档的数量.内容的丰富度和复杂度都大大增加,互联网正朝大数据时代迈进,而用户的信息需求也趋于复杂化.除了基本的信息检索需求外,对大量相关文档的深入理解与聚合分析的需求也越来越强烈,而传统的互联网搜索引擎已经无法满足人们对该类信息的需求.针对这一问题,提出"互联网分析引擎"的构想,阐述了其与搜索引擎和OLAP分析系统的区别,介绍了一种互联网分析引擎的架构,并详细讨论了实现该引擎的核心问题. 1 引言 随着移动互联网.智能手机.社交媒体.自媒体技

《Cocos2D-X游戏开发技术精解》一1.2 Cocos2D-X引擎的来历

1.2 Cocos2D-X引擎的来历 Cocos2D-X游戏开发技术精解 Cocos2D-X游戏引擎并不是最初的版本.从名字读者就能看出最早的版本其实为Cocos2D引擎版本.追溯起来,Cocos2D引擎已经有5年的历史了.在2008年3月,Ricardo Quesada发布了Cocos2D引擎的第一个版本.最初的引擎版本定位于平面游戏框架,使用的开发语言为Python语言.在发布之初,只有235份的下载量.之后的两年间,Cocos2D引擎的受众群体依然很少,很少有游戏开发者知道. 说明: Co