Spark csv的读取速度非常慢,尽管我增加了节点数量



我在Google计算引擎上创建了两个集群,这些集群读取100GB的数据。

集群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")

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

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

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

Q3:此外,hadoop的复制或移动命令的工作速度非常慢。数据只有100 GB。大公司如何处理TB级的数据?我无法捕捉到数据读取速度的增长。

谢谢你的回答

TL;DRSpark SQL(以及通常的Spark和其他共享类似架构和设计的项目(主要用于处理长数据和(相对(窄数据。这与你的数据正好相反,你的数据输入范围很广,而且(相对(很短。

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

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

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

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

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

不要使用inferSchema,而是手动提供模式。spark需要花费时间来推断大量数据的Schema。

相关内容

最新更新