代码之家  ›  专栏  ›  技术社区  ›  xiaodai

如何提高Sparklyr读取csv的性能?

  •  1
  • xiaodai  · 技术社区  · 7 年前

    我认为在csv文件中读取速度非常慢 sparklyr . 见MVE

    library(sparklyr)
    library(dplyr)
    
    conf <- spark_config()
    conf$spark.executor.memory <- "60GB"
    conf$spark.memory.fraction <- 0.9
    conf$spark.executor.cores <- 6
    conf$spark.dynamicAllocation.enabled <- "false"
    sc <- sparklyr::spark_connect(master = "local", config = conf)
    
    library(data.table)
    
    fwrite(data.table(
      id1 = sample(sprintf("id%03d",1:K), N, TRUE),      # large groups (char)
      id2 = sample(sprintf("id%03d",1:K), N, TRUE),      # large groups (char)
      id3 = sample(sprintf("id%010d",1:(N/K)), N, TRUE), # small groups (char)
      id4 = sample(K, N, TRUE),                          # large groups (int)
      id5 = sample(K, N, TRUE),                          # large groups (int)
      id6 = sample(N/K, N, TRUE),                        # small groups (int)
      v1 =  sample(5, N, TRUE),                          # int in range [1,5]
      v2 =  sample(5, N, TRUE),                          # int in range [1,5]
      v3 =  sample(round(runif(100,max=100),4), N, TRUE) # numeric e.g. 23.5749
    ), "a.csv")
    
    system.time(sparklyr::spark_read_csv(sc, "a", "a.csv"))
    

    我已经尝试增加可点燃的内存级别,但在500秒时读取速度太慢!这比 data.table::fread .

    有没有配置火花使其更快?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user6910411    7 年前

    这里至少有三个问题:

    • local 模式不是分布式的,甚至是并行的。它只使用一个本地线程。如果您只有一个节点可供使用,那么至少尝试增加可用线程的数量(可能超过可用核心的数量)。

      一般来说,单个JVM路径并不是最好的方法,尤其是在内存较大的情况下。即使您没有多个节点可供使用,您也可以使用伪不受信任的独立集群和并置的主节点和工作节点。

    • 您不为读卡器提供模式,需要模式推断(默认值为 infer_schema 参数)。如果你想避免这个开销,你应该 provide a schema .

    • 您急切地缓存数据(默认值为 memory 参数),这两者都是 expensive 很少有用。

    另外:

    • 如此高的价值 spark.memory.fraction 很可能会让垃圾收集器疯狂地填充旧的gen。一定要检查gc的时间,如果有异常高,请减少 spark.memory.fraction(火花记忆分数) 低于默认值(0.6),不增加。

    最后: