Я новичок в Spark. Выполняя несколько примеров, чтобы попытаться получить представление о стойкости СДР, я столкнулся с тем, чего не понимаю. Рассмотрим два следующих эксперимента:
Эксперимент 1
Я начал с определения времени некоторых действий без использования постоянства.
np.random.seed(1)
numbers = sc.range(0, 10000000)
evens = numbers.filter(lambda x : x % 2)
t1 = time.time()
evens.collect()
t2 = time.time()
evens.collect()
t3 = time.time()
evens.count()
t4 = time.time()
print(t2 - t1)
print(t3 - t2)
print(t4 - t3)
Я запускал это несколько раз, и каждый раз получал что-то похожее на:
4.334701299667358
4.289132833480835
3.77268123626709
Затем я добавил строку evens.persist()
сразу после определения evens
. Некоторые типичные результаты для этого кода:
4.4880735874176025
0.7230954170227051
1.4762592315673828
Пока все хорошо. Первый collect()
занимал примерно одинаковое время в каждом случае, но второй collect()
и count()
занимал значительно меньше времени при работе с постоянным СДР. Все как и ожидалось.
Эксперимент 2
Затем я переключил первый collect()
на count()
. Не сохраняя, мой код был:
np.random.seed(1)
numbers = sc.range(0, 10000000)
evens = numbers.filter(lambda x : x % 2)
t1 = time.time()
evens.count()
t2 = time.time()
evens.collect()
t3 = time.time()
evens.count()
t4 = time.time()
print(t2 - t1)
print(t3 - t2)
print(t4 - t3)
Типичный вывод для этого кода:
4.011156320571899
4.720277786254883
3.8882973194122314
Но когда я добавляю evens.persist()
, я получаю вывод, подобный следующему:
5.5741260051727295
0.6982665061950684
1.5375416278839111
По некоторым причинам первый count()
занимает значительно больше времени при работе с постоянным СДР, чем с непостоянным СДР. Это сохранялось каждый раз, когда я запускал код.
Есть идеи, почему это так?