一些内存中的数据结构比其他的更有效;如果充分利用Redis,Spark运行得更快。ApacheSpark逐渐成为下一代大数据处理工具的典范。通过借鉴开源算法并将处理任务分布在计算节点集群、这一代框架、Spark和Hadoop,轻松超越它们可以在单一平台上执行的数据分析类型以及它们执行这些分析的速度任务。通过传统框架。Spark利用内存来处理数据,因此比基于磁盘的Hadoop快得多(最多快100倍)。但在一点帮助下,Spark可以运行得更快。如果将Spark与Redis(一种流行的内存数据结构存储技术)结合使用,您可以再次显着提高分析任务的性能。这是由于Redis的优化数据结构及其以尽可能低的复杂性和开销执行操作的能力。通过连接器访问Redis数据结构和API,可以进一步加速Spark。提速多少?如果Redis和Spark一起使用,事实证明处理数据(用于下面描述的时间序列数据的分析)比单独使用Spark将数据存储在进程内存或堆外缓存中快45倍——而不是更快45%,但整整快了45倍!为什么这很重要?许多公司越来越需要像业务交易本身一样快速地分析交易。越来越多的决策正在自动化,推动这些决策所需的分析应该实时进行。ApacheSpark是一个优秀的通用数据处理框架;虽然它不是绝对实时的,但它是朝着更及时地利用数据迈出的一大步。Spark使用弹性分布式数据集(RDD),它可以存储在易失性内存或持久存储系统(如HDFS)中。RDDs不会发生变化,分布在Spark集群的所有节点上,可以转化为其他的RDDs。SparkRDDRDD是Spark中一个重要的抽象对象。它们代表了一种有效地将数据呈现给迭代过程的容错方法。由于处理是在内存中完成的,因此与使用HDFS和MapReduce相比,这意味着处理时间减少了一个数量级。Redis专为高性能而设计。亚毫秒级延迟受益于优化的数据结构,这些结构通过允许在靠近数据存储位置的位置执行操作来提高效率。这种数据结构不仅可以有效地利用内存并降低应用程序的复杂性,还可以减少网络开销、带宽消耗和处理时间。Redis数据结构包括字符串、集合、排序集合、散列、位图、hyperloglog和地理空间索引。开发人员可以像乐高积木一样使用Redis数据结构——它们是提供复杂功能的简单管道。为了可视化这种数据结构如何简化应用程序的处理时间和复杂性,让我们以SortedSet数据结构为例。有序集基本上是一组按分数排序的成员。Redis排序集合你可以在这里存储多种类型的数据,它们会自动按分数排序。存储在有序集中的常见数据类型包括:时间序列数据,例如商品(按价格)、商品名称(按数量)、股票价格和传感器读数(例如时间戳)。有序集的魅力在于Redis内置的操作,允许范围查询,多个有序集的交叉,按成员级别和分数检索,更多的事务可以简单的执行,速度前所未有,而且还可以在一个大规模。内置操作不仅可以节省需要编写的代码,而且在内存中执行操作可以减少网络延迟并节省带宽,从而实现亚毫秒级延迟的高吞吐量。使用排序集分析时间序列数据时,性能通常比其他内存中键/值存储或基于磁盘的数据库快几个数量级。Redis团队的目标是提高Spark的分析能力,为此开发了Spark-Redisconnector。该包使Spark能够使用Redis作为其数据源之一。该连接器将Redis的数据结构暴露给Spark,可以大大提高各种类型分析的性能。SparkRedisConnector为了展示给Spark带来的好处,Redis团队决定在几个不同的场景下进行时间片(范围)查询,横向比较Spark中的时间序列分析。这些场景包括:Spark将所有数据存储在堆内存中,Spark使用Tachyon作为堆外缓存,Spark使用HDFS,Spark和Redis结合使用。使用Cloudera的Spark时间序列包,Redis团队构建了一个Spark-Redis时间序列包,使用Redis有序集合来加速时间序列分析。除了让Spark可以访问所有Redis数据结构之外,这个包还做了两件事:自动确保Redis节点与Spark集群保持一致,从而确保每个Spark节点都使用本地Redis数据,从而优化延迟。与Spark数据框和数据源API集成,自动将SparkSQL查询转换为Redis中最有效的数据检索机制。简单来说,这意味着用户不必担心Spark和Redis之间的操作一致性问题,可以继续使用SparkSQL进行分析,同时大幅提升查询性能。本次横向比较使用的时间序列数据包括:随机生成的金融数据,每天1024只股票,时间范围为32年。每只股票用自己的有序集表示,分数为日期,数据成员包括开盘价、***价、***价、收盘价、成交量、调整收盘价。下图描述了Spark分析的Redis有序集中的数据表示:SparkRedis时间序列在上面的例子中,对于有序集AAPL,有分数代表每一天(1989-01-01),和多个值全天表示为一个相关行。这可以通过Redis中的一个简单的ZRANGEBYSCORE命令来完成:获取特定时间片的所有值,从而获取指定日期范围内的所有股票价格。Redis执行此类查询的速度比其他键/值存储系统快100倍。这种并排比较证实了性能提升。结果发现,Spark使用Redis执行时间片查询比使用HDFS的Spark快135倍,比使用堆上(进程)内存或使用Tachyon作为堆外缓存的Spark快45倍。下图显示了不同场景的平均执行时间比较:SparkRedis并排比较如果您想自己尝试,不妨按照这个可下载的分步指南进行操作:《Spark和Redis使用入门》(https://redislabs.com/solutions/spark-and-redis)。本指南将引导您完成典型Spark集群和Spark-Redis包的安装。它还通过一个简单的字数统计示例展示了如何将Spark和Redis结合使用。尝试使用Spark和Spark-Redis包后,您可以探索更多使用其他Redis数据结构的场景。虽然排序集合非常适合时间序列数据,但Redis的其他数据结构(如集合、列表和地理空间索引)可以进一步丰富Spark分析。想象一下:一个Spark流程试图根据人群偏好和与市中心的距离来获取有关在哪个区域推出新产品的信息,并获得最佳结果。现在想象一下,内置分析的数据结构(例如地理空间索引和集合)可以大大加快这个过程。Spark-Redis的结合具有很大的应用前景。Spark支持广泛的分析,包括SQL、机器学习、图形计算和SparkStreaming。使用Spark的内存处理能力只能让你达到一定的规模。但是有了Redis,你还可以更进一步:不仅可以利用Redis的数据结构提高性能,还可以更方便地扩展Spark,即充分利用共享分布式内存数据存储机制Redis提供,处理数百上万条记录,甚至数十亿条记录。时间序列示例只是一个开始。将Redis数据结构用于机器学习和图形分析也有望从这些工作负载的执行时间大幅减少中受益。
