【问题标题】:Spark Local Mode - all jobs only use one CPU coreSpark 本地模式 - 所有作业仅使用一个 CPU 内核
【发布时间】:2017-03-13 04:48:01
【问题描述】:

我们在单个 AWS EC2 实例上以本地模式运行 Spark Java,使用

"local[*]"

但是,使用 New Relic 工具和简单的“顶部”进行分析表明,我们的 16 核机器中只有一个 CPU 内核用于我们编写的三个不同的 Java spark 作业(我们还尝试了不同的 AWS 实例但只使用了一个核心)。

Runtime.getRuntime().availableProcessors() 报告 16 个处理器和 sparkContext.defaultParallelism() 也报告了 16 个。

我查看了各种 Stackoverflow 本地模式问题,但似乎都没有解决问题。

非常感谢任何建议。

谢谢

编辑:过程

1) 使用 sqlContext 将使用 com.databricks.spark.csv 的压缩 CSV 文件 1 从磁盘 (S3) 读取到 DataFrame DF1。

2) 使用 sqlContext 将使用 com.databricks.spark.csv 的压缩 CSV 文件 2 从磁盘 (S3) 读取到 DataFrame DF2。

3) 使用 DF1.toJavaRDD().mapToPair(返回元组的新映射函数>) RDD1

4) 使用 DF2.toJavaRDD().mapToPair(返回元组的新映射函数>) RDD2

5) 在 RDD 上调用 union

6) 在联合的 RDD 上调用 reduceByKey() 以“按键合并”因此有一个元组>) 只有一个特定键的实例(因为相同的键出现在 RDD1 和 RDD2 中)。

7) 调用 .values().map(new mapping 函数,它遍历提供的 List 中的所有项目并根据需要合并它们以返回相同或更小的长度的 List

8) 调用 .flatMap() 获取 RDD

9) 使用 sqlContext 从 DomainClass 类型的平面地图创建 DataFrame

10) 使用 DF.coalease(1).write() 将 DF 作为 gzipped CSV 写入 S3。

【问题讨论】:

  • 你的数据集中有多少个分区?如果您只有一个,您将无法从并行性中受益。
  • 嗨蒂姆。谢谢回复。我正在使用 Spark CSV 将两个大型 CSV 文件读入 Dataframe,然后将它们转换为 JavaRDD,并对这些 RDD 执行许多手动转换和合并操作,从而生成一个 Dataframe。我再次使用 SparkCSV 写入磁盘。我不确定在这个过程中我可以在哪里手动指定分区?谢谢
  • 您会自动获取分区,因此每 32M 应该有 1 个(在 NFS 文件系统上)或每 128M 应该有 1 个(在 HDFS 上)。听起来你肯定有更多的东西。你看过 Spark 进度条吗?您的操作可能不受 CPU 限制,而是 IO 或网络限制。
  • 如果您可以将整个 DAG 发布到问题中,可能会更容易调试。
  • spark 进度条大部分时间都在[Stage 4:=============================> (1 + 1) / 2] 的 50% 处花费,进度条在多个小时内都没有移动。

标签: java amazon-web-services apache-spark amazon-ec2


【解决方案1】:

我认为您的问题是您的 CSV 文件已压缩。当 Spark 读取文件时,它会并行加载它们,但它只能在文件编解码器是可拆分的情况下执行此操作*。纯(非压缩)文本和镶木地板是可拆分的,以及基因组学(我的领域)中使用的bgzip 编解码器。您的整个文件最终都在一个分区中。

尝试解压缩 csv.gz 文件并再次运行。我想你会看到更好的结果!

  • 可拆分格式意味着,如果给定一个任意文件偏移量来开始读取,则可以在块中找到下一条记录的开头并对其进行解释。 Gzip 文件不可拆分。

编辑:我在我的机器上复制了这种行为。在 3G 压缩文本文件上使用 sc.textFile 会产生 1 个分区。

【讨论】:

  • 嗨蒂姆。谢谢!这是一个明显的改进——我看到 100% 的 CPU 在一段时间内下降到 6% 左右,并且状态在[Stage 4:======================================================>(135 + 2) / 137] 上停留了很长时间,内存保持在 92% 不变,磁盘 IO 和网络 IO 为 0。(编写压缩的 CSV 也会有同样的性能问题吗?)谢谢
  • 调用coalesce(1).write(... 意味着您正在强制 1 个任务(1 个核心)完成整个写入步骤。删除合并并尝试并行写入非压缩文件 - 这可能是导致您冻结的原因。
  • 这是否解决了您的问题?
  • 在不使用 coalesce(1) 且不写入压缩文件的情况下,它会更快地进入第 5 阶段。但它现在在[Stage 5:======================================================>(135 + 2) / 137] 末尾“卡住”了很长时间,磁盘和网络 IO 为 0%,内存使用率为 87%,CPU 为 12%。谢谢
  • 您可以编辑您发布的管道以反映您的新执行模型吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2018-10-22
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多