Hadoop与Spark并行度设置问题(mr、spark任务提交参数的设置、spark-submit参数调优)

并行度的影响

合理的并行度,不能太小也不要过大。

并行度较小:
并发度小,执行效率低;(失去分布式计算的意义)

并行度过大:
资源申请上的劣势。导致ApplicationMaster在向yarn提交资源申请时不能做到数据本地化(分配执行任务的机器不是数据所在机器,yarn resourcemanager在分配资源时选择 数据本地、同机架、集群随机三种方式,优先级从前到后),甚至由于集群剩余资源不足而处于排队等待状态,申请资源时间成为整个任务执行时间的瓶颈;
每个task的初始化时间拖了任务执行时间的后腿(一个数据量小、处理逻辑简单的任务本身执行时间已经比大量task初始化所消耗时间小);

合理的并行度

任务的合理并行度取决于

集群的资源
一个合理的并行度,肯定是需要考虑到现有集群的可用资源,这个决定了你申请资源的上限。
集群的资源可以划分为两种:1、整个集群的资源;2、hdfs数据所在机器的资源情况。

任务处理的数据量、文件数
你要处理的数据量是你任务并行度大小的关键。
查看hdfs文件信息:
hadoop fsck /xxx/xxx/your_path
可以加 -files -blocks -racks参数查看目录下每个文件的明细信息:files:文件数;blocks:数据块数;racks:机架地址
blocks决定了读取数据时的并行度(一般读取task数等于block数)

数据处理的业务逻辑
io密集型 or cpu密集型
io密集型 —— 较小的并行度,可以尽可能保证数据的本地化或同机架,避免数据的网络传输;
cpu密集型 —— 偏向于更大的并行度(spark任务可以通过DAG、数据缓存等辅助优化手段)

总之,任务的并行度取决因素有很多,并且这些因素不是一成不变的,在任务调优的过程中,可以通过控制变量来多次尝试,选择出最理想的一个资源大小、任务的并行度大小

并行度的设置

spark并行度强转操作:

reparation/coalesce 两者区别参考:https://blog.csdn.net/zx_blog/article/details/100168367

hdfs文件数据读取时的并行度:

文件所占block数(一个block对应一个task)。

通过spark参数进行调整:

spark参数:spark.default.parallelism(可设置在sparkhome中全局配置文件中,或在代码sparkconf中进行设置)
spark sql的参数:spark.sql.shuffle.partition(spark sql中shuffle操作的并行度,如sql中join,group by等操作,默认为200)

spark shuffle算子中设置并行度: rdd.groupByKey(100)、rdd.leftjoin(secondRdd, 50)

mr任务,FileInputFormat的并行度:

并行度=fileSize / Math.max(minSize, Math.min(maxSize, blockSize)),默认minSize为1,maxSize为Long.MAXValue,所以默认并行度等于fileSize / blockSize
minSize和maxSize可通过mapreduce.input.fileinputformat.split.minsize、mapreduce.input.fileinputformat.split.maxsize进行调整;blockSize即hdfs的blockSize,可以通过
hdfs-site.xml中dfs.blocksize进行配置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章