gziped文件的RDD到"未压缩"数据帧

时间:2016-11-11 12:03:24

标签: apache-spark pyspark

我有一堆压缩文本文件,每行包含一个JSON对象。简化我的工作流程如下:

{{1}}

现在,代码工作正常。一旦数字文件无法在执行程序之间平均分配,就会出现问题。

据我所知,因为spark不提取文件然后将行分发给执行程序,而是每个执行程序都获取一个文件。

例如,如果我有5个文件和4个执行程序,则前4个文件并行处理,然后是第5个文件。

因为第5个没有与其他4个并行处理,并且不能在4个执行器之间进行划分,所以它与前4个一起花费的时间相同。

这发生在该计划的每个阶段。

有没有办法将这种分区的RDD转换为RDD或不是的数据帧?

我使用的是python 3.5和spark 2.0.1

1 个答案:

答案 0 :(得分:2)

Spark操作分为可以并行完成的任务或工作单元。关于sc.textFile

,您需要了解一些事项
  1. 如果你正在加载多个文件,那么每个文件至少会得到1个任务。
  2. 如果您正在加载gzip压缩文件,那么每个文件最多只能获得1个任务。
  3. 基于这两个前提,您的用例将在每个文件中看到一个任务。关于任务/核心比率如何影响挂钟时间你是完全正确的:在4个核心上运行5个任务将花费与4个核心上的8个任务大致相同的时间(尽管不完全,因为存在落后者并且第一个核心完成将承担第5项任务。)

    根据经验,您的Spark群集中每个核心应该有大约2-5个任务才能看到良好的性能。但是如果你只有5个gzip文本文件,你就不会看到这个。如果你在下游做了很多工作,你可以尝试重新分区你的RDD(它使用一些有点昂贵的shuffle操作):

    repartitioned_string_json = string_json.repartition(100, shuffle=True)