颠覆大数据分析之Spark弹性分布式数据集

标签: 大数据 bigdata | 发表时间:2015-04-16 16:10 | 作者:我是谁
出处:http://ifeve.com

颠覆大数据分析之Spark弹性数据集

译者:黄经业     购书

Spark中迭代式机器学习算法的数据流可以通过图2.3来进行理解。将它和图2.1中Hadoop MR的迭代式机器学习的数据流比较一下。你会发现在Hadoop MR中每次迭代都会涉及HDFS的读写,而在Spark中则要简单得多。它仅需从HDFS到Spark中的分布式共享对象空间的一次读入——从HDFS文件中创建RDD。RDD可以重用,在机器学习的各个迭代中它都会驻留在内存里,这样能显著地提升性能。当检查结束条件发现迭代结束的时候,会将RDD持久化,把数据写回到HDFS中。后续章节会对Spark的内部结构进行详细介绍——包括它的设计,RDD,以及世系等等。

图2.3  Spark中进行迭代式计算的数据共享

Spark的弹性分布式数据集

RDD这个概念跟我们讨论到的Spark的动机有关——就是能让用户操作分布式系统上的Scala集合。Spark中的这个重要的集合就是RDD。RDD可以通过在其它RDD或者稳态存储中的数据(比如说,HDFS中的文件)上执行确定性操作来进行创建。创建RDD的另一种方式就是将Scala集合并行化。RDD的创建也就是Spark中的转换操作。RDD上除了转换操作,还有其它的一些操作,比如说动作(action)。像map, filter以及join这些都是常见的转换操作。RDD有意思的一点在于它可以将自己的世系或者说创建它所需的转换序列,以及它上面的动作给存储起来。这意味着Spark程序只能拥有一个RDD引用——它知道自己的世系,包括它是如何创建的,上面执行过哪些操作。世系为RDD提供了容错性——即使它丢失了,只要世系本身被持久化或者复制了,就仍能重建整个RDD。RDD的持久化以及分块可以由程序员来指定。比如说,你可以基于记录的主键来进行分块。

在RDD上可以执行许多操作。包括count,collect以及save,它们分别可以用来统计元素总数,返回记录,以及保存到磁盘或者HDFS中。世系图中存储了RDD的转换以及动作。表2.1中列举了一系列的转换及动作。

表2.1

转换 描述
Map(function f1) 把RDD中的每个元素并行地传递给f1,并返回结果的RDD
Filter(function f2) 选取出那些传递给函数f2并返回true的RDD元素
flatMap(function f3) 和map类似,但f3返回的是一个序列,它能将单个输入映射成多个输出。
Union(RDD r1) 返回RDD r1和自身的并集
Sample(flag, p, seed) 返回RDD的百分之p的随机采样(使用种子seed)
动作 描述
groupByKey(noTasks) 只能在键值对数据上进行调用——返回的数据按值进行分组。并行任务的数量通过一个参数来指定(默认是8)
reduceByKey(function f4,noTasks) 对相同key元素上应用函数f4的结果进行聚合。第二个参数是并行的任务数
Join(RDD r2, noTasks) 将RDD r2和对象自身进行连接——计算出指定key的所有可能的组合
groupWith(RDD r3, noTasks) 将RDD r3与对象自身进行连接,并按key进行分组
sortByKey(flag) 根据标记值将RDD自身按升序或降序来进行排序
动作 描述
Reduce(function f5) 使用函数f5来对RDD的所有元素进行聚合
Collect() 将RDD的所有元素作为一个数组来返回
Count() 计算RDD的元素总数
take(n) 获取RDD的第n个元素
First() 等价于take(1)
saveAsTextFile(path) 将RDD持久化成HDFS或者其它Hadoop支持的文件系统中路径为path的一个文件
saveAsSequenceFile(path) 将RDD持久化为Hadoop的一个序列文件。只能在实现了Hadoop写接口或类似接口的键值对类型的RDD上进行调用。
动作 描述
foreach(function f6) 并行地在RDD的元素上运行函数f6

下面将通过一个例子来介绍下如何在Spark环境中进行RDD的编程。这里是一个呼叫数据记录(CDR)——基于影响力分析的应用程序——通过CDR来构建用户的关系图,并识别出影响力最大的K个用户。CDR结构包括id,调用方,接收方,计划类型,呼叫类型,持续时长,时间,日期。具体做法是从HDFS中获取CDR文件,接着创建出RDD对象并过滤记录,然后再在上面执行一些操作,比如说通过查询提取出特定的字段,或者执行诸如count的聚合操作。最终写出的Spark代码如下:

val spark = new SparkContext();

Call_record_lines = spark.textFile(“HDFS://….”);

Plan_a_users = call_record_lines.filter(_.

CONTAINS(“plana”)); // RDD上的过滤操作.

Plan_a_users.cache(); // 告诉Spark运行时,如果仍有空间,就将这个RDD缓存到内存里Plan_a_users.count();

%% 呼叫数据集处理中.

 

RDD可以表示成一张图,这样跟踪RDD在不同转换/动作间的世系变化会简单一些。RDD接口由五部分信息组成,详见表2.2。

表2.2  RDD接口

信息 HadoopRDD FilteredRDD JoinedRDD
分区类型 每个HDFS块一个分区 和父RDD一致 每个reduce任务一个
依赖类型 无依赖 和父RDD是一对一的依赖 在每一个父RDD上进行shuffle
基于父RDD来计算数据集的函数 读取对应块的数据 计算父RDD并进行过滤 读取洗牌后的数据并进行连接
位置元数据(preferredLocations) 从命名节点中读取HDFS块的位置信息 无(从父RDD中获取)
分区元数据(partitioningScheme) HashPartitioner

Spark的实现

Spark是由大概20000行Scala代码写就的,核心部分大概是14000行。Spark可以运行在Mesos, Nimbus或者YARN等集群管理器之上。它使用的是未经修改的Scala解释器。当触发RDD上的一个动作时,一个被称为有向无环图(DAG)调度器的Spark组件就会去检查RDD的世系图,同时会创建各阶段的DAG。每个阶段内都只会出现窄依赖,宽依赖所需的洗牌操作就是阶段的边界。调度器在DAG的不同阶段启动任务来计算出缺失的分区,以便重构整个RDD对象。它将各阶段的任务对象提交给任务调度器(Task Scheduler, TS)。任务对象是一个独立的实体,它由代码和转换以及所需的元数据组成。调度器还负责重新提交那些输出丢失了的阶段。任务调度器使用一个被称为延迟调度(Zaharia等 2010)的调度算法来将任务分配给各个节点。如果RDD中有指定了优先区域的话,任务会被传送给这些节点,否则会被分配到那些有分区在请求内存任务的节点上。对于宽依赖而言,中间记录会在那些包含父分区的节点上生成。这样会使得错误恢复变得简单,Hadoop MR中map输出的物化也是类似的。

Spark中的Worker组件会负责接收任务对象并在一个线程池中调用它们的run方法。它将异常或者错误报告给TaskSetManager(TSM)。TSM是任务调度器管理的一个实体——每个任务集都会对应一个TSM,用于跟踪任务的执行过程。TS是按先进先出的顺序来轮询TSM集的。通过插入不同的策略或者算法,这里仍有一定的优化空间。执行器会与其它的组件进行交互,比如说块管理器(BM),通信管理器(CM),Map输出跟踪器(MOT)。块管理器是节点用于缓存RDD并接收洗牌数据的组件。它也可以看作是每个worker中只写一次的K-V存储。块管理器和通信管理器进行通信以便获取到远端的块数据。通信管理器是一个异步网络库。MOT这个组件会负责跟踪每个map任务都在哪运行并把这些信息返回给归约器——Worker会缓存这个信息。当映射器的输出丢失了的话,会使用一个“分代ID”来将这个缓存置为无效。Spark中各组件的交互如图2.4中所示。

图2.4  Spark集群中的组件

RDD的存储可以通过下面这三种方式来完成:

  1. 作为Java虚拟机中反序列化的Java对象:由于对象就在JVM内存中,这样做的性能会更佳。
  2. 作为内存中序列化的Java对象:这么表示内存的使用率会更高,但却牺牲了访问速度。
  3. 存储在磁盘上:这样做性能最差,但是如果RDD太大以至于无法存放到内存中的话就只能这么做了。

一旦内存满了,Spark的内存管理会通过最近最少使用(LRU)策略来回收RDD。然而,属于同一个RDD的分区是无法剔除的——因为通常来说,一个程序可能会在一个大的RDD上进行计算,如果将同一个RDD中的分区剔除的话则会出现系统颠簸。

世系图拥有足够的信息来重建RDD的丢失分区。然而,考虑到效率的因素(重建整个RDD可能会需要很大的计算量),检查点仍是必需的——用户可以自主控制哪个RDD作为检查点。使用了宽依赖的RDD可以使用检查点,因为在这种情况下,计算丢失的分区会需要显著的通信及计算量。而对于只拥有窄依赖的RDD而言,检查点则不太适合。

原创文章,转载请注明: 转载自 并发编程网 – ifeve.com

本文链接地址: 颠覆大数据分析之Spark弹性分布式数据集

相关 [颠覆 大数据 分析] 推荐:

颠覆大数据分析之Spark弹性分布式数据集

- - 并发编程网 - ifeve.com
颠覆大数据分析之Spark弹性数据集. 译者:黄经业     购书. Spark中迭代式机器学习算法的数据流可以通过图2.3来进行理解. 将它和图2.1中Hadoop MR的迭代式机器学习的数据流比较一下. MR中每次迭代都会涉及HDFS的读写,而在Spark中则要简单得多. 它仅需从HDFS到Spark中的分布式共享对象空间的一次读入——从HDFS文件中创建RDD.

谈大数据分析

- - 人月神话的BLOG
对于数据分析层,我们可以看到,其核心重点是针对海量数据形成一个分布式可弹性伸缩的,高查询性能的,支持标准sql语法的一个ODS库. 我们看到对于Hive,impala,InfoBright更多的都是解决这个层面的问题,即解决数据采集问题,解决采集后数据行列混合存储和压缩的问题,然后形成一个支撑标准sql预防的数据分析库.

数据库老兵:大数据时代NoSQL不是颠覆性技术

- - IT经理网
数年前,当人们谈论起新兴的NoSQL数据库技术时,相当一部分观点认为NoSQL在大数据市场取代传统关系型数据库只是个时间问题. 如今,这一预言并未兑现,Mitchell Kertzman的总经理Hummer Winblad认为,大多数情况下,NoSQL都没有展现出所谓的革命性. 作为数据库的老兵,以下是Kertzman在本周的视频 访谈的一些观点摘录:.

大数据分析的5个方面

- - ITeye资讯频道
越来越多的应用涉及到大数据,不幸的是所有大数据的属性,包括数量、速度、多样性等等都是描述了数据库不断增长的复杂性. 那么大数据给我们带来了什么好处呢. 大数据最大的好处在于能够让我们从这些数据中分析出很多智能的、深入的、有价值的信息. 下面我总结了分析大数据的5个方面. Analytic Visualizations(可视化分析).

大数据分析最佳实践

- - 互联网分析
   转自:TTNN   Q先生杰作. 大概是从今年开始,big data一词逐渐成为术语,这跟整个世界的数据爆发当然有关系. 以前,人们喜欢用海量数据这个词,large-scale. 这看上去还是显得有点学术气, 像是BI人自己关起门来说自己的宝贝. 而big data更显通俗,在各行各业都显现出的一种势头,于是产生这个更加简单的词汇,大数据.

大数据分析的分类-转载

- - 人月神话的BLOG
原文:http://www.csdn.net/article/2011-08-15/303101. Hadoop平台对业务的针对性较强,为了让你明确它是否符合你的业务,现粗略地从几个角度将大数据分析的业务需求分类,针对不同的具体需求,应采用不同的数据分析架构. 按照数据分析的实时性,分为实时数据分析和离线数据分析两种.

下一代大数据分析技术

- - Parallel Labs
原文发表于《程序员》杂志2013年第2期.. 随着以Hadoop为代表的大数据分析技术的普及,大数据的商业价值得到深入挖掘,并开始在互联网、零售、医疗、物联网等多个行业里成为商业变革的主导力量. Facebook最近就发布了名为Graph Search的新型社交搜索产品,基于海量的社交关系网络及“Likes”行为数据,为用户提供个性化的社交搜索服务,该产品被认为将是Google搜索业务的重要竞争对手.

基于mdrill的大数据分析

- - CSDN博客云计算推荐文章
     数据越来越多,传统的关系型数据库支撑不了,分布式数据仓库又非常贵. 几十亿、几百亿、甚至几千亿的数据量,如何才能高效的分析. mdrill是由阿里妈妈开源的一套数据的软件,针对TB级数据量,能够仅用10台机器,达到秒级响应,数据能实时导入,可以对任意的维度进行组合与过滤.     mdrill作为数据在线分析处理软件,可以在几秒到几十秒的时间,分析百亿级别的任意组合维度的数据.

大数据分析查询引擎Impala

- - 标点符
Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据. 已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性. 相比之下,Impala的最大特点也是最大卖点就是它的快速.

另类平板分析:一支颠覆iPad的真正力量还是仅仅是纸老虎?

- pestwave - 36氪
平板市场目前iPad还处于绝对的领先地位,要想撼动其统治无非是软硬兼施. 不过各平板厂商在软硬兼施的情况下又打出了一张新牌——另类平板. 那么这类平板的概念是否太靠前或者是否能赢得消费者的欣赏,我们来一起看一下. 代表是Asus的平板Transformer(变形金刚,基本配置:Android3.0,Tegra2处理器,分辨率为1280×800).