使用Spark快速和交互式分析Hadoop数据
本文http://www.paymoon.com:8001/index.php/2016/12/28/fast-and-interactive-analytics-over-hadoop-data-with-spark 如果转载请联系 龙遥Yol i@paymoon.com
过去几年来,随着工业和研究中的数据量超过单个机器的处理速度,行业对大规模数据分析产生了巨大兴趣。 Google的MapReduce模型及其开源实现Hadoop启动了大型集群并行数据分析工具的生态系统,例如Apache的Hive和Pig引擎进行SQL处理。 然而,到目前为止,这些工具已经针对磁盘数据的一次批量处理进行了优化,这使得它们对于交互式数据探索和对于越来越普遍的更复杂的多通道分析算法的缓慢。在本文中,我们介绍了Spark,一个可以运行的新集群计算框架,应用程序通过将数据保存在内存中,比Hadoop快40倍,并且可以交互地查询具有秒级延迟的大型数据集。 Spark开始兴起于我们的研究小组与Hadoop用户的讨论 外面加州大学伯克利分校。我们看到,随着组织开始加载更多的数据 Hadoop,他们很快就想运行丰富的应用程序,单程,批处理 MapReduce的处理模型不能有效地支持。特别是用户 想运行:
- 更复杂的多遍算法,例如迭代算法 常见于机器学习和图形处理
- 更多的交互式即席查询以探索数据
编程接口
Spark中的关键抽象是弹性分布式数据集(RDDs) 容错集合对跨集群节点分区的对象可以 并行工作。 用户通过应用称为转换的操作来创建RDD, 例如map,filter和groupBy,指向稳定存储系统中的数据,例如 Hadoop分布式文件系统(HDFS)。 在Spark的基于Scala的接口中,这些转换通过函数调用 编程API,类似于用户操纵本地集合的方式。 这个接口受到微软DryadLINQ系统集群计算[5]的强烈启发。 例如,以下Spark代码创建一个RDD表示 日志文件中的错误消息,通过搜索以“ERROR”开头的行和 然后打印错误消息的总数: [crayon-5864ca979fb81630254789/] 第一行定义由HDFS文件支持的RDD作为行的集合 文本。第二行调用过滤器转换以从中导出新的RDD 线。它的参数是函数文字或闭包的Scala语法。它类似于a Python中的lambda或Ruby中的块。最后,最后一行调用count,另一种类型 的RDD操作称为将结果返回给程序的操作(这里, RDD中的元素数量),而不是定义新的RDD。 Spark允许用户从独立程序和交互式调用这个API 从Scala解释器中快速探索数据。在这两种情况下,闭包 传递给Spark可以调用任何Java库,因为Scala在Java VM上运行。他们 也可以引用程序中任何变量的只读副本。 Spark会 自动将这些发送到工作节点。 虽然简单地提供用于并行处理的简洁接口是一种福音 交互式分析,真正使模型闪亮的是加载数据的能力 在记忆中。默认情况下,Spark的RDD是“短暂的”,因为它们被重新计算 每次在动作(例如,计数)中使用它们。但是,用户也可以保留 在存储器中选择RDD以便快速重用。如果数据不适合内存, Spark会自动将其溢出到磁盘,并且执行与Hadoop类似。对于 例如,用户搜索HDFS中的大量日志文件以调试问题, 如上所述,可能只通过集群中的错误消息加载到内存中 调用: [crayon-5864ca979fb91891097207/] 然后,她可以对内存中的数据运行各种查询: [crayon-5864ca979fb97599000141/] 内存数据为这些查询提供了显着的速度提升。 例如, 在一个测试中,我们在一个20节点的Amazon集群上加载了一个50 GB的维基百科转储,发现使用磁盘数据进行全文搜索需要20秒, Hadoop。 相同的搜索只需要0.8秒的内存RDD。
容错
除了提供内存存储和各种并行运算符,RDD 也自动从故障中恢复。 每个RDD跟踪变换图 用于构建它,称为其沿袭图,并重新运行这些操作基础数据以重建任何丢失的分区。 例如,图1 显示了上面最后一个查询中的RDD,其中我们获得了错误的时间字段 通过应用两个过滤器和一个地图提到PHP。 如果数据集的任何分区是 丢失,例如,保存内存分区的错误的节点失败,Spark将重建 它通过在HDFS文件的相应块上应用过滤器。 复苏 通常比简单地重新运行程序快得多,因为失败的节点 通常包含多个RDD分区,这些可以并行重建 其他节点。 图1 我们示例中的第三个查询的关系图。 框表示RDD和箭头 表示它们之间的变换。 基于关系的故障恢复是强大的,因为它避免了需要复制 数据。 这节省了构建RDD的时间,因为通过网络写入数据 比写入RAM要慢得多,而且存储空间,尤其是珍贵 内存资源。 即使所有运行Spark程序的节点崩溃,Spark也会 自动重建其RDD并继续工作。
其它案例
Spark支持范围广泛的操作,除了我们已经展示的, 包括所有SQL的关系运算符(groupBy,join,sort,union等)。 我们 请参阅Spark网站的完整编程指南[8],但显示 这里只是几个额外的例子。 首先,对于需要通过键聚合数据的应用程序,Spark提供了一个并行 reduceByKey操作类似于MapReduce。 例如,流行的“词” 计数“示例可以写成MapReduce如下: [crayon-5864ca979fb9f396985221/] 其次,给出一个迭代算法的例子,下面的代码实现 逻辑回归,一种用于对对象进行分类的通用机器学习算法 例如,垃圾邮件与非垃圾邮件。 该算法运行MapReduce操作 重复地在相同的数据集上优化数学函数 梯度下降(具体来说,找到最好分离对象的超平面)。 因此,它通过迭代将输入数据存储在RAM中有很大好处。 [crayon-5864ca979fba5667920850/] 为了显示Spark对此算法的好处,图2比较了它的性能 针对不同数量的迭代的Hadoop。 在这个测试中,用100 GB的 在50节点集群上的数据,Hadoop每次迭代需要一个大约110的常量时间 秒。 相比之下,Spark需要80秒的第一次迭代来加载数据 在内存中,但每个后续迭代只有6秒。 图2 Hadoop中的逻辑回归的性能与Spark的100 GB数据在50- 节点集群。 Hadoop每次迭代需要110秒的恒定时间,其中大部分用于I / O。 Spark在第一次迭代时需要80秒来加载内存中的数据,但每个后续只有6秒 迭代。
用户应用
Spark在几个互联网公司和一些机器中使用 在伯克利的学习研究项目。 我们讨论了一些用户的应用程序 下面。
Hive数据上的内存分析
Conviva公司是一家在线视频分销公司,使用Spark加速 之前运行的Hive分析报告的数量,SQL引擎基于 Hadoop。 例如,关于不同地理区域的观看次数的报告 从使用Hadoop的24小时,用Spark(30×更快)只有45分钟, 通过将感兴趣的数据的子集加载到存储器中,然后共享它 查询[2]。 Conviva也使用Spark交互搜索大集合 日志文件并解决问题,使用Scala接口和SQL接口 我们正在开发(在下一节讨论)称为鲨鱼。数据流的交互式查询
Quantifind是一家专门从事时间序列数据预测分析的创业公司, 使用Spark构建一个用于探索时间序列的交互式界面。 系统 周期性地从外部馈送(例如,Twitter流)加载新数据,运行 实体提取算法来解析数据,并构建一个内存中的表 提及每个实体。 用户然后可以通过交互式查询此表 在后端运行Spark查询的Web应用程序[4]。交通建模
Berkeley的移动千年项目的研究人员将学习并行化 用于从众包汽车GPS推断交通状况的算法 测量。 源数据是旧金山的一个10,000链路公路网 区域,以及60万份装备GPS的汽车的位置报告(例如, 出租车或运行手机应用程序的用户)每分钟收集一次。 通过对该数据应用迭代期望最大化(EM)算法, 系统可以推断出在个别道路链路上行驶所需的时间。Twitter垃圾邮件检测
Berkeley的Monarch项目使用Spark识别Twitter帖子中的垃圾链接。 他们在Spark之上实现了一个逻辑回归分类器,类似于 示例,在上面的“其他示例”中。 他们将它应用到超过80 GB的数据包含 Twitter上发布的400,000个网址和107个相关的功能/维度 网络和内容属性的网页在每个URL开发一个快速和 准确的垃圾链接分类器。结论和后续步骤
通过使内存中的数据共享第一类原语,Spark提供了一个强大的 工具用于交互式数据挖掘,以及更高效的运行时 复杂的机器学习和图形算法正在变得普遍 对大数据。 同时,Spark调用现有Java库的能力 (通过Scala语言)和访问任何Hadoop支持的存储系统 (通过重用Hadoop的输入/输出API)使它成为一个务实的选择补充 Hadoop进行大规模数据分析。 Spark是BSD下的开源 许可,我们邀请读者访问http://www.spark-project.org试用它。 我们的团队现在使用Spark作为构建更高级别数据分析的基础 工具。 我们计划在2012年开源的两个正在进行的项目是:
- Hive on Spark(Shark):Shark是Apache Hive SQL引擎的端口,可以运行 over Spark而不是Hadoop。 它可以运行在现有的Hive数据仓库和 支持现有的Hive查询语言,但它增加了加载表的能力 内存更大的速度。 Shark还将支持机器学习功能 写在Spark中,如分类和聚类,作为SQL的扩展[1]。 可以在http://shark.cs.berkeley.edu上找到alpha版本。
- Spark Streaming:这个项目扩展了Spark的在线执行能力 处理,通过类似的功能接口到Spark本身(map,filter, 减少等等)。 它运行每个流计算作为一系列 存储在RDD中的内存中数据的短批处理作业,并提供自动并行化 并为广泛的运营商的故障恢复。 在Spark上写一篇短文 流式处理出现在HotCloud '12 [7]中。
致谢
Spark的研究部分由NSF CISE Expeditions奖,礼品支持 来自Google,SAP,Amazon Web Services,Blue Goji,Cisco,Cloudera,Ericsson, 通用电气,惠普,华为,英特尔,MarkLogic,微软,NetApp, Oracle,Quanta,Splunk和VMware,由DARPA(合同#FA8650-11-C-7136) 并通过Google博士奖学金。
本文http://www.paymoon.com:8001/index.php/2016/12/28/fast-and-interactive-analytics-over-hadoop-data-with-spark 如果转载请联系 龙遥Yol i@paymoon.com Spark 实战更多文章:[翻译]Spark In Action – PayMoon贝明实验室 http://www.paymoon.com:8001/index.php/2016/12/27/spark-in-action-foreword/
References
[1] C. Engle, A. Lupher, R. Xin, M. Zaharia, M. Franklin, S. Shenker, and I. Stoica, “Shark: Fast Data Analysis Using Coarse-Grained Distributed Memory,” SIGMOD, 2012.
[2] D. Joseph, “Using Spark and Hive to Process Big Data at Conviva”: http:// www.conviva.com/blog/engineering/using-spark-and-hive-to-process-bigdata -at-conviva.
[3] Mobile Millennium
project: http://traffic.berkeley.edu.
[4] K. Thiyagarajan, “Computing Time Series from Extracted Data Using Spark,” Spark User Meetup presentation, Jan. 2012: http://files.meetup.com/3138542/ Quantifind%20Spark%20User%20Group%20Talk.pdf.
[5] Y. Yu, M. Isard, D. Fetterly, M. Budiu, Ú. Erlingsson, P.K. Gunda, and J. Currey, “DryadLINQ: A System for General-Purpose Distributed Data-Parallel Computing Using a High-Level Language,” USENIX OSDI ’08.
[6] M. Zaharia, M. Chowdhury, T. Das, A. Dave, J. Ma, M. McCauley, M. Franklin, S. Shenker, and I. Stoica, “Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing,” USENIX NSDI, 2012.
[7] M. Zaharia, T. Das, H. Li, S. Shenker, and I. Stoica, “Discretized Streams: An Efficient Programming Model for Large-Scale Stream Processing,” USENIX HotCloud, 2012.
[8] Spark homepage: http://www.spark-project.org.