Ответ 1
Нет, порядок не сохраняется. Пример в spark-shell
:
scala> sc.parallelize(Seq(0->1, 0->2), 2).groupByKey.collect
res0: Array[(Int, Iterable[Int])] = Array((0,ArrayBuffer(2, 1)))
Порядок зависит от времени, поэтому он может варьироваться между прогонами. (В следующий раз я получил противоположный порядок.)
Что здесь происходит? groupByKey
работает, перераспределяя RDD с помощью HashPartitioner
, так что все значения для ключа заканчиваются в одном разделе. Затем он выполняет агрегацию локально на каждом разделе.
Перераспределение также называется "перетасовкой", поскольку строки RDD перераспределяются между узлами. Файлы тасования вытягиваются из других узлов параллельно. Новый раздел построен из этих частей в том порядке, в котором они поступают. Данные из самого медленного источника будут в конце нового раздела и в конце списка в groupByKey
.
(Данные, извлеченные из самого рабочего, конечно, быстрее всего. Поскольку здесь нет сетевой передачи, эти данные вытягиваются синхронно и, следовательно, поступают в порядке. (Кажется, по крайней мере.) Таким образом, чтобы воспроизвести мой эксперимент вам нужно как минимум 2 работника искры.)
Источник: http://apache-spark-user-list.1001560.n3.nabble.com/Is-shuffle-quot-stable-quot-td7628.html