Чтение нескольких файлов с помощью Spark java из Alluxio происходит медленно

Я установил Alluxio локально со Spark и вставил 1000 файлов в память Alluxio.
Тем не менее, чтение файла происходит очень медленно. Время чтения файла из памяти Alluxio равно времени чтения файла с диска. Я не понимаю, почему.

File Name   Size    Block Size  In-Memory   Persistence State   Pin Creation Time   Modification Time
file1   54.73KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:278 08-16-2016 12:52:31:372
file2   54.73KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:377 08-16-2016 12:52:31:384
file3   54.72KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:386 08-16-2016 12:52:31:393
file4   54.71KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:394 08-16-2016 12:52:31:400
file5   54.72KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:401 08-16-2016 12:52:31:407
...

Я читаю данные с файловым API:

FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI(/partition0);
List<URIStatus> status = fs.listStatus(path);
for (int i=0; i<status.size(); i++)
                    {
                        path = new AlluxioURI(status.get(i).getPath());
                        if(fs.exists(path)==true)
                        {
                            FileInStream in = fs.openFile(path);
                            String file = "";

                            InputStreamReader ipsr = new InputStreamReader(in);

                            BufferedReader br=new BufferedReader(ipsr);
                            String line;
                            line=br.readLine();
                            while (line != null){
                                //System.out.println(line);

                                file = file + line;
                                line=br.readLine(); 
                            }

                            byte[] cfv = file.getBytes();
                            br.close();
                            // Close file relinquishing the lock
                            in.close();
                        }
                    }

Я пока не использую Spark, потому что тест на чтение раздела с 1000 файлами очень медленный... (Я хочу читать файл за разделом с помощью Spark в будущем).

Почему время чтения с использованием этого метода/библиотеки так медленно?


person TiGi    schedule 16.08.2016    source источник


Ответы (2)


В вашем примере есть несколько вещей, которые выглядят немного не так.

Во-первых, информация, которую вы показываете в своих файлах, предполагает, что файлы очень маленькие, около 50 КБ каждый, но вы настроили Alluxio на использование блоков по 512 МБ. Это потенциально означает, что вы передаете гораздо больше данных, чем вам на самом деле нужно. Поэтому следует учитывать одну вещь: если вы намерены в первую очередь иметь небольшие файлы, вам лучше настроить блок гораздо меньшего размера.

Во-вторых, то, как вы на самом деле читаете файл в своем тестовом примере, ужасно неэффективно. Вы читаете строку за строкой как строку, используя конкатенацию строк для создания файла, который вы затем конвертируете обратно в байты. Итак, вы переходите от байтов в памяти к строкам, а затем обратно к байтам. Кроме того, используя конкатенацию строк, вы заставляете весь файл, прочитанный до сих пор, копироваться в дополнительную строку, которую вы читаете.

Обычно вы либо читаете файл построчно в StringBuilder/, записывая в другой Writer, либо читаете файл как байты в byte[]/, записывая в другой OutputStream, например. ByteArrayOutputStream, если вы хотите в конечном итоге получить byte[] и не знаете заранее размер.

Третье соображение — это то, где ваш код работает в вашем кластере. Даже если файлы находятся в памяти, они могут быть не в памяти на каждом узле кластера. Если вы читаете файлы с узла, где они еще не находятся в памяти, тогда их необходимо читать по сети, и в этот момент производительность снизится.

Последнее соображение касается кэширования файлов ОС. Если вы создали свои тестовые файлы, а затем сразу же запустили тест, эти файлы, вероятно, кэшируются в памяти операционной системой. В этот момент вы получите такую ​​же хорошую, если не лучшую производительность, как Alluxio, потому что кэширование осуществляется на уровне ОС. Если вы действительно хотите провести значимое сравнение, вам необходимо убедиться, что вы очищаете файловые кеши ОС перед запуском каких-либо файловых тестов.

person RobV    schedule 17.08.2016
comment
Спасибо, я лучше понимаю свои ошибки. Есть ли правило выбора оптимального размера блока в соответствии с размером блока? - person TiGi; 18.08.2016

После некоторого теста размер файла является основной проблемой во время чтения. Небольшие файлы могут увеличить время чтения в 20 и более раз. Размер блока также влияет на время чтения, он может увеличить время чтения примерно на 1%.

person TiGi    schedule 23.08.2016