Все, мне нужно будет распределить некоторые вычисления (пока это только академические), и я планировал использовать для этого Spark.
Сейчас я провожу некоторые тесты, и они выглядят так:
У меня есть большой файл с переменными, и я суммирую их построчно, а затем вывожу результат. Я сделал версию без Spark, как показано ниже:
def linesum(inputline):
m=0
for i in inputline:
m=m+i
return m
with open('numbers.txt', 'r') as f:
reader = csv.reader(f, delimiter=';')
testdata = [list(map(float, rec)) for rec in reader]
testdata_out=list()
print('input : ' + str(testdata))
for i in testdata:
testdata_out.append(linesum(i))
testdata=testdata_out[:]
print('output : ' + str(testdata_out))
print(len(testdata))
print('OK')
и запустить в текстовом файле на 600 тыс. строк, затем
я сделал локальную установку искры и запустил следующий код:
if 'SPARK_HOME' not in os.environ:
os.environ['SPARK_HOME'] = 'C:\spark\spark-2.0.1-bin-hadoop2.7'
conf = SparkConf().setAppName('file_read_sum').setMaster('local[4]')
sc = SparkContext(conf=conf)
from pyspark.sql import SparkSession
def linesum(inputline):
m=0
tmpout=list()
tmpout=[]
for i in inputline:
m=m+i
return m
with open('numbers.txt', 'r') as f:
reader = csv.reader(f, delimiter=';')
testdata = [list(map(float, rec)) for rec in reader]
print('input : ' + str(testdata))
print(len(testdata))
testdata_rdd = sc.parallelize(testdata, numSlices=(len(testdata)/10000))
testdata_out = testdata_rdd.map(linesum).collect()
testdata=testdata_out[:]
print('output : ' + str(testdata_out))
print(len(testdata_out))
print('OK')
Результаты совпадают, но первый (без Spark) намного быстрее второго, я также сделал распределенную установку Spark на 4 ВМ и, как и ожидалось, результат еще хуже.
Я понимаю, что есть некоторые накладные расходы, особенно при использовании виртуальных машин, вопросы:
1) – Мои рассуждения верны? Является ли Spark подходящим инструментом для распространения такой работы? (на данный момент я только суммирую линии, но линии могут быть ОЧЕНЬ большими, а операции могут быть гораздо более сложными (подумайте здесь об оценке пригодности генетического программирования))
2) – Подходит ли мой код для распределения вычислений?
3) – Как увеличить скорость?