使用Spark的Gzip文件

时间:2015-01-04 16:53:47

标签: python gzip apache-spark pyspark

我有一个Spark作业,需要几千个文件作为输入,并从Amazon S3下载它们并在地图阶段处理它们,其中每个地图步骤返回一个字符串。我想将输出压缩到.tar.gz文件,然后将其上传到S3。一种方法是

outputs = sc.map(filenames).collect()
for output in outputs:
    with tempfile.NamedTemporaryFile() as tar_temp:
        tar = tarfile.open(tar_temp.name, "w:gz")
        for output in outputs:
            with tempfile.NamedTemporaryFile() as output_temp:
                output_temp.write(output)
                tar.add(output_temp.name)
        tar.close()

问题是outputs不适合内存(但它们适合磁盘)。有没有办法在地图阶段将输出保存到主文件系统?或者使用循环for output in outputs作为生成器,这样我就不必将所有内容加载到内存中了?

1 个答案:

答案 0 :(得分:1)

在Spark 1.3.0中,您将能够在Python中使用相同的Java / Scala方法toLocalIterator

拉取请求已合并:https://github.com/apache/spark/pull/4237

这是指定的文件:

    """
    Return an iterator that contains all of the elements in this RDD.
    The iterator will consume as much memory as the largest partition in this RDD.
    >>> rdd = sc.parallelize(range(10))
    >>> [x for x in rdd.toLocalIterator()]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    """

总而言之,它将允许您迭代输出,而不会将所有内容都收集到驱动程序中。

此致