【问题标题】:flink impala jdbc insert is slowflink impala jdbc插入很慢
【发布时间】:2021-06-17 06:04:52
【问题描述】:

目前,我们在 flink 作业中遇到一些性能问题,使用 jdbc 以每小时将大约 100 万条数据插入 到 Kudu 表使用 impala jdbc。

我们已经尝试增加参数

JdbcExecutionOptions.builder()
    .withBatchSize(1000)
    .withBatchIntervalMs(200)
    .withMaxRetries(3)
    .build()

检查点间隔为 10 秒,检查点超时为 10 分钟,但没有结果。 我们还尝试将并行度从 3 增加到 6,但也不起作用。

我们也尝试将 BatchSize 增加到 10000,但我们遇到了错误

org.apache.flink.connector.jdbc.internal.JdbcBatchingOutputFormat [] - JDBC executeBatch error, retry times = 0
java.sql.SQLException: [Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: Exceeded the statement exp
ression limit (250000)
Statement has 720000 expressions.

我们能得到的最好结果是 1500 条记录/分钟,参数为

JdbcExecutionOptions.builder()
    .withBatchSize(200)
    .withBatchIntervalMs(50)
    .withMaxRetries(3)
    .build()

检查点间隔 3 秒,检查点超时 10 分钟。

我们可以使用其他参数来获得更好的这种情况吗?

谢谢,

【问题讨论】:

    标签: jdbc apache-flink impala


    【解决方案1】:

    我不知道确切的配置 flink,所以请提供完整的详细信息。最常见的错误是由于 URL 中缺少 rewriteBatchedStatements=true。这是因为 JDBC 将发送 1000 个单个插入语句,而不是 1 个由 1000 个插入语句组成的语句。

    【讨论】:

    • 嗨 Viet,正如我们在 flink 日志中看到的,默认情况下 flink 似乎已经发送了单个插入查询。如果我们尝试将 Batch Size 的参数设置得太大,则会出现错误errorMessage:AnalysisException: Exceeded the statement exp ression limit (250000) 我们正在 3 台服务器上运行 flink,从纱线池中分配了 64cpu 和 320gb。
    • 就像我说的那样,即使 flink 缓冲和批处理您的查询并将它们发送到数据库,数据库也没有意识到它必须批处理,所以您的数据库必须有来自 Flink 的指示,例如像这样:url=jdbc:mysql://localhost:3306/my_db?rewriteBatchedStatements = true。 “超出了语句表达式限制 (250000) 语句有 720000 个表达式。” => 这意味着你的每一条语句都执行了太多的表达式,太长了……例如:SELECT * FROM table_name WHERE ... IN (~250000 value)……
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多