2016-09-22 13 views
0

Являются ли следующие два кодовых блока эквивалентными по показателям?Оптимизация «множественной карты»() 'скальдинга

val input: TypedPipe[Person] = .... 
input 
    .map(_.getName) 
    .map(_.split(" ")) 

и ...

val input: TypedPipe[Person] = .... 
input 
    .map(_.getName.split(" ")) 

В частности, это Ошпаривание собирается оптимизировать код и выполнить одну карту только работу для обоих фрагментах выше во все времена? Что делать, если функции карты более сложны, чем getName/split?

IMO (и для более сложных функций карты) первый пример более читабельен. Однако я обеспокоен тем, что это может привести к менее эффективному исполнению.

+0

Кстати, я предполагаю, что если между функциями map() одна за другой (и без каких-либо других функций между ними), то они будут свернуты в один из них компилятором/оптимизатором и одним будет выполняться только работа с картой. Мне просто нужно доказательство этого! – Gevorg

ответ

2

Две функции не будут свернуты на уровне байт-кода/скаляса, но, что более важно, ошпаривание всегда сворачивает их в одну задачу карты в hadoop. Фактически все ваши картографические операторы (map, flatMap, filter и т. Д.) Будут свернуты в 1 задачу карты или даже в конце задачи уменьшения.

Итак, ваши два примера будут иметь одну и ту же DAG в хауопе, с той лишь разницей, что некоторые дополнительные служебные вызовы функций.

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

Я бы рекомендовал для чтения, если вы не сделали обширного профилирования и обнаружили, что это узкое место (я был бы очень удивлен).

+0

Есть ли способ «взглянуть» на DAG без необходимости запуска кода? Учитывая часть кода, я хотел бы знать, сколько карт/редукторов будет запущено без необходимости развертывания. – Gevorg

+0

Вы можете увидеть DAG, передав --tool.graph на задание ошпаривания, я думаю, что он выпишет в нем файл с DAG. Это не покажет вам числовых преобразователей/редукторов, поскольку это зависит от размера входных данных. –