我有两个具有以下配置的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我正在两个集群上通过纱线运行下面的电火花代码
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')上述代码提交了100个新作业的火花(运行在纱线之上)。在群集1上,整个操作在30分钟内完成,而对于较大的集群2,则需要90分钟才能完成相同的操作。经过检查,我发现虽然每个作业花费的时间几乎相同(集群2中的时间稍微快一点),但每个作业之间的时间在2中比1中要高得多。
可能的原因,
我如何提交工作?
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 defaultPS:只粘贴代码的一部分。代码中还有其他模块。总的来说,集群2处理代码的速度比集群1快3x,所以我不认为“一般”速度有问题。
我的问题更具体的是工作之间的“时间”。对于ex,上面的代码运行100个spark作业,每个作业在集群2中平均占用2s,在集群1中运行5s。与集群1相比,集群2中每个作业之间的时间要长得多。
发布于 2017-01-26 07:36:16
在您的伪代码中,我没有看到任何与驱动程序相关的操作(假设执行者将数据保存到分布式FS中)
请注意:
df.cache(),但似乎没有使用缓存的df。看起来您正在尝试使用比可用的更多的执行器内存和内核。
在集群#1中,有3个具有32 In内存的节点,您的执行代码是:--num-executors 10 --executor-memory 10g
最好的情况下,您将有9个执行器,每个10 of的RAM。在每个节点上最多有3个执行者。我假设每个节点只能执行2个执行器(从32 2GB的RAM中,超过2GB的内存将用于纱线、开销等,因此,每个10 2GB的==> 2容器只剩下不到29 2GB)。
==>集群#1将有6到9个执行程序。
在集群2中,有5个具有128 In内存的节点,您的执行代码是:--num-executors 10 --executor-memory 80g
最好的情况是,您将有5个带有80GB RAM的执行器。一个节点上的每个执行器。
由于集群#1有更多的执行器(即使它们更小),所以它可能运行得更快(取决于应用程序)。
减少集群#2中的执行器、内存和核心,同时增加执行程序的数量,将提供更好的性能。
https://stackoverflow.com/questions/41868082
复制相似问题