Spark csv 读取速度很慢,虽然我增加了节点数

Mel*_*pan 6 csv hadoop scala google-compute-engine apache-spark

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

集群 I:1 个主 - 15 GB 内存 - 250 GB 磁盘 10 个节点 - 7.5 GB 内存 - 200 GB 磁盘

集群 II: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")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢你的回答

zer*_*323 9

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

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

在 Spark SQL 中使用非常广泛的数据会导致其他问题。就查询中使用的表达式而言,不同的优化器组件具有非线性复杂性。这通常不是数据狭窄(< 1K 列)的问题,但很容易成为更宽数据集的瓶颈。

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

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

除此之外,您的最佳选择是基于运行时统计信息进行仔细的内存和 GC 调优。


小智 5

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