2017-02-16 12 views
2

Я новичок в Apache Spark.Что является лучшим или самым легким/эффективным/самым дешевым действием RDD для выполнения на Огромном/большом RDD в Apache Spark

Ниже приведен фрагмент кода, который демонстрирует мой пример кода.

val x = 5 
val arrayVal = (1 to 100000) 
val rdd1 = sc.parallelize(arrayVal, x)//Has Huge RDD of Min 10000 to 100000 
var rdd2 = rdd1.map(x => (x, x)) 
rdd2 = rdd2.cache() 
rdd2.count() 
val cartesianRDD = rdd2.cartesian(rdd2) 
var filteredRDD = cartesianRDD.filter(f => (f._1._1 < f._2._1)) 
filteredRDD = filteredRDD.repartition(x/2) 
rdd2 = rdd2.unpersist(false) 
filteredRDD.persist(StorageLevel.MEMORY_ONLY)//To avoid re-calculation 
filteredRDD.count() 

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

Я также пробовал rdd.take(1) и rdd.first(), который приводит к тому же.

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

Заранее спасибо.

+2

Какова ваша цель? любое действие по-прежнему будет делать декартес, что, вероятно, является самым трудоемким элементом. –

+0

Да. Я согласен о картезианском. Но после этого, когда он генерирует 100000 х 100000 записей. Подсчитайте на этом rdd держит ресурсы на большое время. Я просто хочу сократить время, которое Count или take приобретает для выполнения задачи. – Sam

+0

Здесь я не вижу сокращения. В любом случае, помимо декартова, передел также является дорогостоящим. Проблема в том, что любое действие, которое вы выполняете, должно будет получить все эти данные. Так будет происходить расчет. –

ответ

2

rdd.first() - самый дешевый, который вы можете иметь, поскольку он материализует только первый раздел.

Самое дешевое действие, которое материализует все разделы, равно rdd.forEachPartition{_=>_}.

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

Однако действие, которое вы предпринимаете, не повлияет на время, затраченное на предыдущие шаги. Если вы хотите уменьшить общее время, вам нужно оптимизировать другие вещи.