我有两个mapr集群,配置如下,
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个新作业(运行在yarn之上)。在集群1上,整个操作在30分钟内完成,但是在集群2上(更大的集群),完成相同的操作需要90分钟。通过检查,我发现虽然每个作业所用的时间几乎相同(在集群2中稍微快一点),但是每个作业之间的时间在集群2中比在集群2中高出很多。
可能的原因,
驱动程序和执行程序节点之间的延迟?--我要进去了
Yarn客户机模式
低驱动器内存或我启动YarnSpark簇的方式是错误的?
如何提交作业?
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
附言:只粘贴了部分代码。代码中还有其他模块。总的来说,集群2处理代码的速度比集群1快3倍,所以我不认为“一般”速度有问题。
我的问题更具体地说是工作之间的“时间”。例如,上面的代码运行100个sparksql作业,每个作业在集群2中平均占用2个,在集群1中平均占用5个。与集群1相比,集群2中每个作业之间的间隔时间太长。
1条答案
按热度按时间rjee0c151#
在您的伪代码中,我没有看到任何与驱动程序相关的操作(假设执行器将数据保存到分布式fs)
请注意:
你呢
df.cache()
但是看起来你没有使用缓存的df。您的客户机配置似乎有问题。
看起来您正在尝试使用比可用的更多的执行器内存和内核。
在集群#1中,有3个节点具有32gb的ram,您的执行代码是:
--num-executors 10 --executor-memory 10g
最佳情况下,您将有9个执行器,每个执行器有10gb的ram。每个节点上最多有3个执行器。我假设每个节点只能执行2个executor(因为从32gb的ram来看,超过2gb的内存将用于Yarn、开销等,因此剩下的不到29gb==>每个10gb的2个容器)==>集群#1将有6到9个执行者
在集群#2中,有5个节点具有128gb的ram,您的执行代码是:
--num-executors 10 --executor-memory 80g
最佳情况下,您将有5个执行器和80gb的ram。一个节点上的每个执行器。因为集群#1有更多的执行器(即使它们更小),所以它可能运行得更快(取决于您的应用程序)
减少集群#2中的执行器内存和核心,同时增加执行器的数量,应该可以提供更好的性能。