pySpark не может выполнить операцию сохранения, потому что выбор блокирует таблицу - PullRequest
0 голосов
/ 06 августа 2020

У нас очень часто выбирается таблица, и когда мы пытаемся сохранить dataFrame с опцией override, мы получаем ошибку, например:

py4j.protocol.Py4JJavaError: An error occurred while calling o364.save.
: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2730)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1618)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1549)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.truncateTable(JdbcUtils.scala:113)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:56)
at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:45)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:70)
at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:68)

Я уверен, что эта проблема не связана с wating_timeout и interative_timeout. Но, к сожалению, есть много вещей, которые могут вызвать эту проблему. Проблема в том, что когда мы пытаемся усечь таблицу, есть запросы на выбор, которые блокируют таблицу.

На данный момент это можно исправить, вручную удалив сеансы из БД, но это не решение, которое я хочу . Может кто знает, что я могу сделать, чтобы избежать такой ситуации?

1 Ответ

0 голосов
/ 15 августа 2020

После расследования я обнаружил, что сама проблема была очень глупой, поэтому иногда у нас были запросы SELECT одновременно с TRUNCATE, тогда оба запроса складывались с оператором wait metadata lock. И таймаут для этой ситуации по умолчанию был установлен на 50 сек. c.

...