2016-12-10 2 views
1

Я подсчитываю, сколько времени потребуется для завершения конкретной работы на Spark, в этом случае, сколько времени требуется, чтобы сохранить выходной RDD. Сохранение RDD связано с его сжатием.Интересное изменение производительности в бенчмаркинге Код искры

Что странно, так это то, что первое выполнение кода всегда медленнее по сравнению со вторым выполнением точно такой же части кода. Как это может быть?

Программа Спарк выглядит следующим образом:

JavaPairRDD<String, String> semisorted = wordsAndChar.sortByKey(); 

//First run 
long startTime1 = System.currentTimeMillis(); 
semisorted.saveAsTextFile("testData.txt" + "_output1", org.apache.hadoop.io.compress.DefaultCodec.class); 
long runTime1 = System.currentTimeMillis() - startTime1; 

//Second run 
long startTime2 = System.currentTimeMillis(); 
semisorted.saveAsTextFile("testData.txt" + "_output2", org.apache.hadoop.io.compress.DefaultCodec.class); 
long runTime2 = System.currentTimeMillis() - startTime2; 

sc.stop(); 

искровым представить --master местный [1] --class com.john.Test my.jar /пользователь/джон/Testdata. TXT/пользователь/John/testData_output

выход:

runTime1 = 126 сек

runTime2 = 82 сек

Как такое большое изменение может быть два (точно такие же) работу?

+0

RDDs ленивы. Первый запуск, вероятно, кэшируется в памяти для второго и последующих запусков. –

+0

Кроме того, два прогона на одной машине не так уж и важны: –

+0

@ cricket_007, «два прогона», потому что первый запуск занял слишком много времени. У меня даже было 3 и более трасс. В каждом случае первый запуск был самым медленным. Это просто «тестирование» - вышло надежное число из 1 машины, прежде чем сравнивать с чьей-то машиной. – nikk

ответ

3

Эти две работы не совпадают. Любая операция в случайном порядке, включая sortByKey, создает файлы в случайном порядке, которые служат неявной точкой кеширования.

  • Когда вы выполняете первое задание, он выполняет полную перетасовку и все предыдущие операции.

  • Когда вы выполняете второе задание, он может читать файлы в случайном порядке и выполнять только последний этап.

Вы должны увидеть skipped stages in the Spark UI, которые соответствуют этому поведению.

Существует также другой источник изменений, который может внести свой вклад, но его воздействие должно быть меньше. Многие объекты, связанные с контекстом в Spark, инициализируются лениво. Они будут инициализированы во время первой работы.

В общем, если вы хотите, чтобы контролировать работу, вы можете использовать:

  • Спарк интерфейс для ручного досмотра.
  • Spark REST API (/applications/[app-id]/stages/[stage-id] особенно полезен) или TaskListener для получения детальной статистики.

Вы также должны:

  • Выполните несколько прогонов и настроить результат для коррекции процесса инициализации.
  • unpersist объекты, если требуется.
  • Избегайте возможных путаниц (например, несколько заданий, выполняемых одним и тем же приложением, не являются независимыми и могут быть затронуты рядом факторов, таких как выселение кеша или GC).
+0

Итак, если это неотъемлемое поведение Spark, между заданиями, я хочу точно рассчитать и сравнить время выполнения этих двух частей кода. Как это сделать? Представьте себе во втором, вместо использования 'DefaultCodec', я использовал' SnappyCodec'. – nikk

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