我有两个映射器集群,具有以下配置,
cluster 1: hosted on aws, 3 nodes with 32g of memory/32 cores each
cluster 2: hosted on bare-metal servers, 8 nodes with 128g of memory/32 cores each
我在两个群集上运行以下一段pyspark代码
df=hc.sql("select * from hive_table")
df.registerTempTable("df")
df.cache().count()
for: 100times
result=hc.sql('select xxxx from df')
result.write.saveAsTable('some hive table', mode='append')
上面的代码在spark中提交了100个新作业(在纱线上运行)。在第一组中,整个操作在30分钟内完成,但在较大的第2组上,完成相同的操作需要90分钟。经过检查,我发现尽管每个作业几乎都需要大约相同的时间(集群2中的速度稍快),但每个作业之间的时间间隔比2要高得多。
可能的原因,
如何提交工作?
Cluster 1: /opt/mapr/spark/spark-1.6.1/bin/spark-submit --master yarn --deploy-mode client --num-executors 10 --executor-memory 10g --executor-cores 5 --driver-memory 10g --driver-cores 10 --conf spark.driver.maxResultSize="0" --conf spark.default.parallelism="100" --queue default
Cluster 2: /opt/mapr/spark/spark-1.6.1/bin/spark-submit --master yarn --deploy-mode client --num-executors 10 --executor-memory 80g --executor-cores 28 --driver-memory 25g --driver-cores 25 --conf spark.driver.maxResultSize="0" --conf spark.default.parallelism="100" --queue default
PS: 只粘贴部分代码。代码中还有其他模块。总的来说,集群2处理代码的速度比集群1快3倍,因此我不会认为问题与#general;#39;速度。
我的问题更具体到时间'工作之间。例如,上面的代码运行100个spark-sql作业,每个作业在集群2中平均需要2s,在集群1中需要5s。在集群2中,每个作业之间的时间与集群1相比要高得多。
答案 0 :(得分:0)
在您的伪代码中,我没有看到任何与驱动程序相关的操作(假设执行程序将数据保存到分布式FS)
请注意:
df.cache()
但似乎您没有使用缓存的df。看起来您正在尝试使用比可用内存更多的执行程序内存和内核。
在群集#1中,有3个节点具有32GB RAM,执行代码为:--num-executors 10 --executor-memory 10g
最好的情况是你将拥有9个执行器,每个执行器有10GB的RAM。每个节点上最多3个执行程序。我假设你每个节点只能执行2个执行程序(因为32GB的RAM超过2GB将用于纱线,开销等,因此剩下的不到29GB ==> 2个容器每个10GB)
==>集群#1将有6到9个执行程序
在群集#2中,有5个节点具有128GB RAM,执行代码为:--num-executors 10 --executor-memory 80g
最好的情况是你有5个执行器和80GB的RAM。每个执行器在一个节点上。
由于集群#1有更多的执行程序(即使它们更小),它可能会运行得更快(取决于你的应用程序)
减少集群#2中的执行程序内存和核心以及执行程序数量的增加应该可以提供更好的性能。