2015-05-28 3 views
0

Я попытался добиться параллельной обработки изображений с использованием 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. Может ли кто-нибудь помочь мне, спасибо?

Считается, что размер изображения слишком мал для одного работника. Таким образом, искра предполагает, что один рабочий может справиться с этим и отправить все в один.

ответ

1

Одна машина имеет несколько ядер. Spark распределяет работу между вашими рабочими ядрами, потому что они могут выполнять работу параллельно. Если у вас 12 машин с 4 ядрами, у вас всего 48 ядер. Вы должны разделить изображение на 48 патчей, чтобы у каждого ядра было что-то делать. Если вы разделите воображение на 12 патчей, только 12 ядер будут иметь что-то делать, а остальные 36 ядер будут потрачены впустую.

Исключение - если ваш алгоритм обработки изображений выполняет свою собственную многопоточность. В этом случае вы должны начать работу с 1-ядерными рабочими на машинах. Рабочие будут собирать по 1 задание каждый, и вы можете делать многопоточность по своему усмотрению. Если вы запустите автономный Spark-кластер, вы можете установить --cores 1 на рабочих для этого. (См. documentation.)

+0

Hi Daniel. Спасибо за ваш добрый ответ. Думаю, ты понял. На самом деле, моя обработка изображений - это многопоточная программа, необходима сторонняя библиотека для поддержки, которая занимает много времени при каждом запуске, и я надеюсь, что она будет запускаться только на машине. Вот почему я хочу ограничить одно изображение патча на одной машине. Считаете ли вы, что set spark.cores.max - правильный способ решить эту проблему? – Zizhao

+0

Это зависит от того, как вы запускаете кластер. В автономном режиме это '--cores' или' SPARK_WORKER_CORES'. См. [Документация] (http://spark.apache.org/docs/latest/spark-standalone.html#starting-a-cluster-manual). –

Смежные вопросы