обрабатывать большие файлы из s3 без проблем с памятью - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь прочитать большой файл CSV из S3. Мой размер файла составляет 100 МБ в формате GZip, который мне нужно распаковать, а затем прочитать данные CSV.

ТАК Я нашел ниже ответ для того же и ниже фрагмента кода сделать свое дело.

        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. Как это решает проблему с памятью?

При использовании spark требуется больше времени, и я не уверен, как обработать gz-файл в spark.

1 Ответ

0 голосов
/ 01 мая 2018

Я думаю, вы должны сначала разархивировать файлы GZipped, а затем прочитать каждый текстовый файл или разархивированный каталог, используя контекст spark. Поскольку Apache Spark использует API Hadoop FS для чтения ваших файлов на S3, чтобы воспользоваться преимуществами распределенной обработки, вы должны разархивировать их.

Для MapReduce, если вам нужно разделить сжатые данные, форматы BZip2, LZO, and Snappy можно разделить, а GZip - нет.

После того, как ваши данные распакованы, вы можете использовать SparkContext для чтения файлов, как показано ниже

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