spark读取文件能优化?Spark对硬件的要求

seosqwseo3个月前 (06-24)测评日记32

一、spark和hadoop的区别

spark和hadoop的区别:诞生的先后顺序、计算不同、平台不同。

诞生的先后顺序,hadoop属于第一**源大数据处理平台,而spark属于第二代。属于下一代的spark肯定在综合评价上要优于第一代的hadoop。

计算不同spark和hadoop在分布式计算的底层思路上,其实是极为相似的,即mapreduce分布式运算模型:将运算分成两个阶段,阶段1-map,负责从上游拉取数据后各自运算,然后将运算结果shuffle给下游的reduce,reduce再各自对通过shuffle读取来的数据进行聚合运算spark和hadoop在分布式计算的具体实现上,又有区别;hadoop中的mapreduce运算框架,一个运算job,进行一次map-reduce的过程;而spark的一个job中,可以将多个map-reduce过程级联进行。

平台不同spark和hadoop区别是,spark是一个运算平台,而hadoop是一个复合平台(包含运算引擎,还包含分布式文件存储系统,还包含分布式运算的资源调度系统),所以,spark跟hadoop来比较的话,主要是比运算这一块大数据技术发展到目前这个阶段,hadoop主要是它的运算部分日渐式微,而spark目前如日中天,相关技术需求量大,offer好拿。

二、Spark对硬件的要求

Spark对硬件的要求

估计所有的spark开发者都很关心spark的硬件要求。恰当的硬件配置需要具体情况具体分析,在这里给出以下建议。主要译自**

一,存储系统

因为大多数Spark工作可能需要从外部存储系统(例如Hadoop文件系统或HBase)中读取输入数据,所以将spark尽可能部署到靠近存储系统很重要。所以,有如下建议:

1,如果可能,在与HDFS相同的节点上运行Spark。简单的方式是将spark的Standalone集群和hadoop集群安装在相同的节点,同时配置好Spark和hadoop的内存使用,避免相互干扰(对于hadoop,每个task的内存配置参数是mapred.child.java.opts;mapreduce.tasktracker.map.tasks.maximum和mapreduce.tasktracker.reduce.tasks.maximum决定了task的数目)。也可以将hadoop和spark运行在共同的集群管理器上,如mesos和 yarn。

2,如果不可能,请在与HDFS相同的局域网中的不同节点上运行Spark。

3,对于低延迟数据存储(如HBase),可能优先在与存储系统不同的节点上运行计算任务以避免干扰。

二,本地磁盘

虽然Spark可以在内存中执行大量的计算,但它仍然使用本地磁盘来存储不适合RAM的数据,以及在stage之间,也即shuffle的中间结果。建议每个节点至少有4-8块磁盘,并且不需要RAID,仅仅是独立的磁盘挂在节点。在Linux中,使用noatime选项安装磁盘,以减少不必要的写入。在spark任务中,spark.local.dir配置可以十多个磁盘目录,以逗号分开。如果运行在hdfs上,与hdfs保持一致就很好。

使用noatime选项安装磁盘,要求当挂载文件系统时,可以指定标准Linux安装选项(noatime),这将禁用该文件系统上的atime更新。磁盘挂在命令:

mount-t gfs BlockDevice MountPoint-onoatime

BlockDevice指定GFS文件系统驻留的块设备。

MountPoint指定GFS文件系统应安装的目录。

例子:

mount-t gfs/dev/vg01/lvol0/gfs1-onoatime

三,内存

单台机器内存从8GB到数百GB,spark都能运行良好。在所有情况下,建议仅为Spark分配多75%的内存;留下其余的*作系统和缓冲区缓存。

需要多少内存取决于你的应用程序。要确定你的应用的特定数据集需要多大内存,请加载部分数据集到内存,然后在Spark UI的Storage界面去看它的内存占用量。

请注意,内存使用受到存储级别和序列化格式的极大影响-有关如何减少内存使用的技巧,请参阅另一篇调优的文章。

后,请注意,对于超过200GB的内存的机器J**A VM运行状态并不一直表现良好。如果买的机器内存超过了200GB,那么可以在一个节点上运行多个worker。Spark Standalone模式下,可以在配置文件 conf/spark-env.sh中设置SPARK_WORKER_INSTANCES的值来设置单节点worker的数目。也可以设置SPARK_WORKER_CORES参数来设置每个Worker的cpu数目。

四,网络

根据以往的经验,假如数据是在内存中,那么spark的应用的瓶颈往往就在网络。用10 Giga**t或者更高的网络,是使spark应用跑的更快的佳方式。特别是针对“distributed reduce”应用,如group-bys,reduce-bys和sql joins,就表现的更加明显。在任何给定的应用程序中,可以通过spark ui查看spark shuffle过程夸网络传输了多少数据。

五, cpu

对于每台机器几十个cpu的机器,spark也可以很好的扩展,因为他**程之间执行小的共享cpu。应该每台机器至少配置8-16个内核。根据cpu负载,可能需要更多的cpu:一旦数据在内存中,大多数应用程序的瓶颈就在CPU和网络。

推荐阅读:

面试必备|spark高层通用调优

Spark Adaptive Execution调研

Spark的硬件配置

从MapReduce的兴起,就带来一种思路,就是希望通过大量廉价的机器来处理以前需要耗费昂贵资源的海量数据。这种方式事实上是一种架构的水平伸缩模式——真正的以量取胜。毕竟,以现在的硬件发展来看,CPU的核数、内存的容量以及海量存储硬盘,都慢慢变得低廉而高效。然而,对于商业应用的海量数据挖掘或分析来看,硬件成本依旧是开发商非常关注的。当然好的结果是:既要马儿跑得快,还要马儿少吃草。

\\

Spark相对于Hadoop的MapReduce而言,确乎要跑得迅捷许多。然而,Spark这种In-Memory的计算模式,是否在硬件资源尤其是内存资源的消耗上,要求更高呢?我既找不到这么多机器,也无法租用多台虚拟instance,再没法测评的情况下,只要寻求Spark的官方网站,又或者通过Google搜索。从Spark官方网站,Databricks公司Patrick Wendell的演讲以及Matei Zaharia的Spark论文,找到了一些关于Spark硬件配置的支撑数据。

\\

Spark与存储系统

\\

如果Spark使用HDFS作为存储系统,则可以有效地运用Spark的standalone mode cluster,让Spark与HDFS部署在同一台机器上。这种模式的部署非常简单,且读取文件的性能更高。当然,Spark对内存的使用是有要求的,需要合理分配它与HDFS的资源。因此,需要配置Spark和HDFS的环境变量,为各自的任务分配内存和CPU资源,避免相互之间的资源争用。

\\

若HDFS的机器足够好,这种部署可以优先考虑。若数据处理的执行效率要求非常高,那么还是需要采用分离的部署模式,例如部署在Hadoop YARN集群上。

\\

Spark对磁盘的要求

\\

Spark是in memory的迭代式运算平台,因此它对磁盘的要求不高。Spark官方推荐为每个节点配置4-8块磁盘,且并不需要配置为RAID(即将磁盘作为单独的mount point)。然后,通过配置spark.local.dir来指定磁盘列表。

\\

Spark对内存的要求

\\

Spark虽然是in memory的运算平台,但从官方资料看,似乎本身对内存的要求并不是特别苛刻。官方网站只是要求内存在8GB之上即可(Impala要求机器配置在128GB)。当然,真正要高效处理,仍然是内存越大越好。若内存超过200GB,则需要当心,因为JVM对超过200GB的内存管理存在问题,需要特别的配置。

\\

内存容量足够大,还得真正分给了Spark才行。Spark建议需要提供至少75%的内存空间分配给Spark,至于其余的内存空间,则分配给*作系统与buffer cache。这就需要部署Spark的机器足够干净。

\\

考虑内存消耗问题,倘若我们要处理的数据仅仅是进行一次处理,用完即丢弃,就应该避免使用cache或persist,从而降低对内存的损耗。若确实需要将数据加载到内存中,而内存又不足以加载,则可以设置Storage Level。0.9版本的Spark提供了三种Storage Level:MEMORY_ONLY(这是默认值),MEMORY_AND_DISK,以及DISK_ONLY。

\\

关于数据的持久化,Spark默认是持久化到内存中。但它也提供了三种持久化RDD的存储方式:

\\

•      \\t

in-memory storage as deserialized Javaobjects

\\t\\t

•      \\t

in-memory storage as serialised data

\\t\\t

•      \\t

on-disk storage

\\t\

第一种存储方式性能优,第二种方式则对RDD的展现方式(Representing)提供了扩展,第三种方式则用于内存不足时。

\\

然而,在新版(V1.0.2)的Spark中,提供了更多的Storage Level选择。一个值得注意的选项是OFF_HEAP,它能够将RDD以序列化格式存储到Tachyon中。相比MEMORY_ONLY_SER,这一选项能够减少执行垃圾回收,使Spark的执行器(executor)更小,并能共享内存池。Tachyon是一个基于内存的分布式文件系统,性能远超HDFS。Tachyon与Spark同源同宗,都烙有伯克利AMPLab的印记。目前,Tachyon的版本为0.5.0,还处于实验阶段。

\\

注意,RDDs是Lazy的,在执行Transformation*作如map、filter时,并不会提交Job,只有在执行Action*作如count、first时,才会执行Job,此时才会进行数据的加载。当然,对于一些shuffle*作,例如reduceByKey,虽然仅是Transformation*作,但它在执行时会将一些中间数据进行持久化,而无需显式调用persist()函数。这是为了应对当节点出现故障时,能够避免针对大量数据进行重计算。要计算Spark加载的Dataset大小,可以通过Spark提供的Web UI Monitoring工具来帮助分析与判断。

\\

Spark的RDD是具有分区(partition)的,Spark并非是将整个RDD一次性加载到内存中。Spark针对partition提供了eviction

policy,这一Policy采用了LRU(Least Recently Used)机制。当一个新的RDD分区需要计算时,如果没有合适的空间存储,就会根据LRU策略,将少访问的RDD分区弹出,除非这个新分区与少访问的分区属于同一个RDD。这也在一定程度上缓和了对内存的消耗。

\\

Spark对内存的消耗主要分为三部分:

\\

1.    \\t

数据集中对象的大小;

\\t\\t

2.    \\t

访问这些对象的内存消耗;

\\t\\t

3.    \\t

垃圾回收GC的消耗。

\\t\

一个通常的内存消耗计算方法是:内存消耗大小=对象字段中原生数据*(2~5)。这是因为Spark运行在JVM之上,*作的Java对象都有定义的“object header”,而数据结构(如Map,LinkedList)对象自身也需要占用内存空间。此外,对于存储在数据结构中的基本类型,还需要装箱(Boxing)。Spark也提供了一些内存调优机制,例如执行对象的序列化,可以释放一部分内存空间。还可以通过为JVM设置flag来标记存放的字节数(选择4个字节而非8个字节)。在JDK 7下,还可以做更多优化,例如对字符编码的设置。这些配置都可以在spark-env.sh中设置。

\\

Spark对网络的要求

\\

Spark属于网络绑定型系统,因而建议使用10G及以上的网络带宽。

\\

Spark对 CPU的要求

\\

Spark可以支持一台机器扩展至数十个CPU

core,它实现的是线程之间小共享。若内存足够大,则制约运算性能的就是网络带宽与CPU数。

\\

Spark官方利用Amazon EC2的环境对Spark进行了基准测评。例如,在交互方式下进行数据挖掘(Interative Data Mining),租用Amazon EC2的100个实例,配置为8核、68GB的内存。对1TB的****页面查阅日志(****两年的数据)进行数据挖掘。在查询时,针对整个输入数据进行全扫描,只需要耗费5-7秒的时间。如下图所示:

在Matei Zaharia的Spark论文中还给出了一些使用Spark的真实案例。视频处理公司Conviva,使用Spark将数据子集加载到RDD中。报道说明,对于200GB压缩过的数据进行查询和聚合*作,并运行在两台Spark机器上,占用内存为96GB,执行完全部*作需要耗费30分钟左右的时间。同比情况下,Hadoop需要耗费20小时。注意:之所以200GB的压缩数据只占用96GB内存,是因为RDD的处理方式,使得我们可以只加载匹配客户过滤的行和列,而非所有压缩数据。`

Spark集群硬件配置推荐

计算与存储:

大多数Spark作业可能需要从外部存储系统(例如:Cassandra、Hadoop文件系统或HBase)读取输入数据,所以要让Spark计算引擎尽可能靠近数据持久层。如果使用HDFS作为数据存储集群,可以在相同的集群上部署Spark集群,并配置Spark和Hadoop的内存和CPU使用率以避免干扰。我们的生产存储使用的是Cassandra集群,spark

master服务单独部署,其它节点同时部署:Cassandra

+ spark worker,保证spark

worker节点可以快速从本地读取数据进行计算汇总。

磁盘:

虽然Spark可以在内存中执行大量的计算,但它仍然可能会使用本地磁盘来存储不适用于RAM的数据,建议每个节点配置4-8个磁盘,不需要配置RAID(磁盘阵列),磁盘成本越来越低,可以考虑配置ssd硬盘,可以大幅提升性能。另外;在Linux中,使用noatime选项挂载磁盘,以减少不必要的写入*作。在Spark中,可以将spark.local.dir变量配置为多个本地磁盘的地址,多个地址之间以逗号分隔。

内存

建议为Spark分配的内存容量不大于机器总内存容量的75%;确保为*作系统和缓冲区留下足够的内存。根据业务特点评估需要多少内存。请注意,当内存容量超过200GB时Java虚拟机的性能表现会不稳定。如果您购买的RAM大于200G,则可以为每个节点运行多个worker

JVM。在Spark的standalone模式下,您可以通过conf/spark-env.sh中的SPARK_WORKER_INSTANCES变量设置每个节点运行的worker进程数,以及通过SPARK_WORKER_CORES变量设置每个worker可用的cpu核心数。

网络

当数据已经存储在内存中时,很多Spark应用程序的性能瓶颈在于网络的传输速率。推荐低使用10G的网络。

CPU

Spark运行汇总计算任务比较多,推荐配置更多的cpu核数,性能提升还是比较明显,推荐:每台机器至少配置8-16个核。可以根据Spark作业的CPU负载情况,进行配置调整。一旦数据已经在内存中,大多数应用程序的性能瓶颈在于CPU和网络。

参考文档

三、为什么Spark比MapReduce快

MapReduce慢是因为模型很呆板,频繁的Io*作

Spark快的话不仅是因为它是内存迭代计算吧?具体什么是内存迭代计算?

Spark计算比MapReduce快的根本原因在于DAG计算模型。一般而言,DAG相比Hadoop的MapReduce在大多数情况下可以减少shuffle次数(怎么体现?)。

Spark的DAGScheduler相当于一个改进版的MapReduce,如果计算不涉及与其他节点进行数据交换,Spark可以在内存中一次性完成这些*作,也就是中间结果无须落盘,减少了磁盘IO的*作。

但是,如果计算过程中涉及数据交换,Spark也是会把shuffle的数据写磁盘的!!!

另外有同学提到,Spark是基于内存的计算,所以快,这也不是主要原因,要对数据做计算,必然得加载到内存,Hadoop也是如此,只不过Spark支持将需要反复用到的数据给Cache到内存中,减少数据加载耗时,所以Spark跑机器学习算法比较在行(需要对数据进行反复迭代)。Spark基于磁盘的计算依然也是比Hadoop快。

刚刚提到了Spark的DAGScheduler是个改进版的MapReduce,所以Spark天生适合做批处理的任务。而不是某些同学说的:Hadoop更适合做批处理,Spark更适合做需要反复迭代的计算。Hadoop的MapReduce相比Spark真是没啥优势了。但是他的HDFS还是业界的大数据存储标准。

1、Spark vs MapReduce≠内存 vs磁盘

其实Spark和MapReduce的计算都发生在内存中,区别在于:

MapReduce通常需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO。

Spark则不需要将计算的中间结果写入磁盘,这得益于Spark的RDD(弹性分布式数据集,很强大)和DAG(有向无环图),其中DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系。中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大大减少了磁盘IO。

2、Spark vs MapReduce Shuffle的不同

Spark和MapReduce在计算过程中通常都不可避免的会进行Shuffle,两者至少有一点不同:

MapReduce在Shuffle时需要花费大量时间进行排序,排序在MapReduce的Shuffle中似乎是不可避免的;

Spark在Shuffle时则只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时;

3、多进程模型 vs多线程模型的区别

这俩根本没啥可比的,能够单MR做完的任务,Spark未必比MR快。至于迭代不迭代的并不是关键,其实你在Mapper里对数据做N个*作基本等价于N个窄依赖RDD的连接。

所以说真要比,也是多个MR组成的复杂Job来和Spark比。

MR由于其计算粒度的设计问题,在进行需要多次MR组合的计算时,每次MR除了Shuffle的磁盘开销外,Reduce之后也会写到磁盘。

而Spark的DAG实质上就是把计算和计算之间的编排变得更为细致紧密,使得很多MR任务中需要落盘的非Shuffle*作得以在内存中直接参与后续的运算,并且由于算子粒度和算子之间的逻辑关系使得其易于由框架自动地优化(换言之编排得好的MR其实也可以做到)。

另外在进行复杂计算任务的时候,Spark的错误恢复机制在很多场景会比MR的错误恢复机制的代价低,这也是性能提升的一个点。

迭代计算是spark开始亮相时的看家本领,第一是避免了不必要的数据落盘,第二则是容错的机制以及缓存节点的合理搭配使得重计算的代价低很多,而且缓存可以在内存。mr和spark都是分片后读数据的,这点没什么区别。至于快100倍……论文这种东西

要想明白这个问题,需要对mapreduce的运算模型有所理解

mapreduce模型(不完全等同mapreduce框架哦),是一个分布式运算模型;它的思想可以通过一个简单的wordcount例子来说明:

需求:有大量的文件,需要统计这些文件中每一个单词出现的次数

在分布式计算里面:

上述过程,就被抽象成了两个运算过程,第一批task属于map过程,而第二批task属于reduce过程

好,现在可以讲mapreduce框架和spark的区别了

所以,spark比mapreduce快,就是上述的2/3两点

减少磁盘 I/O:随着实时大数据应用越来越多,Hadoop作为离线的高吞吐、低响应框架已不能满足这类需求。Hadoop MapReduce的 map端将中间输出和结果存储在磁盘中,reduce端又需要从磁盘读写中间结果,势必造成磁盘 IO成为瓶颈。Spark允许将 map端的中间输出和结果存储在内存中,reduce端在拉取中间结果时避免了大量的磁盘 I/O。

增加并行度:由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,Hadoop将它们简单的通过串行执行衔接起来。Spark把不同的环节抽象为 Stage,允许多个 Stage既可以串行执行,又可以并行执行

避免重新计算:当 Stage中某个分区的 Task执行失败后,会重新对此 Stage调度,但在重新调度的时候会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。

相关文章

创维电视43H3测评怎么样

创维电视43H3测评怎么样

很多小伙伴在关注创维电视43H3怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

大疆DJI怎么样

大疆DJI怎么样

很多小伙伴在关注大疆DJI怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

小米积木质量好不好

小米积木质量好不好

很多小伙伴在关注小米积木怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

萤石(EZVIZ)C6c价格多少钱

萤石(EZVIZ)C6c价格多少钱

很多小伙伴在关注萤石(EZVIZ)C6c怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

有道英语听力宝复读机学习机英语语文学习提升神器好不好

有道英语听力宝复读机学习机英语语文学习提升神器好不好

很多小伙伴在关注有道英语听力宝复读机学习机英语语文学习提升神器怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品...

AppleWatch价格多少钱

AppleWatch价格多少钱

很多小伙伴在关注AppleWatch怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...