十分钟了解分布式计算:Spark
Spark是一个通用的分布式内存计算框架,本文主要研讨Spark的核心数据结构RDD的设计思路,及其在内存上的容错。内容基于论文
Zaharia, Matei, et al. "Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing" Proceedings of the 9th USENIX conference on Networked Systems Design and Implementation. USENIX Association, 2012. [PDF] [PPT][中文翻译]
论文提出了弹性分布式数据集(RDD,Resilient Distributed Datasets),这是一种分布式的内存抽象,允许在大型集群上执行基于内存的计算(In-Memory Computing),与此同时还保持了MapReduce等数据流模型的容错特性。
现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域很常见;二是交互式数据挖掘工具。这两种情况下,将数据保存在内存中能够极大地提高性能。为了有效地实现容错,RDD提供了一种高度受限的共享内存,即RDD是只读的,并且只能通过其他RDD上的批量操作来创建。尽管如此,RDD仍然足以表示很多类型的计算,包括MapReduce和专用的迭代编程模型(如Pregel)等。论文中实现的RDD在迭代计算方面比Hadoop快二十多倍,同时还可以在5-7秒的延时内交互式地查询1TB的数据集。
第一作者Matei Zaharia是UC Berkeley AMP Lab的PHD,MIT讲师,Spark母公司Databricks的创始人。
背景
- 迭代式算法的特点在于,它是给定问题y=f(x),已知x和y,想要得到的是f的参数。所以需要从一个参数的initial值开始,扫描很多遍数据,比如说迭代100次,去逼近参数(类似数值分析中牛顿迭代法解方程的做法)。
- Hadoop对迭代式问题没有很好的解决,Disk-IO花费时间太多。Spark针对复杂分布式计算任务中,HDFS的反复读写特别耗时的问题,给常用数据一种共享的状态(内存的读写是TB级别的),特别适合交互式数据分析任务(对时间忍受很差),以及复杂的图算法(pagerank)
内存上的有效容错
- RDD是一种抽象数据集,中间数据不用的时候不需要具象化,对RDD使用persist()/cached()函数可以使其持久化。
- 主流的容错方法有两种 1)logging(记录细粒度update)2)快照(缺点就是代价太大)。
- Hadoop采用数据持久化的方式进行容错,HDFS每次读写都要做replica,代价是很大的。
- 对于Spark,内存是易失的,某个机器down掉了,内存中的RDD就没了。因此我们需要知道如果一个点failed,这个点的数据从哪里来。其采用记录RDD的血统(lineage)这种方式来进行容错,可以根据lineage来重新计算缺少的部分。lineage有五点信息,包括数据在哪,操作,优先使用什么,hash策略等。
- 为了做容错,RDD这种数据结构有两种限制:1) immutable(只需记录lineage就可以恢复)2) 是一种paritioned collections of record,只能从coarse-grained deterministic transformations(相当于从A到B只有一种走法,不能是随机的)得到。
和内存数据库的区别
- 数据库是细粒度的,每一条record的价值都很大,通常不需要统计群体的情况
- spark是粗粒度的,是“apply same operation to many items”,一次操作中大批数据都要参与进来。对于大数据来说任意一条数据是没有意义的,群体特征才有意义。
- 检索任务(细粒度)涉及到剪枝,分析任务(粗粒度)涉及到全盘扫描或下采样。
- RAMCloud适合transaction事务级别(内存数据库Redis),而Spark适合做batch批处理
Spark实例:PageRank
- Spark可以方便地做Join操作(link和rank两张表),而join的容错恢复是比较难的,不是narrow dependence,而是wide dependence
- Spark对用户提供了三种interface: 1) RDD 2)RDD的操作 3)RDD切分的控制。主要有两种不同类型的Flow: Data Flow(对数据进行改变,例如transformation and actions)和Control Flow(并不对数据进行改变,partitioning and persistence)
十分钟了解分布式计算:Spark的更多相关文章
- 十分钟了解分布式计算:Google Dataflow
介绍 Google Cloud Dataflow是一种构建.管理和优化复杂数据处理流水线的方法,集成了许多内部技术,如用于数据高效并行化处理的Flume和具有良好容错机制流处理的MillWheel.D ...
- 十分钟了解分布式计算:GraphX
GraphX原型论文 GraphX是Spark中用于图(e.g., Web-Graphs and Social Networks)和图并行计算(e.g., PageRank and Collabora ...
- 十分钟了解分布式计算:Petuum
Petuum是一个机器学习专用分布式计算框架,本文介绍其架构,并基于文章 More Effective Distributed ML via a Stale Synchronous Parallel ...
- 十分钟了解分布式计算:GraphLab
GraphLab是一个面向大规模机器学习/图计算的分布式内存计算框架,由CMU在2009年开始的一个C++项目,这里的内容是基于论文 Low, Yucheng, et al. "Distri ...
- 【NLP】十分钟快览自然语言处理学习总结
十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...
- 十分钟轻松让你认识ASP.NET MVC6
这篇文章说明下如何在普通编辑器下面开发mvc6应用程序. 上篇文章: 十分钟轻松让你认识ASP.NET 5(MVC6) 首先安装mvc6的nuget包: 可以看到在project.json文件中添加了 ...
- 十分钟轻松让你认识ASP.NET 5(MVC6)
ASP.NET 5差不多快发布了.自己也学习了有两个月了.今天给没有接触asp.net 5的同学写一个简单地十分钟教程,教你认识一下asp.net 5. 1.安装kvm 首先,你需要以管理员权限打开c ...
- 快速入门:十分钟学会Python
初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...
- 十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))
十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的 ...
随机推荐
- tomcat apache 实现负载平衡的小demo
软件:1个apache,2个tomcat module包:mod_jk.so(下载地址:http://tomcat.apache.org/download-connectors.cgi) 下载文件解压 ...
- php 数组的常用函数
在php教程中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数 * * 数组的排序函 ...
- Jquery弹窗效果
1.主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- C# 4.0 新特性dynamic (待学习)
随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicO ...
- c++学习笔记2
T: 1.默认实参只能声明一次: 设计含有默认实参的函数时,要合理设置形参的顺序 :局部变量不能作为默认实参 2.内联机制用于优化规模较小.流程直接.频繁调用的函数 3.constexpr函数 返 ...
- c/c++程序员必须要掌握开源项目
作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...
- 【转】查看java类是从哪个包加载
Java的类装载器使用的是优先策略,加载类的时候先找到哪个就加载哪个.有时候我们做一个系统,当类库非常庞大的时候,类可能会出现冲突,也就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻 ...
- 使用ISO文件安装Linux
一. 准备知识 1. ISO文件 我们普遍使用的ISO文件是指包含着整个CD-ROM(ISO-9660 文件系统)内容的 映象, 是整个碟片从0扇区到最后一个扇区的完整复制,经常被用来在网络上传输 对 ...
- Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
标签:Iterator Java List ArrayList Vector 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些 ...
- Tapestry
Tapestry1)概述:Tapestry 是一个全面web application 框架,是使用JAVA 写的.Tapestry 不是一个application server,Tapestry 是一 ...