Спасибо за все комментарии, это на самом деле мне очень помогло.Ошибка исходила от функции, где я генерирую токен.Эта функция вызывается из функции загрузки , описанной выше, и возвращает токен после анализа его как JSON.Иногда были ошибки тайм-аута или необработанное исключение, о которых я говорил выше.
Поэтому я вызываю функцию генератора токенов ( getToken () ) вне функция загрузки ( dl () ), поэтому вместо того, чтобы генерировать и анализировать новый, каждый раз, когда мы вызываем функцию загрузки, он генерируется один раз, а затем использует тот же токен длязагрузить количество файлов.
val token = getToken();
def dl: (String => String) = { fileUrl: String => {
val response: HttpResponse[String] = Http(fileUrl)
.header("Authorization", "Bearer " + token)
.asString;
try {
retry(4){
if (response.code != 200) {
throw new javax.xml.ws.http.HTTPException(response.code)
}
response.body;
}
} catch {
case e: javax.xml.ws.http.HTTPException => {
println("error HTTPException " + e + fileUrl);
"failed" + e;
}
}
}}
Еще один прием, который я буду использовать чаще для повышения производительности: Обработка большего числа исключений! Spark Scala может обрабатывать исключения самостоятельно, ноиногда это повышает производительность, если вы справляетесь с этим вручную.Например, в моем случае, рядом с HTTPException, я добавил исключение JSON-синтаксического анализатора, потому что scala не смог его обработать.
case e: spray.json.JsonParser$ParsingException => {
println("error JsonParser exception " + e );
"failed" + e;
}
Благодаря этим модификациям я улучшил время выполнения!Раньше он работал в течение 1,5 часов с 100 000 файлов.После этих изменений это занимает 15-20 минут !!