Endre konfigurasjon under kjøretid for PySpark

stemmer
2

Jeg prøvde å distribuere en trent Faiss-indeks til PySpark og gjøre et distribuert søk. Så hele prosessen inkluderer:

  1. Pre-prosess
  2. Last inn Faiss-indeksen (~ 15G) og gjør Faiss-søk
  3. Etterprosess og skriv til HDFS

Jeg angir CPUer per oppgave som 10 ( spark.task.cpus=10 ) for å gjøre flertrådssøk. Men trinn 1 og trinn 3 kan bare bruke 1 CPU per oppgave. For å bruke alle CPUer jeg vil stille inn spark.task.cpus=1 før trinn 1 og 3. Jeg har prøvd angitt metode for RuntimeConfig men det ser ut til at det har satt programmet mitt fast. Noen råd om hvordan du endrer config under kjøretid, eller hvordan du optimaliserer dette problemet?

Kodeeksempel:

def load_and_search(x, model_path):
    faiss_idx = faiss.read_index(model_path)
    q_vec = np.concatenate(x)
    _, idx_array = faiss_idx.search(q_vec, k=10)
    return idx_array


data = sc.textFile(input_path)

# preprocess, only used one cpu per task
data = data.map(lambda x: x)

# load faiss index and search, used multiple cpus per task
data = data.mapPartitioins(lambda x: load_and_search(x, model_path))

# postprocess and write, one cpu per task
data = data.map(lambda x: x).saveAsTextFile(result_path)
Publisert på 26/04/2020 klokken 10:00
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Alternativ idé: bruk mapPartitions for trinn 1 og 3. Bruk deretter et flerbehandlingsbasseng i hver arbeider for å kartlegge elementene i partisjonen parallelt. På denne måten kan du bruke all cpus som er tilordnet en arbeider uten å endre konfigurasjon (som jeg ikke vet om det i det hele tatt er mulig).

Pseudokode:

def item_mapper(item):
    return ...

def partition_mapper(partition):
    pool = mp.Pool(processes=10)
    yield from pool.imap(partition, item_mapper)

rdd.mapPartitions(partition_mapper)
Svarte 13/05/2020 kl. 10:59
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more