2016-09-05 3 views
1

Я пытаюсь координировать выполнение графического процессора на Spark-кластере. Чтобы достичь этого, мне нужно, чтобы каждая задача/раздел использовала только один графический процессор для каждой системы. Каждая система имеет 4 графических процессора, и самым простым способом, который я нашел для этого, является создание mapPartitionsWithIndex() на rdd с данными, а затем использование индекса в качестве слота gpu.Как назначение индексов для узлов работает в Spark с mapPartitionsWithIndex()?

Вопрос в том, могу ли я полагаться на индексы, которые всегда должны быть назначены для рабочих узлов? Есть ли какая-либо документация, которая ссылается на это?

Быстрый пример:

from pyspark import SparkContext 
from pyspark.sql import SQLContext 

sc = SparkContext(appName="sample") 
sqlContext = SQLContext(sc) 

def print_partition_info(idx, part): 
    print "Index: {} - Partition data: {}".format(idx, part) 
    for p in part: 
     yield p 

data = [1,1,1,2,2,2, 20, 30, 40, 100] 
partitions = 4 
rdd = sc.parallelize(data, partitions) 
# rdd = rdd.coalesce(len(partition_keys)) 
rdd2 = rdd.mapPartitionsWithIndex(print_partition_info) 

Позволяет делать вид распечаток работать действие на rdd2 является

Index: 0 - Partition data: [1,1] 
Index: 1 - Partition data: [1,2] 
Index: 2 - Partition data: [2,2] 
Index: 3 - Partition data: [20,30,40,100] 

Когда эти разделы будут разослал работникам (скажем 2 рабочих), будет всегда быть в порядке, как и в ...
работника 1 перегородку = 1, 2
работника 2 перегородки = 3, 4

Расширяясь на том, что разделы будут всегда упорядочены, скажем, кластер из 10 или 50 узлов?

Наконец вот слайд, который, кажется, поддерживает эту технику:

enter image description here slides - check #52

ответ

0

Короткий ответ: Нет. В В кластере RessourceManager (НИТИ большую часть времени) будет использовать работника, если он доступен, и это не всегда так, когда ваша система многопользовательская, или если вы уже начали работу в подмножестве своего кластера. Таким образом, вы не можете связать работника с индексом.

Таким образом, я уверен, что индекс 0 будет привязан к первому разделу в ваших данных и так далее. Эксперт исправит меня, если я ошибаюсь.

+0

Я собирался добавить свой собственный ответ, так как увидел эту технику, используемую кем-то еще для вычисления графического процессора на Spark, но не добрался до нее, так как я все еще тестирую ее, и я использую только автономную Spark кластер. Но из моего тестирования до сих пор mapPartitionsWithIndex всегда присваивает индексы каждому узлу. Доступный первый узел по-прежнему будет выбран, но они всегда остаются в порядке, таким образом, кластер с 10 системами может назначить GPU в каждой системе с индексом% gpu_count. Я скоро отправлю ссылку. – alfredox

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