2016-05-03 3 views
1

Я совершенно не знаком с Apache Spark, и я создал автономный кластер для запуска алгоритма сортировки для больших объемов данных (целые числа).Apache Spark самый дешевый способ запуска преобразования RDD

У меня есть работа, как я хочу. Ядро выглядит следующим образом:

JavaRDD<Integer> rdd = ctx 
       .parallelize(Collections.<Integer>emptyList(), PARTITIONS) 
       .mapPartitions(partition -> 
         ThreadLocalRandom 
           .current() 
           .ints(NUMBERS_PER_PARTITION, Integer.MIN_VALUE, Integer.MAX_VALUE) 
           .boxed() 

           .parallel() 
           .collect(Collectors.toList())) 
       .sortBy(x -> x, true, PARTITIONS); 

Это генерирует случайные числа в кластере, а затем сортирует их.

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

Есть ли способ, которым я могу вызвать .sortBy(), не дожидаясь завершения действия, которое его вызвало? А если нет, есть ли более дешевое действие, чем count()?

+0

если вы не хотите, чтобы все это пробежать вы можете просто сделать 'take'. Но если вы проводите бенчмаркинг, то весь набор данных должен быть запущен, я бы подумал. –

+0

Если я использую 'take (n)', будет ли отсортирован весь набор данных или только элементы 'n', которые я беру? Тот же вопрос касается 'first()'. Я не уверен, что вся коллекция сортируется при использовании этих методов. –

+1

Когда вы выполняете sortBy, а затем берете, тогда он предполагает, что вы берете N верхних элементов, поэтому он должен сортировать все, и только тогда вы можете взять некоторые из них. То же самое сперва. Но даже без сортировки первого и (относительно небольшого) результата приведет к тому, что первый раздел будет полностью обработан. – evgenii

ответ

1

сортировки ленивая искра преобразований
вы можете использовать один из не ленивых возвращаемых значений для вызова действия
Вы уже пробовали подсчет, который берет много времени
попробовать: первый() или взять (п)

Вот список ленивых/не ленивых действия

https://www.mapr.com/ebooks/spark/apache-spark-cheat-sheet.html