Я совершенно не знаком с 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()
?
если вы не хотите, чтобы все это пробежать вы можете просто сделать 'take'. Но если вы проводите бенчмаркинг, то весь набор данных должен быть запущен, я бы подумал. –
Если я использую 'take (n)', будет ли отсортирован весь набор данных или только элементы 'n', которые я беру? Тот же вопрос касается 'first()'. Я не уверен, что вся коллекция сортируется при использовании этих методов. –
Когда вы выполняете sortBy, а затем берете, тогда он предполагает, что вы берете N верхних элементов, поэтому он должен сортировать все, и только тогда вы можете взять некоторые из них. То же самое сперва. Но даже без сортировки первого и (относительно небольшого) результата приведет к тому, что первый раздел будет полностью обработан. – evgenii