Я новичок в Spark, и я пытаюсь реализовать некоторый итеративный алгоритм кластеризации (максимизация ожиданий) с помощью центроида, представленного моделью Маркова. Поэтому мне нужно делать итерации и присоединяться.
Одна из проблем, которые я испытываю, заключается в том, что каждый рост времени итераций экспоненциально. После некоторых экспериментов я обнаружил, что при выполнении итераций ему нужно было сохранить RDD, который будет использоваться повторно на следующей итерации, иначе каждая итерационная искра создаст план выполнения, который будет пересчитывать RDD с самого начала, тем самым увеличивая время вычисления.
init = sc.parallelize(xrange(10000000), 3)
init.cache()
for i in range(6):
print i
start = datetime.datetime.now()
init2 = init.map(lambda n: (n, n*3))
init = init2.map(lambda n: n[0])
# init.cache()
print init.count()
print str(datetime.datetime.now() - start)
Результаты в:
0
10000000
0:00:04.283652
1
10000000
0:00:05.998830
2
10000000
0:00:08.771984
3
10000000
0:00:11.399581
4
10000000
0:00:14.206069
5
10000000
0:00:16.856993
Таким образом, добавление кеша() помогает и время итерации становиться постоянным.
init = sc.parallelize(xrange(10000000), 3)
init.cache()
for i in range(6):
print i
start = datetime.datetime.now()
init2 = init.map(lambda n: (n, n*3))
init = init2.map(lambda n: n[0])
init.cache()
print init.count()
print str(datetime.datetime.now() - start)
0
10000000
0:00:04.966835
1
10000000
0:00:04.609885
2
10000000
0:00:04.324358
3
10000000
0:00:04.248709
4
10000000
0:00:04.218724
5
10000000
0:00:04.223368
Но когда вы входите в итерацию, проблема возвращается. Вот простой код, демонстрирующий проблему. Даже создание кеша при каждой трансформации RDD не решает проблему:
init = sc.parallelize(xrange(10000), 3)
init.cache()
for i in range(6):
print i
start = datetime.datetime.now()
init2 = init.map(lambda n: (n, n*3))
init2.cache()
init3 = init.map(lambda n: (n, n*2))
init3.cache()
init4 = init2.join(init3)
init4.count()
init4.cache()
init = init4.map(lambda n: n[0])
init.cache()
print init.count()
print str(datetime.datetime.now() - start)
И вот результат. Поскольку вы можете видеть, что время итерации растет экспоненциально: (
0
10000
0:00:00.674115
1
10000
0:00:00.833377
2
10000
0:00:01.525314
3
10000
0:00:04.194715
4
10000
0:00:08.139040
5
10000
0:00:17.852815
Я буду очень признателен за любую помощь:)