обрабатывать большой файл из s3 без проблем с памятью

Я пытаюсь прочитать большой файл 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. Как решается проблема с памятью?

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


person ManojP    schedule 01.05.2018    source источник
comment
извлечение происходит в памяти, когда вы читаете его по частям, в вашем коде его нет. В чем проблема с памятью? Один файл размером 100 МБ, сжатый gzip, не настолько велик, чтобы вызывать проблемы с памятью. Кроме того, ваш вопрос помечен apache-spark, но в самом вопросе об этом не упоминается.   -  person khachik    schedule 01.05.2018
comment
Я пытаюсь сделать это с помощью искры   -  person ManojP    schedule 01.05.2018
comment
Какая проблема с памятью?   -  person David Conrad    schedule 01.05.2018
comment
s3 составляет 22 МБ, когда я загружаю через браузер, он составляет около 650 МБ, но когда я использую java GZIPInputStream, он выходит из памяти после 3 ГБ, есть идеи?   -  person Aadam    schedule 08.11.2019


Ответы (1)


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

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

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

sparkContext.textFile("s3n://yourAccessKey:yourSecretKey@/path/")
person wandermonk    schedule 01.05.2018
comment
В этом случае количество операций ввода-вывода будет относительно высоким, потому что мы извлекаем файл на s3. Я до сих пор не понимаю первый вопрос, будет ли он обрабатывать мой файл в памяти или на диске? - person ManojP; 01.05.2018
comment
Когда вы загружаете файл с помощью Dataframe, это обработка в памяти. - person wandermonk; 01.05.2018