Я попытался добиться параллельной обработки изображений с использованием Spark. В отличие от обычной работы Spark с миллионами задач. Я хочу только разделить изображение на число рабочих (машин), которые у меня есть, и позволить одному работнику обрабатывать один патч изображения. Таким образом, один патч для изображений является одной задачей, если у меня есть 12 патчей изображений, у меня есть 12 задач. Вопрос заключается в том, как явно контролировать расписание задачи для каждого работника. Нынешняя ситуация случается, что если я распараллеливаю патчи изображения, они часто посылают несколько патчей одному или двум работникам и оставляют остальных неработоспособными. Я попытался установить системное свойство искры для управления spark.cores.max и spark.default.parallelism. Но это не помогает. Единственный способ отправить задачу различным работникам как можно более раздельно - это увеличить второй параметр SparkContext.parallelize - numSlices. Вот код:Как явно контролировать расписание задач Spark точно?
img = misc.imread('test_.bmp')
height, width = img.shape
divisions, patch_width, patch_height = partitionParameters(width, height, 2, 2, border=100)
spark = SparkContext(appName="Miner")
# spark.setSystemProperty('spark.cores.max','1')
spark.setSystemProperty('spark.default.parallelism','24')
broadcast_img = spark.broadcast(img)
start = datetime.now()
print "--------------------", divisions
# run spark
run = spark.parallelize(divisions, 24).cache()
print "--------------- RDD size: ", run._jrdd.splits().size()
result = run.map(lambda (x, y): crop_sub_img(broadcast_img.value, x, y, patch_width, patch_height, width, height)) \
.map(lambda ((x, y), subimg): fastSeg.process(subimg, x, y)) \
.collect()
img = cat_sub_img(result, width, height)
end = datetime.now()
print "time cost:", (end-start)
Как вы можете видеть, у меня только четыре патча, установленные в подразделениях. divisions - это список кортежей с x и y-образцом патча изображения. Только я установил numSlices на большое значение 24, которое намного превышает фактические задачи, которые у меня есть в подразделениях, теперь большинство рабочих используются. Но это кажется нецелесообразным. Если я установил значение 4, он отправит все задания только одному работнику! Должно быть какое-то время, чтобы контролировать, сколько задач принимает один рабочий. Я не знаком с ядром Spark. Может ли кто-нибудь помочь мне, спасибо?
Считается, что размер изображения слишком мал для одного работника. Таким образом, искра предполагает, что один рабочий может справиться с этим и отправить все в один.
Hi Daniel. Спасибо за ваш добрый ответ. Думаю, ты понял. На самом деле, моя обработка изображений - это многопоточная программа, необходима сторонняя библиотека для поддержки, которая занимает много времени при каждом запуске, и я надеюсь, что она будет запускаться только на машине. Вот почему я хочу ограничить одно изображение патча на одной машине. Считаете ли вы, что set spark.cores.max - правильный способ решить эту проблему? – Zizhao
Это зависит от того, как вы запускаете кластер. В автономном режиме это '--cores' или' SPARK_WORKER_CORES'. См. [Документация] (http://spark.apache.org/docs/latest/spark-standalone.html#starting-a-cluster-manual). –