我在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")
这也是一个包含55k行和850k列的数据集。
第一季度:尽管我增加了机器数量,但阅读速度没有明显提高。有什么问题或该怎么做才能使此过程更快?我应该增加节点数吗?
Q2:增加计算机数量是否对提高速度至关重要,还是对Spark而言重要的内存数量增加?节点,内存和速度之间是否存在性能图?
Q3:同样,针对hadoop的复制或移动命令运行非常缓慢。数据仅为100 GB。大公司如何处理TB级的数据?我无法捕捉到数据读取速度的提高。
感谢您的回答
答案 0 :(得分:4)
TL; DR Spark SQL(以及通用的Spark和其他共享相似体系结构和设计的项目)主要用于处理较长(相对)狭窄的数据。这与您的数据完全相反,在这种情况下,输入范围很广(相对)较短。
请记住,尽管Spark使用列格式进行缓存,但其核心处理模型仍会处理数据行(记录)。如果数据宽而短,则不仅限制了数据分发的能力,更重要的是,这导致了非常大的对象的初始化。这会对整体内存管理和垃圾回收过程(What is large object for JVM GC)产生不利影响。
在Spark SQL中使用非常广泛的数据会导致其他问题。就查询中使用的表达式而言,不同的优化器组件具有非线性复杂性。数据狭窄(<1K列)通常不是问题,但是很容易成为数据集更广泛的瓶颈。
此外,您使用的输入格式也不适合用于高性能分析和昂贵的读取器选项(模式推断)。
根据对数据的了解以及以后计划处理的方式,您可以尝试解决其中的一些问题,例如在读取时转换为长格式,或者直接使用稀疏表示形式对数据进行编码(如果适用)
除此之外,最好的选择是根据运行时统计信息仔细地进行内存和GC调整。
答案 1 :(得分:0)
不要使用inferSchema来代替这些手动提供的架构。花费时间来推断模式以获取海量数据。