NODE_LOCAL与RACK_LOCAL任务读取时间

时间:2016-03-18 10:09:30

标签: apache-spark apache-spark-sql

我正在研究locality如何影响spark sql作业中的任务读取时间。

测试:

  1. 为方便分析,我运行一个简单的SQL查询,执行表扫描并且不返回数据,任务需要时间读取块然后处理它。
  2. 查询:“CREATE TABLE target_table AS SELECT * FROM source_table WHERE column_name> 1000”。
  3. 选择性等于0(即column_name永远不会超过1000)
  4. 仅使用一个执行程序创建Spark上下文,以便同时观察NODE_LOCAL和RACK_LOCAL任务。
  5. 我的群集由7个节点组成,每个节点配备8个核心,每个机架在一个机架中连接在一起,并带有千兆位swithch(1千兆位点对点)
  6. 在谈到我的问题之前,我想提出一些假设:

    • 每个任务处理一个块
    • 首选数据位置,驱动程序首先分配NODE_LOCAL任务,然后分配RACK_LOCAL任务
    • 当分配了多个VCore时,任务最初在本地硬盘驱动器上竞争以获取其块,然后在其他节点上远程完成提取
    • 网络吞吐量优于硬盘驱动器吞吐量,因此在压力下硬盘驱动器是瓶颈

    最后问题:)

    如果在单个执行器中分配了多个VCores(例如8个),根据上述假设,我希望RACK_LOCAL任务的读取时间比NODE_LOCAL的读取时间快。

    Insted,根据我的测试,RACK_LOCAL读取时间平均比NODE_LOCAL慢几个百分点,如here所示。很显然,我错过了一些东西,但是我没有出现原因而四处乱窜。这是什么东西?

    链接的figure显示增加的VCores数量的NODE_LOCAL和RACK_LOCAL平均任务持续时间。

    谢谢, 洛伦佐

2 个答案:

答案 0 :(得分:4)

实际上我发现我的一个假设是不正确的:“网络吞吐量优于硬盘吞吐量因此在压力硬盘下是瓶颈”

千兆交换机的平均速度为0.8,这意味着两个节点以100MB / s的网络吞吐量链接在一起。 HDD通常可以150MB / s的速度读取。

由于在管道中执行远程读取和网络传输,NODE_LOCAL和RACK_LOCAL之间的微小差异是由于读取和传输之间发生的远程缓冲时间所致

答案 1 :(得分:2)

RACK_LOCAL表示正在从远程节点上的HDD读取块,然后通过网络传递。 NODE_LOCAL表示正在此节点上读取块,因此省略“网络”部分,因此NODE_LOCAL通常应该更快。