从s3处理大文件而没有内存问题

时间:2018-05-01 02:32:00

标签: java apache-spark amazon-s3 gzipinputstream

我正在尝试从S3读取大型CSV文件。我的文件大小是100MB的GZip格式,我需要解压缩然后读取csv数据。

所以我在answer下面找到相同和更低的代码片段。

        S3Object fileObj = client.getObject(bucketName, repoPath);
        BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(fileObj.getObjectContent())));
        BufferedWriter fileWriter = new BufferedWriter(new FileWriter(new File("output.json")));

        String line = null;
        while ((line = reader.readLine()) != null) {
            //convert csv  data to json
            fileWriter.write(line +"\n");
        } 
        fileWriter.flush();
        fileWriter.close();

我对上面的代码有两个问题:

  1. 在本地系统临时目录/ JVM或S3上进行提取的位置?
  2. 它如何解决内存问题?
  3. 使用spark时,需要更多时间,我不知道如何在spark中处理gz文件。

1 个答案:

答案 0 :(得分:2)

我认为你应首先解压缩GZipped文件,然后使用spark context读取每个文本文件或解压缩的目录。因为,Apache Spark使用Hadoop FS API来读取S3上的文件,以利用分布式处理,你应该将它们解压缩。

对于MapReduce,如果您需要拆分压缩数据,BZip2, LZO, and Snappy格式可以拆分,但GZip不可拆分。

一旦您的数据被解压缩,您可以使用SparkContext来读取以下文件

sparkContext.textFile("s3n://yourAccessKey:yourSecretKey@/path/")