写点什么

45 倍加速 Spark 的处理效率?!

  • 2016-04-12
  • 本文字数:2504 字

    阅读完需:约 8 分钟

Spark 代表着下一代大数据处理技术,并且,借着开源算法和计算节点集群分布式处理,Spark 和 Hadoop 在执行的方式和速度已经远远的超过传统单节点的技术架构。但 Spark 利用内存进行数据处理,这让 Spark 的处理速度超过基于磁盘的 Hadoop 100x 倍。

但 Spark 和内存数据库 Redis 结合后可显著的提高 Spark 运行任务的性能,这源于 Redis 优秀的数据结构和执行过程,从而减小数据处理的复杂性和开销。Spark 通过一个 Redis 连接器可以访问 Redis 的数据和 API,加速 Spark 处理数据。

Spark 和 Redis 结合使用到底有多大的性能提升呢?结合这两者来处理时序数据时可以提高 46 倍以上——而不是提高百分之四十五。

为什么这些数据处理速度的提升是很重要的呢?现在,越来越多的公司期望在交易完成的同时完成对应的数据分析。公司的决策也需要自动化,而这些需要数据分析能够实时的进行。Spark 是一个用的较多的数据处理框架,但它不能做到百分之百实时,要想做到实时处理 Spark 还有很大一步工作需要做

图 1

Spark RDD

Spark 采用弹性分布式数据集(RDD),可将数据存在易变的内存中或持久化到磁盘上。 RDD 具有不可变化性,分布式存储在 Spark 集群的各节点,RDD 经过 tansform 操作后创建出一个新的 RDD。RDD 是 Spark 中数据集的一种重要抽象,具有良好的容错性、高效的迭代处理。

Redis

Redis 天生为高性能设计,通过良好的数据存储结构能达到亚毫秒级的延迟。Redis 的数据存储结构不仅仅提高内存的利用和减小应用的复杂性,也降低了网络负载、带宽消耗和处理时间。Redis 数据结构包括字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets), bitmaps, hyperloglogs 和 地理空间(geospatial)索引半径查询。

下面来展示 Redis 的数据结构如何来简化应用的处理时间和复杂度。这里用有序集合来举例,一个以评分(score)大小排序的元素集合。

图 2

Redis 能存储多种数据类型,并自动的以评分(score)排序。常见的例子有,按价格排序的商品,以阅读数排序的文章名,股票价格时序数据,带时间戳的传感器读数。
有序集合依赖 Redis 优秀的内建操作可以实现范围查询、求交集,可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。Redis 内建函数不仅减少代码开发,在内存中执行也减小了网络延时和带宽消耗,可达到亚毫秒级的吞吐延迟。特别地,对时序数据集合来讲,有序集合数据结构比使用内存键值对或使用磁盘的数据库,能给数据分析带来数量级上的性能提升。

Spark-Redis connector

为了提高 Spark 数据分析的能力,Redis 团队开发了一个 Spark-Redis connector ,它使得 Spark 可以直接使用 Redis 作为数据源,顺理成章的 Spark 也能使用 Redis 的各数据结构,进而显著的提升 Spark 分析数据的速度。

图 3

为了展示 Spark 结合 Redis 所产生的效果,Redis 团队拿时序数据集合做基准测试,测试了 Spark 在不同情况下执行时间范围查询:Spark 使用堆外内存;Spark 使用 Tachyon 作为堆外缓存;Spark 使用 HDFS 存储;Spark 结合 Redis 使用。

Redis 团队改进了 Cloudera 的 Spark 分析时序数据的包,采用 Redis 有序集合数据结构加速时序数据分析,并且实现 Spark 访问 Redis 各类数据结构的接口。此 Spark-Redis 时序开发包主要做了两件事:

  1. 它让 Redis 节点与 Spark 集群的节点自动匹配,确保每个 Spark 节点都使用本地 Redis 节点,这样可以明显的优化延迟时间;
  2. 集成 Spark DataFrame 和 Spark 读取数据源,使得 Spark SQL 查询可自动转化,并能借助 Redis 能有效的恢复数据。

换句话说,使用 Spark-Redis 时序开发包意味着用户无需担心 Spark 和 Redis 两者如何使用。用户使用 Spark SQL 进行数据分析可以获得极大的查询性能提升。

基准测试

基准测试的时序数据集是跨度 32 年的 1024 个股票交易市场按天随机生成的数据。每个股票交易所都有有序数据集,以日期和元素属性(开盘价、最高价、最低价、收盘价等)排序,在 Redis 中以有序数据结构存储,采用 Spark 进行数据分析,描述如图 4.

图 4

在上述列子中,就有序集合 AAPL 来看,有序数据集合以天为评分(score,以蓝色表示),每天相关的值为一行(Member,以灰色表示)。在 Redis 中,只要执行一个 ZRANGEBYSCORE 操作就可以获取一个指定时间范围内的所有股票数据,并且 Redis 执行此查询要比其他 Key/Value 数据库快 100 倍。
从图 x 可以看到,横向比较各种情况的基准测试,Spark 结合 Redis 执行时间片的查询速度比 Spark 使用 HDFS 快 135 倍、比 Spark 使用堆内内存或 Spark 使用 Tachyon 作为堆外内存要快 45 倍。

图 5

Spark-Redis 其它应用

按照“ Getting Started with Spark and Redis ”指南,你可以一步步安装 Spark 集群和使用 Spark-Redis 包。它提供一个简单的 wordcount 的例子展示如何使用 Spark 结合 Redis。待你熟练使用后可以自己进一步挖掘、优化其他的 Redis 数据结构。
Redis 的有序集合数据结构很适合时序数据集合,而 Redis 其他数据结构(比如,列表(lists), 集合(sets)和 地理空间(geospatial)索引半径查询)也能进一步丰富 Spark 的数据分析。当使用 Spark 抽取地理空间信息来获取新产品的人群偏好和邻近中心的位置,可结合 Redis 的地理空间(geospatial)索引半径查询来优化。

Spark 支持一系列的数据分析,包括 SQL、机器学习、图计算和流式数据。Spark 本身的内存数据处理能力有一定的限制,而借着 Redis 可以让 Spark 更快的做数据分析。其实 Spark 的 DataFrame 和 Datasets 已经在做类似的优化,先把数据进行结构化放在内存里进行计算,并且 Datasets 可以省掉序列化和反序列化的消耗。结合 Spark 和 Redis,借助 Redis 的共享分布式内存数据存储机制,可以处理数百万个记录乃至上亿的记录

时序数据的分析仅仅是一个开始,更多的性能优化可以参见: Spark-Redis

作者介绍

侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny 分享相关技术文章。 - - - - - -

感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-12 17:316686
用户头像

发布了 43 篇内容, 共 28.6 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

坍缩的企业

涛哥 数字产品和业务架构

企业架构

自定义aop实现Cacheable注解(零拷贝), CacheItemGet,CacheMapGet,CacheMapPut

张音乐

Java 缓存 注解 9月日更

一文说清BIO、NIO、AIO不同IO模型演进之路

慕枫技术笔记

后端 引航计划

java拼团小程序源码(毕设)

清风

毕业设计

【网络安全】Spring框架漏洞总结(一)

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

全球国家简码信息表

入门小站

工具

网络攻防学习笔记 Day132

穿过生命散发芬芳

网络模型 9月日更

设计模式类型

一个大红包

9月日更

大厂敲门砖!P9技术官级别的顶级并发编程宝典,献给想去大厂的你

Java 编程 面试 程序人生 p9

MySQL五个常见的高可用方案

hanaper

HTML进阶(二)

Augus

html 9月日更

编程基础:CPU资源监控

正向成长

CPU调度

MySQL + Keepalived 双主热备搭建

Se7en

计算机工业的生态链(三)

姬翔

9月日更

GraphQL 快速入门【1】简介

码语者

Rest graphql

快速上手Apache POI

卢卡多多

POI Apache POI 9月日更

KVM虚拟机常用管理命令

玏佾

kvm 虚拟主机

分分合合分分,谷歌医疗走向大败退

脑极体

从零到MySQL架构师学习内容整理

hanaper

简单五步:给你的 Golang 应用加一个 GUI ( Electron 驱动)

baiyutang

UI 跨平台 Go 语言 GUI 9月日更

spine动画文件转dragonbones骨骼文件

风翱

9月日更 dragonbones

如何从数据到资产

奔向架构师

数据治理 9月日更

Python——内置函数----让你偷懒的工具

在即

9月日更

如何PWA构建现代离线应用程序

devpoint

Service Worker 9月日更

区块链技术解决信任问题

CECBC

Python Qt GUI设计:UI界面可视化组件、属性概述(基础篇—4)

不脱发的程序猿

Python qt GUI设计 PyQt5

ebay支付账务系统架构解析之“读”一无二

贾奇 (Jacky)

支付系统 CQRS 读写分离

网卡修改网速和buffer

耳东@Erdong

9月日更 网卡

linux之chattr命令

入门小站

Linux

架构训练营 模块7 - 王者荣耀商城异地多活架构设计

sophiahuxh

测试模型中理解压力测试和负载测试

FunTester

性能测试 接口测试 压力测试 FunTester 负载测试

45倍加速Spark的处理效率?!_语言 & 开发_侠天_InfoQ精选文章