Я пытаюсь обработать набор данных, который составляет приблизительно 2 тб, используя кластер с 4,5 тб оперативной памяти. Данные находятся в паркетном формате и изначально загружаются в фреймворк данных. Затем подмножество данных запрашивается и преобразуется в RDD для более сложной обработки. Первым этапом этой обработки является mapToPair для использования каждого идентификатора строк в качестве ключа в кортеже. Затем данные проходят через операцию combByKey для группировки всех значений с одним и тем же ключом. Эта операция всегда превышает максимальную память кластера, и работа в конечном итоге терпит неудачу. Хотя это перетасовка, есть много сообщений «проливать память на диск». Мне интересно, должны ли я сначала разбивать данные таким образом, чтобы все строки с одним и тем же идентификатором находились в одном и том же разделе, если ему нужно было бы перетасовать и выполнить правильно.Оптимизация Spark combinationByKey
Для начальной загрузки я использую:
sqlContext.read().parquet(inputPathArray).repartition(10000, new Column("id"));
Я не уверен, если это правильный способ разбить dataframe так, что это мой первый вопрос выше правильно.
Мой следующий вопрос в том, что, когда я иду от dataframe к РДД с помощью:
JavaRDD<LocationRecord> locationsForSpecificKey = sqlc.sql("SELECT * FROM standardlocationrecords WHERE customerID = " + customerID + " AND partnerAppID = " + partnerAppID)
.toJavaRDD().map(new LocationRecordFromRow()::apply);
является схема разделов из dataframe сохранившейся или мне нужно разметить после выполнения mapToPair с помощью:
rdd.partitionBy и передача в пользовательский HashPartitioner, который использует хэш поля ID.
Моя цель состоит в том, чтобы уменьшить перетасовку при выполнении окончательного combByKey, чтобы не допустить нехватки памяти и сбоя в работе. Любая помощь будет принята с благодарностью.
Спасибо, Натан
Функция слияния просто добавляет значения в список, поэтому в конце у меня есть сопоставление клавиш со списком значений. Какая функция была бы наиболее подходящей в этом случае? Как вы примените комбинацию по ключу напрямую? –
ОК, так это просто другая группаByKey? – zero323
Если да, см. Обсуждение ниже http://stackoverflow.com/a/37580350/1560062 и http://stackoverflow.com/q/37189802/1560062 – zero323