2017-01-21 5 views
1

Моя логика заключается в следующем.Spark streaming gc вопросы настройки

  1. Используйте createDirectStream, чтобы получить тему по типу журнала в Kafka.

  2. После перераспределения журнал обрабатывается с помощью различной обработки.

  3. Создайте единственную строку, используя combByKey для каждого типа журнала (используйте StringBuilder).

  4. И, наконец, сохранить в HDFS по типу журнала.

Есть много операций, которые добавляют строки, поэтому GC происходит часто.

Как лучше настроить GC в этой ситуации?

//////////////////////

Существуют различные логики, но я думаю, что проблема в этом combineByKey.

rdd.combineByKey[StringBuilder](
    (s: String) => new StringBuilder(s), 
    (sb: StringBuilder, s: String) => sb.append(s), 
    (sb1: StringBuilder, sb2: StringBuilder) => sb1.append(sb2) 
).mapValues(_.toString) 

ответ

0

Самое простое с наибольшей отдачей вы можете сделать с этим combineByKey выражением является размеру StringBuilder создавать так, чтобы он не должен расширять свой символьный массив подкладочный, как вы объединяете строковые значения в него; изменение размера увеличивает скорость распределения и уменьшает пропускную способность памяти путем копирования из старого в новый массив поддержки. В качестве гипотезы я бы сказал, выберем 90-й процентиль длины строки результирующих записей набора данных.

Вторая вещь, на которую нужно обратить внимание (после сбора некоторых статистических данных о промежуточных значениях), будет для вашей функции объединителя, чтобы выбрать экземпляр StringBuilder, который имеет место для размещения в другом, когда вы вызываете sb1.append(sb2).

Хорошо, что нужно позаботиться о том, чтобы использовать Java 8; он имеет оптимизации, которые имеют существенное значение, когда есть тяжелая работа над строками и строковыми буферами.

Последнее, но не менее важное, чтобы увидеть, где вы фактически проводите свои циклы. Эта рабочая нагрузка (за исключением любой дополнительной пользовательской обработки, которую вы делаете) не должна рекламировать много объектов (если они есть) для старого поколения, поэтому вы должны убедиться, что молодое поколение имеет достаточный размер и собирается параллельно.