2016-08-16 1 views
0

У меня есть Alluxio на локальном с Spark, и я вставляю 1000 файлов в память Alluxio.
Тем не менее, чтение файла происходит очень медленно, время чтения файла из памяти Alluxio равно время чтения файла с диска. Я не understant почему ...Прочитайте несколько файлов с Spark java от 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(); 
         } 
        } 

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

Есть ли у кого-то идеал, почему читать так медленно?

ответ

2

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

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

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

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

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

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

+0

Спасибо, я лучше понимаю свои ошибки. Есть ли правило для выбора оптимального размера блока в соответствии с размером блока? – TiGi

0

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

Смежные вопросы