Spark与缓存
预期成果
1.1 当前问题
当前以图搜图应用存在的问题:
- 当前使用spark RDD方案无法达到数据实时加载(每10分钟加载一次,虽然可配,但太短可能会有问题)
 - Spark RDD内存会被分为两部分,一部分用来缓存数据一部分用来计算,Spark默认配置只有差不多50%的内存用于缓存(也就是说executor配了100G,只有50多G可以被用来做缓存),虽然比例可以进行配置,但增加缓存内存比例后,是否会影响计算性能有待测试。
 - 当前数据全缓存到spark jvm内存中,GC时间较长会导致影响计算性能
 - 当前加载的RDD只有自身context才能使用,无法做到应用间共享
 - 当driver端服务宕掉后,缓存的数据也会丢失
 - 期望能将增量数据加载时间缩小到足够小达到准实时,或者直接能够达到实时
 - 职责分明,缓存有分布式缓存做,Spark只负责计算
 - 缓存数据不占用Spark jvm内存,减少GC对计算的影响
 - 加载到内存的数据可以被其他应用使用
 - Driver端服务宕掉后,缓存数据不会丢失,其他driver段仍可使用
 - 采用新方案对比原方案,性能损耗尽可能小,最好达到无损耗
 
1.2 预期成果
2 技术选型
根据上述问题和预期成果,期望选择一款与Spark结合较好的分布式内存缓存计算,从而将缓存工作从spark中抽离出来,让spark专注于计算。
2.1.1 Apache Ignite
Apache Ignite内存数据组织是高性能的、集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升。
选择预研该技术最大的原因为,Ignite实现了一个可共享的Spark RDD,可实现增量数据实时在比对中体现。
2.1.2 Alluxio(原Tachyon)
Alluxio在1.0版本后由原来的Tcahyon更名。Alluxio与Spark结合较好,Spark1.5后增加的缓存方式:OFF_HEAP(堆外缓存)当前只支持tachyon。
不过Alluxio和Spark RDD一样都不可变,缓存文件一旦写入就不能修改,且在完成写入之前缓存数据是无法读取的,这样就服务达到增量数据的实时性,但可以实现尽可能缩短增量加载时间来达到准实时性。
3 阶段性结论
性能测试采用上述两种技术三个版本(apache-ignite-fabric-1.5.0.final、alluxio-1.0.1、tachyon-0.7.1-hadoop2.6-build)八种方案:
- 直接采用Spark RDD缓存,且缓存数据不做序列化
 - 直接采用Spark RDD缓存,缓存数据使用java序列化方式
 - 直接采用Spark RDD缓存,缓存数据使用kryo序列化方式
 - 采用Spark RDD OFF_HEAP模式(即缓存数据到tachyon),缓存数据使用java序列化方式
 - 采用Spark RDD OFF_HEAP模式(即缓存数据到tachyon),缓存数据使用kryo序列化方式
 - 使用tachyon缓存数据(调用saveAsObjectFile,直接将数据序列化成文件写到tachyon中),saveAsObjectFile使用java序列化方式
 - 使用Alluxio缓存数据(调用saveAsObjectFile,直接将数据序列化成文件写到Alluxio中),saveAsObjectFile使用java序列化方式
 - 使用ignite缓存数据,使用IgniteRDD进行统计
 
下面为三台256G内存集群,58727000条数据,Spark分配36核,测试结果如下:
| 
 缓存方式  | 
 内存配置  | 
 是否序列化  | 
 序列化实现  | 
 检索耗时(s)  | 
 内存空间(GB)  | 
| 
 Spark RDD  | 
 executor:150GB*3  | 
 否  | 
 
  | 
 11.527  | 
 112.8  | 
| 
 Spark RDD  | 
 executor:150GB*3  | 
 是  | 
 java  | 
 20.09  | 
 56.4  | 
| 
 Spark RDD  | 
 executor:150GB*3  | 
 是  | 
 kryo  | 
 16.275  | 
 51.8  | 
| 
 Spark RDD + tachyon  | 
 executor:20GB*3 tachyon:100GB*3  | 
 是  | 
 java  | 
 21.771  | 
 51.56  | 
| 
 Spark RDD + tachyon  | 
 executor:20GB*3 tachyon:100GB*3  | 
 是  | 
 kryo  | 
 17.772  | 
 51.83  | 
| 
 tachyon  | 
 executor:20GB*3 tachyon:100GB*3  | 
 是  | 
 java  | 
 32.719  | 
 53.03  | 
| 
 Alluxio  | 
 executor:20GB*3 alluxio:100GB*3  | 
 是  | 
 java  | 
 26.988  | 
 53.03  | 
| 
 ignite  | 
 executor:20GB*3 ignite:10GB*3(数据保存在堆外,不使用jvm内存)  | 
 是  | 
 java  | 
 333.228  | 
 
  | 
由上表分析如下:
- 检索耗时最短为方案一,直接缓存到spark jvm中且不做序列化,但该方案占用内存也较多(目前是其他方案的两倍),不过当前以图搜图框架中数据结构采用map,所以较占内存
 - 方案一、二、三对比,采用序列化会有性能损耗,kryo序列化耗时是java序列化的1/2,与之前测试基本一致,采用kryo序列化112GB数据耗时4-5秒
 - 对比方案二、方案四以及方案三、方案五,从tachyon拉数据到spark进行计算耗时为1秒左右,但由于存储到tachyon必须序列化,所以得加上序列化的耗时,最少的性能损耗也差不多5-6秒
 - 直接调用saveAsObjectFile保存数据到tachyon或者Alluxio,性能损耗较大,分别为22秒和14秒,初步估计性能损耗由于:(1)saveAsObjectFile采用java序列化方式,性能损耗将近9秒;(2)saveAsObjectFile内部实现使用的是hadoop api,tachyon能够兼容这些api,但可能有部分性能损耗;(3)spark可能对tachyon存储做过一定优化
 - 由表格可以看出ignite结合spark性能很差,估计原因可能为:(1)可能修改某些配置后可以优化性能,但iginte资料非常少,特别是跟spark结合这块,基本没有什么资料;(2)ignite本身不单单包含存储功能,还有检索、计算等功能,所以它与spark本身也存在竞争关系
 
结论如下:
- ignite如需优化性能需要深入源码,且没有对比数据,具体最后能到什么程度无法预估,且当前基本没有什么已知公司使用该技术与Spark结合
 
Alluxio(Tachyon)性能优化需要看Spark缓存代码,但是该方法最终能够达到的性能指标基本能够预估(较现有方案有5-6秒的损耗,但内存消耗可能会有所减少)
Spark与缓存的更多相关文章
- Spark源码系列(五)分布式缓存
		
这一章想讲一下Spark的缓存是如何实现的.这个persist方法是在RDD里面的,所以我们直接打开RDD这个类. def persist(newLevel: StorageLevel): this. ...
 - Databricks缓存提升Spark性能--为什么NVMe固态硬盘能够提升10倍缓存性能(原创)
		
我们兴奋的宣布Databricks缓存的通用可用性,作为统一分析平台一部分的 Databricks 运行时特性,它可以将Spark工作负载的扫描速度提升10倍,并且这种改变无需任何代码修改. 1.在本 ...
 - Spark SQL 之 Data Sources
		
#Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...
 - Spark官方文档 - 中文翻译
		
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
 - Spark 架构
		
本文转之Pivotal的一个工程师的博客.觉得极好. 作者本人经常在StackOverflow上回答一个关系Spark架构的问题,发现整个互联网都没有一篇文章能对Spark总体架构进行很好的描述, ...
 - Spark SQL 官方文档-中文翻译
		
Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...
 - Spark 学习笔记1 (常见术语 )
		
本来没打算学Spark 的,不过时机很逗. 最膜拜的大神做spark分享,还是其中最好玩的notebook.这不就是另外一个 HUE吗,但感觉更好玩. 刚好新的Spark 2.x 要问世了,大神在组织 ...
 - Hadoop与Spark比较
		
先看这篇文章:http://www.huochai.mobi/p/d/3967708/?share_tid=86bc0ba46c64&fmid=0 直接比较Hadoop和Spark有难度,因为 ...
 - 【译】Spark官方文档——Spark Configuration(Spark配置)
		
注重版权,尊重他人劳动 转帖注明原文地址:http://www.cnblogs.com/vincent-hv/p/3316502.html Spark主要提供三种位置配置系统: 环境变量:用来启动 ...
 
随机推荐
- Drools环境搭建
			
Eclipse3.5安装Drools6.5.0.Final插件 到Drools下载页面(现在是http://www.jboss.org/drools/downloads.html) -下载并解压Dro ...
 - 2016.8.19 将div设置为隐藏使用style=“display:none”
			
style="display:none"表示隐藏. style="display:block"表示显示. 在代码中则使用$("#id").s ...
 - Python & Django & Pycharm 安装
			
一.下载安装Python 从https://www.python.org/上下载 Python 2.7.6,双击安装包开始安装: 单击“Next”按钮,进入Python安装组件选择界面.这里我们安装全 ...
 - Oracle 修改带数据的字段类型
			
http://www.cnblogs.com/LDaqiang/articles/1157998.html由于需求变动,现要将一个类型NUMBER(8,2)的字段类型改为 char.大体思路如下: ...
 - json和jsonp以及ajax
			
简单的说: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后 ...
 - 文件I/O之C标准库函数和系统库函数差别
			
1.首先C标准库函数是工作在系统库函数之上的.C标准库函数在读写文件时候都有一个文件流指针.FILE*fp=NULL;// fp=fopen(F_PATH,"r"); fp文件流指 ...
 - uva 11885 - Number of Battlefields(矩阵高速幂)
			
题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,而且该图形的最小包围矩阵的周长也是p,不包含矩形. 解题思路:矩阵高速幂 ...
 - Allegro skill
			
https://blog.csdn.net/wyu0725/article/details/52367199 Allegro skill二次开发和更改菜单页面 简单的使用skill;能够使Aleggr ...
 - Java 9 模块解耦的设计策略
			
1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...
 - 目标检测之行人检测(Pedestrian Detection)---行人检测之简介0
			
一.论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the stat ...