spark常用调优参数
大数据主要学习哪些内容?
大数据主要学习哪些内容?
这是一个非常好的问题,作为一名IT从业者,同时也是一名教育工作者,我来回答一下。
大数据经过多年的发展,已经逐渐形成了一个比较庞大且系统的知识体系,整体的技术成熟度也已经比较高了,所以当前学习大数据技术也会有一个比较好的学习体验。
由于大数据涉及到的内容比较多,而且大数据技术与行业领域也有比较紧密的联系,所以在学习大数据的时候,既可以从技术角度出发,也可以立足行业来学习大数据。对于学生来说,可以从大数据技术体系来学习,而对于职场人来说,可以结合自身的行业和岗位任务来学习大数据。
不论是学生还是职场人,要想学习大数据都需要掌握以下几个基本内容:
第一:计算机基础知识。计算机基础知识对于学习大数据技术是非常重要的,其中操作系统、编程语言和数据库这三方面知识是一定要学习的。编程语言可以从Python开始学起,而且如果未来要从事专业的大数据开发,也可以从Java开始学起。计算机基础知识的学习具有一定的难度,学习过程中要重视实验的作用。
第二:数学和统计学基础知识。大数据技术体系的核心目的是“数据价值化”,数据价值化的过程一定离不开数据分析,所以作为数据分析基础的数学和统计学知识就比较重要了。数学和统计学基础对于大数据从业者未来的成长空间有比较重要的影响,所以一定要重视这两个方面知识的学习。
第三:大数据平台基础。大数据开发和大数据分析都离不开大数据平台的支撑,大数据平台涉及到分布式存储和分布式计算等基础性功能,掌握大数据平台也会对于大数据技术体系形成较深的认知程度。对于初学者来说,可以从Hadoop和Spark开始学起。
我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。
如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言,或者私信我!
如何管理Spark内存?
Spark内存管理
Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责创建SparkContext上下文,提交任务,task的分发等。Executor负责task的计算任务,并将结果返回给Driver。同时需要为需要持久化的RDD提供储存。Driver端的内存管理比较简单,这里所说的Spark内存管理针对Executor端的内存管理。
Spark内存管理分为静态内存管理和统一内存管理,Spark1.6之前使用的是静态内存管理,Spark1.6之后引入了统一内存管理。
静态内存管理中存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可以应用程序启动前进行配置。
统一内存管理与静态内存管理的区别在于储存内存和执行内存共享同一块空间,可以互相借用对方的空间。
Spark1.6以上版本默认使用的是统一内存管理,可以通过参数 设置为true(默认为false)使用静态内存管理。
一、具体细节
1、静态内存管理分布图
2、统一内存管理分布图
3、reduce 中OOM如何处理?
拉取数据的时候一次都放不下,放下的话可以溢写磁盘
1) 减少每次拉取的数据量
2) 提高shuffle聚合的内存比例
3) 提高Excutor的总内存
4、Shuffle调优
默认值:32k参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会溢写到磁盘。调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如64k,一定是成倍的增加),从而减少shuffle write过程中溢写磁盘文件的次数,也就可以减少磁盘IO次数,进而提升性能。在实践中发现,合理调节该参数,性能会有1%~5%的提升。默认值:48m参数说明:该参数用于设置shuffle read task的buffer缓冲大小,而这个buffer缓冲决定了每次能够拉取多少数据。调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数的大小(比如96m),从而减少拉取数据的次数,也就可以减少网络传输的次数,进而提升性能。在实践中发现,合理调节该参数,性能会有1%~5%的提升。默认值:3参数说明:shuffle read task从shuffle write task所在节点拉取属于自己的数据时,如果因为网络异常导致拉取失败,是会自动进行重试的。该参数就代表了可以重试的最大次数。如果在指定次数之内拉取还是没有成功,就可能会导致作业执行失败。调优建议:对于那些包含了特别耗时的shuffle操作的作业,建议增加重试最大次数(比如60次),以避免由于JVM的full gc或者网络不稳定等因素导致的数据拉取失败。在实践中发现,对于针对超大数据量(数十亿~上百亿)的shuffle过程,调节该参数可以大幅度提升稳定性。shuffle file not find taskScheduler不负责重试task,由DAGScheduler负责重试默认值:5s参数说明:具体解释同上,该参数代表了每次重试拉取数据的等待间隔,默认是5s。调优建议:建议加大间隔时长(比如60s),以增加shuffle操作的稳定性。默认值:0.2参数说明:该参数代表了Executor内存中,分配给shuffle read task进行聚合操作的内存比例,默认是20%。调优建议:在资源参数调优中讲解过这个参数。如果内存充足,而且很少使用持久化操作,建议调高这个比例,给shuffle read的聚合操作更多内存,以避免由于内存不足导致聚合过程中频繁读写磁盘。在实践中发现,合理调节该参数可以将性能提升10%左右。默认值:sort|hash参数说明:该参数用于设置ShuffleManager的类型。Spark 1.5以后,有三个可选项:hash、sort和tungsten-sort。HashShuffleManager是Spark 1.2以前的默认选项,但是Spark 1.2以及之后的版本默认都是SortShuffleManager了。tungsten-sort与sort类似,但是使用了tungsten计划中的堆外内存管理机制,内存使用效率更高。调优建议:由于SortShuffleManager默认会对数据进行排序,因此如果你的业务逻辑中需要该排序机制的话,则使用默认的SortShuffleManager就可以;而如果你的业务逻辑不需要对数据进行排序,那么建议参考后面的几个参数调优,通过bypass机制或优化的HashShuffleManager来避免排序操作,同时提供较好的磁盘读写性能。这里要注意的是,tungsten-sort要慎用,因为之前发现了一些相应的bug。默认值:200参数说明:当ShuffleManager为SortShuffleManager时,如果shuffle read task的数量小于这个阈值(默认是200),则shuffle write过程中不会进行排序操作,而是直接按照未经优化的HashShuffleManager的方式去写数据,但是最后会将每个task产生的所有临时磁盘文件都合并成一个文件,并会创建单独的索引文件。调优建议:当你使用SortShuffleManager时,如果的确不需要排序操作,那么建议将这个参数调大一些,大于shuffle read task的数量。那么此时就会自动启用bypass机制,map-side就不会进行排序了,减少了排序的性能开销。但是这种方式下,依然会产生大量的磁盘文件,因此shuffle write性能有待提高。默认值:false参数说明:如果使用HashShuffleManager,该参数有效。如果设置为true,那么就会开启consolidate机制,会大幅度合并shuffle write的输出文件,对于shuffle read task数量特别多的情况下,这种方法可以极大地减少磁盘IO开销,提升性能。调优建议:如果的确不需要SortShuffleManager的排序机制,那么除了使用bypass机制,还可以尝试将参数手动指定为hash,使用HashShuffleManager,同时开启consolidate机制。在实践中尝试过,发现其性能比开启了bypass机制的SortShuffleManager要高出10%~30%。
5、Shuffle调优设置
SparkShuffle调优配置项如何使用?
1) 在代码中,不推荐使用,硬编码。
new SparkConf().set(“”,”64”)
2) 在提交spark任务的时候,推荐使用。
spark-submit --conf –conf ….
3) 在conf下的配置文件中,不推荐,因为是写死后所有应用程序都要用。