Spark本地模式 - 所有作业仅使用一个CPU核心

时间:2016-10-31 04:11:26

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

我们使用

在单个AWS EC2实例上以本地模式运行Spark Java

"local[*]"

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

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

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

任何建议都非常感谢。

由于

编辑:流程

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

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

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

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

5)在RDD上呼叫联合

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

7)调用.values()。map(新映射函数,它迭代提供的List中的所有项目,并根据需要合并它们以返回相同或更小长度的List

8)调用.flatMap()获取RDD

9)使用sqlContext从DomainClass

类型的平面地图创建DataFrame

10)使用DF.coalease(1).write()将DF作为gzip压缩写入S3。

1 个答案:

答案 0 :(得分:2)

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

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

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

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