Помогает ли это сохранить данные между преобразованиями в Scala Spark? - PullRequest
0 голосов
/ 27 августа 2018

Один

Сначала я читаю твиты и анализирую их в классе дел с помощью карты в своей функции синтаксического анализа parseTweet:

val tweets = sc.textFile("/home/gakuo/Documents/bigdata/NintendoTweets").map(parseTweet)

Two

Затем я использую функцию для сопряжения RDD, в результате чего получается пара RDD вида (hashtags, likes) через карту внутри toPairRdd:

val pairedRDD = toPairRdd(tweets).persist()

Вопрос

После прочтения в моем СДР в ( one ) выше, поможет ли это сохранить его, как то, что в ( two ) является преобразованием?Я думаю, что поскольку оба являются ленивыми, то сохранение на самом деле является пустой тратой памяти.

Три

После вычисления pairRDD я хочу вычислить оценки для каждого хэштега: toScores использует reduceByKey

  val scores = toScores(pairedRDD).persist()

Вопрос

Я использую reduceByKey.Этот метод pairRDD приводит к тасованию?Я прочитал статью, в которой говорится:

"может произойти случайное перемешивание, когда результирующий СДР зависит от других элементов того же СДР или другого СДР. Cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey,reduByKey, комбинироватьByKey, отличный, пересечение, перераспределение, объединение, приводящее к тасованию. Чтобы избежать тасовок для этих видов операций, убедитесь, что преобразование следует тому же разделу, что и исходный СДР "

В той же статье также говоритсяreduceByKey следует тому же разделу, что и исходный СДР.

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

В вашем случае не требуется сохранение или кэширование, поскольку это однопроходный процесс.Вы должны знать, что Этапы созданы так, чтобы соединить как можно больше трансформаций перед тем, как перетасовать.У вас будет 2 здесь.

Если вы обрабатываете некоторые другие требования к данным с использованием pairedRDD, рекомендуется использовать persist.

Действия более актуальны в любом случае.

0 голосов
/ 29 августа 2018

Если у вас есть несколько действий, использующих один и тот же rdd, рекомендуется сохранить его.Я не вижу никаких действий до сих пор в вашем коде.Поэтому я не вижу причин для кэширования RDD.Persist / cache также лениво оценивается.

Persist / cache - не гарантируется, что данные будут сохранены в течение времени жизни выполнения, так как сохраняются в соответствии с алгоритмом LRU, который использовался в последнее время в последнее время и который сбрасывает данные на основе наименее используемого rdd.если память заполненаПри использовании команды persist необходимо помнить обо всех вещах.

Reducebykey - это большое преобразование, так как может произойти случайное перемешивание.Но прежде всего он сначала объединяет данные с ключом внутри раздела, а затем выполняет операцию сокращения.Так что это дешевле.Всегда избегайте groupbykey, где он перетасовывает данные напрямую, не объединяя данные с ключом в разделе.Пожалуйста, избегайте группового ключа при кодировании.

0 голосов
/ 27 августа 2018

Важно использовать persist (в mem / disk / обоих), когда у вас есть много действий, которые всегда выполняют количество одинаковых преобразований снова.И если это займет слишком много времени для пересчета снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...