【问题标题】:Spark csv reading speed is very slow although I increased the number of nodes尽管我增加了节点数,但 Spark csv 读取速度很慢
【发布时间】:2019-08-16 03:14:35
【问题描述】:

我在 Google Compute Engine 上创建了两个集群,这些集群读取 100 GB 数据。

第一组: 1 个主机 - 15 GB 内存 - 250 GB 磁盘 10 个节点 - 7.5 GB 内存 - 200 GB 磁盘

第二组: 1 个主机 - 15 GB 内存 - 250 GB 磁盘 150 个节点 - 1.7 GB 内存 - 200 GB 磁盘

我正在使用它来读取文件:

val df = spark.read.format("csv")
    .option("inferSchema", true)
    .option("maxColumns",900000)
    .load("hdfs://master:9000/tmp/test.csv")

这也是一个包含 55k 行和 850k 列的数据集。

Q1:虽然我增加了机器的数量,但我没有看到阅读速度有明显的提高。有什么问题或该怎么做才能使此过程更快?我应该增加节点吗?

Q2:对于 Spark 来说,机器数量的增加是重要还是内存量的增加重要?是否有节点、内存和速度之间的性能图?

Q3:hadoop 的复制或移动命令也运行得很慢。数据只有 100 GB。大公司如何处理 TB 级数据?我无法捕捉到数据读取速度的提高。

感谢您的回答

【问题讨论】:

  • 列的结构是什么?它们的结构相似吗?如果文件基本上是一个大矩阵,我可能会提供帮助。
  • 它只包含 1 或 0。我的意思是这是一个大矩阵。有没有简化的方法或某事。像那样?
  • 我从事一个名为 Hail(专为基因组学而构建)的项目,该项目建立在 spark 之上,旨在处理此类庞大的结构化矩阵。 github.com/hail-is/hail
  • 目前我们没有太多的基础设施来处理备用矩阵,所以如果您的矩阵非常稀疏,可能会导致效率低下。但我认为对这些数据的探索和计算应该很容易!

标签: scala csv apache-spark hadoop google-compute-engine


【解决方案1】:

TL;DR Spark SQL(以及一般的 Spark 和其他共享相似架构和设计的项目)主要用于处理长且(相对)窄的数据。这与您的数据完全相反,其中输入很宽且(相对)短。

请记住,尽管 Spark 使用列格式缓存,但其核心处理模型处理数据行(记录)。如果数据是宽而短的,它不仅限制了分布数据的能力,而且更重要的是,会导致非常大的对象的初始化。这会对整体内存管理和垃圾收集过程产生不利影响 (What is large object for JVM GC)。

在 Spark SQL 中使用非常广泛的数据会导致其他问题。就查询中使用的表达式而言,不同的优化器组件具有非线性复杂性。这通常不是数据狭窄(

此外,您使用的输入格式不太适合高性能分析和昂贵的阅读器选项(模式推理)。

根据您对数据的了解以及以后计划如何处理数据,您可以尝试解决其中的一些问题,例如在读取时转换为长格式,或直接使用一些稀疏表示(如果适用)对数据进行编码.

除此之外,您最好的选择是根据运行时统计数据仔细调整内存和 GC。

【讨论】:

    【解决方案2】:

    不要使用 inferSchema 而不是这些手动提供架构。 spark需要时间来推断海量数据的Schema。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多