Как бороться с «не удалось выполнить трансляцию через 300 секунд»?

#palantir-foundry #foundry-code-workbooks

#palantir-foundry #foundry-code-workbooks

Вопрос:

Я пытаюсь заставить сборку работать, и один из этапов периодически завершается ошибкой со следующей ошибкой:

 Could not execute broadcast in 300 secs. You can increase the timeout for broadcasts via spark.sql.broadcastTimeout or disable broadcast join by setting spark.sql.autoBroadcastJoinThreshold to -1
  

Как мне справиться с этой ошибкой?

Ответ №1:

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

Из официальной документации Spark (http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables ):

Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks. They can be used, for example, to give every node a copy of a large input dataset in an efficient manner. Spark also attempts to distribute broadcast variables using efficient broadcast algorithms to reduce communication cost.

По моему опыту, время ожидания трансляции обычно возникает, когда один из входных наборов данных плохо разделен. Вместо отключения трансляции я рекомендую вам посмотреть на разделы ваших наборов данных и убедиться, что они разделены правильно.

Эмпирические правила, которые я использую, заключаются в том, чтобы взять размер вашего набора данных в МБ и разделить на 100, и установить количество разделов равным этому числу. Поскольку размер блока HDFS составляет 125 МБ, мы хотим разделить файлы примерно на 125 МБ, но поскольку они не разделяются идеально, мы можем разделить на меньшее число, чтобы получить больше разделов.

Главное, что очень маленькие наборы данных (~ <125 МБ) находятся в одном разделе, так как сетевые издержки слишком велики! Надеюсь, это поможет.