【问题标题】:Spark execution time vs number of nodes on AWS EMRSpark 执行时间与 AWS EMR 上的节点数
【发布时间】:2017-03-22 08:04:30
【问题描述】:

我是 Spark 的新手。我尝试在 Amazon EMR 上运行一个简单的应用程序(Python pi 近似值找到here),它有 1 个工作节点,第二阶段有 2 个工作节点 (m4.large)。每次完成任务所用的时间约为 25 秒。天真地,我期待 2 个节点能获得 1.5 倍的增益。我天真吗?正常吗?

【问题讨论】:

    标签: python amazon-web-services apache-spark execution-time


    【解决方案1】:

    这个问题很广泛,因此我的回答也很广泛,但你会明白的。

    更多的机器并不意味着总是更快的计算,尤其是在 Pi 近似值上。

    您不应忘记最终的瓶颈:网络 I/O、数据偏斜、昂贵的转换、分区等。

    这就是应该进行基准测试和监控的原因。此外,您可能正在计算 Spark 上下文需要设置和拆除的时间,这可能是您计算时间的很大一部分。

    加上一个 m4.large 是一个非常强大的机器用于此目的。如果您在 EMR 集群上设置 ganglia,您会注意到 spark 几乎没有使用其资源,这导致您在 EMR 上启动 Spark 应用程序时考虑调整。

    现在回答你的问题。 是的,对于您正在启动的应用程序,这种行为是正常的。

    这是我不久前写的关于 improving latency on a single node apache spark cluster 的帖子,它可能会为您提供有关此主题的更多信息。

    【讨论】:

    • 谢谢埃利亚斯。我知道数据局部性、数据格式和任务的复杂性是需要考虑的重要问题,但我认为 pi 近似的具体问题对于这些问题并不是很困难(例如:网络 I/哦?)。你怎么知道 Spark 建立和拆除所花费的时间?神经节会显示这种信息吗?
    • 我已经提到了网络瓶颈问题,但这不应该是你的情况,我相信你需要注意它。您可以测量连接到 ssh 的设置和撕裂,编写一个简单的应用程序来执行此操作,并且您可能对它需要多少有一个经验性的想法。那里没有魔法。
    【解决方案2】:

    让我们做一个简单的实验:

    from functools import reduce
    from operator import add
    import timeit
    
    # Taken from the linked example.
    
    n = 100000
    
    def f(_):
        x = random() * 2 - 1
        y = random() * 2 - 1
        return 1 if x ** 2 + y ** 2 < 1 else 0
    
    %timeit -n 100 reduce(add, (f(x) for x  in range(n)))
    

    我使用相当旧的硬件得到的结果:

    100 loops, best of 3: 132 ms per loop
    

    这应该是单个分区的预期处理时间,我们得到的值与任务调度时间相当。

    结论?您测量的是集群和应用程序延迟(上下文初始化、调度延迟、上下文拆除)而不是处理时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-14
      • 2015-10-06
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多