Storm Spark Hadoop 这三个流行并行计算框架有什么不同

一、Storm Spark Hadoop 这三个流行并行计算框架有什么不同

Storm用于处理高速、大型数据流的分布式实时计算系统。为Hadoop添加了可靠的实时数据处理功能 Spark采用了内存计算。从多迭代批处理出发,允许将数据载入内存作反复查询,此外还融合数据仓库,流处理和图形计算等多种计算范式。Spark构建在HDFS上,能与Hadoop很好的结合。它的RDD是一个很大的特点。 Hadoop当前大数据管理标准之一,运用在当前很多商业应用系统。可以轻松地集成结构化、半结构化甚至非结构化数据集。

二、怎样理解spark中的partition和block的关系

hdfs中的block是分布式存储的最小单元,类似于盛放文件的盒子,一个文件可能要占多个盒子,但一个盒子里的内容只可能来自同一份文件。假设block设置为128M,你的文件是250M,那么这份文件占3个block(128+128+2)。这样的设计虽然会有一部分磁盘空间的浪费,但是整齐的block大小,便于快速找到、读取对应的内容。(p.s. 考虑到hdfs冗余设计,默认三份拷贝,实际上3*3=9个block的物理空间。)

spark中的partion是弹性分布式数据集RDD的最小单元,RDD是由分布在各个节点上的partion组成的。partion是指的spark在计算过程中,生成的数据在计算空间内最小单元,同一份数据(RDD)的partion大小不一,数量不定,是根据application里的算子和最初读入的数据分块数量决定的,这也是为什么叫“弹性分布式”数据集的原因之一。

总结:

block位于存储空间、partion位于计算空间,

block的大小是固定的、partion大小是不固定的,

block是有冗余的、不会轻易丢失,partion(RDD)没有冗余设计、丢失之后重新计算得到

再补充几点:

partition也可以有冗余,通过storagelevel来配置;

local或者yarn模式和partition,block概念上没有半毛钱关系,local模式也能操作hdfs,yarn模式也能操作本地文件;

存储上为什么要将空间抽象成块前面的兄台已经叙述了,而且之所以设计成这么大的理由还牵扯到大存储空间中的各种管理、容错等等。那么与之对应的,在并行计算里我们希望降低网络带宽的负荷,所以会对计算做一层计算本地性优化,那么怎样做到这点呢?最简单的逻辑,把计算代码发到数据所在的节点上执行就可以了。那么这样一来,怎样做到并行优化?很简单啦,把一个超大的文件切切切分成一个一个不大不小的块(比如hdfs默认的64M,或者配得再大一点),然后把这些块打散在集群的不同节点上,最后把应用代码跟着数据块走,就能在不同节点上并行计算了。与之相对应的,spark为了利用起内存,对一些中间数据尽可能的用内存访问速度进行读写,所以把这部分管理工作纳入到自己这里(对比一下,经典的hadoop mapreduce就直接交给hdfs进行管理),可是就算存到内存里,那也得沿着这个思路来啊,不然计算本地化,并行之类的就很混乱了,那好吧,我也引入个概念,就叫partition好了,目的和前面一样。然后突然发现,哎呀我靠,这不得了,不仅能做到这些,既然我把一个超大份的数据都分成一块一块的了,那每一块是不是就能独立分隔开来了?那一个超大份文件,内存完全放不下,完全可以把其中一些块放到内存里,另外一些暂时放到硬盘里嘛,好歹也比纯放到hdfs来得快嘛……于是生活就变得美好了起来。但是要注意的是,计算本地性优化并不是说绝对地把任务只发到数据所在地进行执行,还要考虑到均衡和并发能力的取舍。

三、大数据云计算这个专业好不好?

好!都是目前IT行业的优质发展方向,大数据课程难度大,有本科学历要求!云计算相对简单,但也需要大专学历!

大数据学习内容主要有:

①JavaSE核心技术;

②Hadoop平台核心技术、Hive开发、HBase开发;

③Spark相关技术、Scala基本编程;

④掌握Python基本使用、核心库的使用、Python爬虫、简单数据分析;理解Python机器学习;

⑤大数据项目开发实战,大数据系统管理优化等。

你可以考察对比一下南京课工场、北大青鸟、中博软件学院等开设有大数据专业的学校。我也可以发送大数据、云计算全套免费学习视频给你自学,祝你学有所成,望采纳。

云计算学习主要内容有:

①网络基础与linux系统的管理;

②优化及高可用技能;

③虚拟化与云平台技术;

④开发运维。

四、Spark RDD中cache和persist的区别

通过观察RDD.scala源代码即可知道cache和persist的区别:

def persist(newLevel: StorageLevel): this.type = {

if (storageLevel != StorageLevel.NONE && newLevel != storageLevel) {

throw new UnsupportedOperationException( Cannot change storage level of an RDD after it was already assigned a level)

}

sc.persistRDD(this)

sc.cleaner.foreach(_.registerRDDForCleanup(this))

storageLevel = newLevel

this

}

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */

def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */

def cache(): this.type = persist()

可知:

1)RDD的cache()方法其实调用的就是persist方法,缓存策略均为MEMORY_ONLY;

2)可以通过persist方法手工设定StorageLevel来满足工程需要的存储级别;

3)cache或者persist并不是action;

附:cache和persist都可以用unpersist来取消