【发布时间】:2023-11-02 03:41:01
【问题描述】:
我有一个集群,我执行wholeTextFiles,它应该会提取大约一百万个文本文件,总和约为10GB
我有一个 NameNode 和两个 DataNode,每个都有 30GB 的 RAM,每个有 4 个内核。数据存储在HDFS。
我没有运行任何特殊参数,而且这项工作需要 5 个小时才能读取数据。这是预期的吗?是否有任何参数可以加快读取速度(spark 配置或分区、执行程序的数量?)
我才刚刚开始,我以前从未需要优化工作
编辑:另外,有人能准确解释一下 wholeTextFiles 函数是如何工作的吗? (不是如何使用它,而是它是如何编程的)。对了解partition参数等很感兴趣。
编辑 2: 基准评估
所以我在wholeTextFile之后尝试了repartition,问题是一样的,因为第一次读取还是使用预定义的分区数,所以没有性能提升。加载数据后,集群的性能非常好......在处理数据(对于 200k 文件)时,我在整个文本文件中收到以下警告消息:
15/01/19 03:52:48 WARN scheduler.TaskSetManager: Stage 0 contains a task of very large size (15795 KB). The maximum recommended task size is 100 KB.
这会是表现不佳的原因吗?我该如何对冲?
此外,在执行 saveAsTextFile 时,根据 Ambari 控制台,我的速度为 19MB/s。使用 wholeTextFiles 进行读取时,我的速度为 300kb/s.....
似乎通过增加wholeTextFile(path,partitions) 中的分区数,我的性能会更好。但仍然只有 8 个任务同时运行(我的 CPU 数量)。我正在进行基准测试以观察极限...
【问题讨论】:
-
5 小时听起来很高。您是否尝试过使用较小的子集?在达到 100 万之前说 10K 或 100K 文件。其次,如果你不需要(文件名,内容)然后你压缩所有数据并使用.textFile读取。读取数据后,尝试在 RDD 上调用
repartition ( numPartitions )。您可以用值 8、16、32 等尝试numPartitions,看看它是否有所作为。你可以在这里查看实现github.com/apache/spark/blob/… -
我已经尝试了 200k 个文件,大约需要一个小时,所以估计听起来是线性的......我使用的是 wholeTextFiles,因为然后我会解析它们中的每一个以转换为 xml。我无法读取 textFile,因为它将逐行读取并且我无法再解析...除非我错了?
-
你试过
repartition吗?我要求尝试textFile的原因是查看 IO(read) 是否由于文件数量或wholeTextFiles的实现而变慢 -
首先,设置正确的执行参数而不是默认参数。我推荐
--num-executors 4 --executor-memory 12g --executor-cores 4,这会提高你的并行水平。其次,在 HDFS 上以这种方式存储数据确实很糟糕,在 sc.wholeTextFiles 之后您应该做的第一个任务是将它们保存到具有块压缩和 Snappy/gzip 编解码器的单个压缩序列文件中。计算中的瓶颈是您启动的线程数量和您读取的单独文件的数量(加载 NameNode) -
这里您可以找到如何保存在压缩序列文件中的示例:0x0fff.com/spark-hdfs-integration。大约 4 - 这只是一个假设,在我提供的配置中,您将有 4 个 JVM 进程,每个进程有 12GB 堆,每个进程将利用 4 个内核(并行运行 4 个 spark 任务),为您提供 16 个并行读取器线程
标签: scala hadoop optimization configuration apache-spark