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

lkaoscv7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(468)

我在googlecomputeengine上创建了两个集群,这些集群读取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列的数据集。
问题1:虽然我增加了机器的数量,但阅读速度并没有明显提高。有什么不对,或者该怎么做才能让这个过程更快?我应该增加更多节点吗?
问题2:机器数量的增加对速度的提高很重要,还是内存量的增加对spark很重要?节点、内存和速度之间是否有性能图?
问题3:另外,hadoop的复制或移动命令运行速度非常慢。数据只有100GB。大公司如何处理数兆字节的数据?我无法捕捉到数据读取速度的提高。
谢谢你的回答

fcg9iug3

fcg9iug31#

不要使用inferschema而不是手动提供模式。spark花时间推断出巨大数据的模式。

hfwmuf9z

hfwmuf9z2#

热释光;drsparksql(以及spark和其他共享类似体系结构和设计的项目)主要用于处理长数据和(相对)窄数据。这与您的数据完全相反,在这里输入是宽的和(相对)短的。
请记住,尽管spark使用列格式缓存其核心处理模型处理数据行(记录)。如果数据宽而短,不仅限制了数据的分发能力,更重要的是,会导致非常大的对象的初始化。这对整个内存管理和垃圾收集过程(jvmgc的大对象)有不利影响。
在sparksql中使用非常广泛的数据会导致其他问题。不同的优化器组件在查询中使用的表达式方面具有非线性复杂性。如果数据很窄(<1k列),这通常不是问题,但是对于更宽的数据集,这很容易成为瓶颈。
此外,您使用的输入格式不太适合高性能分析和昂贵的读取器选项(模式推断)。
根据您对数据的了解以及以后处理数据的计划,您可以尝试解决其中的一些问题,例如,通过在读取时转换为长格式,或者直接使用一些稀疏表示(如果适用)对数据进行编码。
除此之外,您的最佳选择是基于运行时统计信息的仔细内存和gc调优。

相关问题